Kein leerer Konstruktor beim Erstellen eines Dienstes

98

Ich habe mit diesem Fehler zu kämpfen:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Auslöser: java.lang.InstantiationException: Klasse com.example.localnotificationtest.ReminderService kann nicht instanziiert werden; kein leerer Konstruktor

Ich verstehe nicht, warum dieser Fehler auftritt.

Ich versuche, eine Benachrichtigung zu einem bestimmten Zeitpunkt anzuzeigen, und nachdem ich nach einer bestimmten Zeit gesucht habe, habe ich diese alte Stackoverflow-Frage gefunden . Ich habe alles versucht, aber mein Code gibt Fehler.

Bitte helfen Sie mir, dieses Problem zu lösen.

Hier ist mein MainActivity-Code:

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);
        }
    };

}

und hier ist mein ReminderService-Code:

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);
    }

}

und hier ist meine 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>

Ich weiß nicht, wo ich falsch liege. Fehlt mir ein Code?

Pari
quelle

Antworten:

221

Sie müssen Ihrer Klasse einen leeren Konstruktor hinzufügen, dh einen, der keine Argumente akzeptiert:

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

Erklärung aus der Dokumentation :

Mit namewird der Worker-Thread benannt.

HINWEIS : Dies gilt nur für Vorsatzdienste.

Chiuki
quelle
9
Mutig dieser Konstruktor ohne Argument
Pratik Butani
44

Wenn Sie Ihren Service als innere Klasse / verschachtelte Klasse deklariert haben , müssen Sie die Klasse auch statisch machen

Ohne das erhalten Sie den Fehler, auch wenn Ihr Konstruktor korrekt ist

Erläuterung

Der Grund dafür ist, dass Sie innere Klassen nur im Kontext der äußeren Klasse instanziieren können, sodass Sie zuerst eine Instanz der äußeren Klasse erstellen müssen.

Wenn Sie Ihre innere Klasse als statisch deklarieren, ist sie unabhängig von ihrer äußeren Klasse

Marian Klühspies
quelle
Wo ist das dokumentiert?
Ciro Santilli 法轮功 冠状 病 六四 事件 13
Ich weiß nicht, ob es irgendwo dokumentiert ist, aber wenn Sie innere nicht statische Klassen instanziieren möchten, muss die äußere Klasse zuerst instanziiert werden. Wenn Sie jetzt einen Dienst starten, wird die Instanz vom System erstellt, das nicht weiß, dass zuerst eine Instanz aus der äußeren Klasse erstellt werden muss, damit sie abstürzt. Aber der Fehler ist in diesem Fall wirklich irreführend. Werfen Sie
Marian Klühspies
32

Deklarieren Sie einen Standardkonstruktor ohne Argumente für IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}
ρяσssρєя K.
quelle