Nessun costruttore vuoto quando si crea un servizio


98

Sto lottando con questo errore:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): causato da: java.lang.InstantiationException: impossibile istanziare la classe com.example.localnotificationtest.ReminderService; nessun costruttore vuoto

Non capisco perché si verifica questo errore.

Sto cercando di visualizzare la notifica in un momento specifico e dopo aver cercato un momento ho trovato questa vecchia domanda su stackoverflow . Ho provato di tutto ma il mio codice dà errore.

Per favore aiutami a risolvere questo problema.

Ecco il mio codice 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);
        }
    };

}

ed ecco il mio codice 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);
    }

}

ed ecco il mio 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>

Non so dove sto sbagliando. Mi manca del codice?

Risposte:


221

Devi aggiungere un costruttore vuoto alla tua classe, cioè uno che non accetta argomenti:

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

Spiegazione dalla documentazione :

Il nameviene utilizzato per assegnare un nome al thread di lavoro.

NOTA : questo è applicabile solo al servizio intent.


9
Grassetto quel Costruttore senza argomenti
Pratik Butani

44

Se hai dichiarato il tuo servizio come classe interna / classe annidata , devi anche rendere statica la classe

Senza di ciò riceverai l'errore anche se il tuo costruttore è corretto

Spiegazione

Il motivo è che puoi solo istanziare le classi interne nel contesto della classe esterna, quindi dovresti prima creare un'istanza della classe esterna.

Dichiarare statica la tua classe interna la rende indipendente dalla sua classe esterna



Non so se sia documentato da nessuna parte, ma se vuoi istanziare classi interne non statiche, la classe esterna deve essere istanziata per prima. Ora, se avvii un servizio, l'istanza viene creata dal sistema, che non saprà che deve prima creare un'istanza dalla classe esterna, quindi andrà in crash. Ma l'errore è davvero fuorviante in quel caso. dare un'occhiata a stackoverflow.com/questions/70324/...
Marian Klühspies

32

Dichiarare un costruttore senza argomenti predefinito per IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.