Pas de constructeur vide lors de la création d'un service

98

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?

Pari
la source

Réponses:

221

Vous devez ajouter un constructeur vide à votre classe c'est-à - dire qui ne prend aucun argument:

public ReminderService() {
    super("ReminderService");
}

Explication de la documentation :

Le nameest utilisé pour nommer le thread de travail.

REMARQUE : cela s'applique uniquement au service d'intention.

chiuki
la source
9
Bold that Constructor sans argument
Pratik Butani
44

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

Explication

La raison en est que vous ne pouvez instancier des classes internes que dans le contexte de la classe externe, vous devez donc d'abord créer une instance de la classe externe.

Déclarer votre classe interne statique la rend indépendante de sa classe externe

Marian Klühspies
la source
Où est-ce documenté?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Je ne sais pas si elle est documentée quelque part, mais si vous voulez instancier des classes internes non statiques, la classe externe doit d'abord être instanciée. Maintenant, si vous démarrez un service, l'instance est créée par le système, qui ne sait pas qu'il doit d'abord créer une instance à partir de la classe externe, donc elle plantera. Mais l'erreur est vraiment trompeuse dans ce cas. jetez un oeil à stackoverflow.com/questions/70324/…
Marian Klühspies
32

Déclarer un constructeur sans argument par défaut pour IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}
ρяσѕρєя K
la source