Je lutte avec cette erreur:
08-08 11: 42: 53.179: E / AndroidRuntime (20288): Causé par: java.lang.InstantiationException: impossible d'instancier la classe com.example.localnotificationtest.ReminderService; pas de constructeur vide
Je ne comprends pas pourquoi cette erreur se produit.
J'essaie d'apparaître une notification à un moment précis et après avoir recherché un moment, j'ai trouvé cette vieille question stackoverflow . J'ai tout essayé mais mon code donne une erreur.
Veuillez m'aider à résoudre ce problème.
Voici mon code MainActivity:
public class MainActivity extends Activity {
int mHour, mMinute;
ReminderService reminderService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
reminderService = new ReminderService("ReminderService");
TimePickerDialog dialog = new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false);
dialog.show();
}
TimePickerDialog.OnTimeSetListener mTimeSetListener = new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker v, int hourOfDay, int minute) {
mHour = hourOfDay;
mMinute = minute;
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, Calendar.YEAR);
c.set(Calendar.MONTH, Calendar.MONTH);
c.set(Calendar.DAY_OF_MONTH, Calendar.DAY_OF_MONTH);
c.set(Calendar.HOUR_OF_DAY, mHour);
c.set(Calendar.MINUTE, mMinute);
c.set(Calendar.SECOND, 0);
long timeInMills = c.getTimeInMillis();
Intent intent = new Intent(MainActivity.this, ReminderService.class);
PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, intent, 0);
alarmManager.set(AlarmManager.RTC, timeInMills, pendingIntent);
}
};
}
et voici mon code ReminderService:
public class ReminderService extends IntentService {
public ReminderService(String name) {
super(name);
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 1, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Local Notification Ticker")
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
.setContentTitle("Local Notification")
.setContentText("This is content text.");
Notification n = builder.getNotification();
nm.notify(1, n);
}
}
et voici mon manifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.localnotificationtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="ReminderService"></service>
</application>
</manifest>
Je ne sais pas où je me trompe. Est-ce que je manque du code?
Si votre service est déclaré en tant que classe interne / classe imbriquée , vous devez également rendre la classe statique
Sans cela, vous obtiendrez l'erreur même si votre constructeur est correct
la source
Déclarer un constructeur sans argument par défaut pour IntentService
la source
Vous devez ajouter le constructeur sans argument par défaut à votre classe ReminderService . Ceci n'est ajouté implicitement que si vous n'écrivez pas votre propre constructeur (que vous avez). Voir ici: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
la source