Brak pustego konstruktora podczas tworzenia usługi

98

Zmagam się z tym błędem:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Spowodowany przez: java.lang.InstantiationException: nie można utworzyć instancji klasy com.example.localnotificationtest.ReminderService; brak pustego konstruktora

Nie rozumiem, dlaczego występuje ten błąd.

Próbuję pojawić się powiadomienie w określonym czasie i po wyszukaniu czasu znalazłem to stare pytanie o przepełnienie stosu . Próbowałem wszystkiego, ale mój kod wyświetla błąd.

Proszę, pomóż mi rozwiązać ten problem.

Oto mój kod 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);
        }
    };

}

a oto mój kod 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);
    }

}

a oto mój 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>

Nie wiem, gdzie popełniam błąd. Czy brakuje mi kodu?

Pari
źródło

Odpowiedzi:

221

Musisz dodać do swojej klasy pusty konstruktor, czyli taki, który nie przyjmuje żadnych argumentów:

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

Wyjaśnienie z dokumentacji :

nameSłuży do nazwy wątku roboczego.

UWAGA : dotyczy to tylko usługi zamierzonej.

chiuki
źródło
9
Pogrubienie tego Konstruktora bez argumentów
Pratik Butani
44

Jeśli Twoja usługa została zadeklarowana jako klasa wewnętrzna / klasa zagnieżdżona , musisz również ustawić klasę jako statyczną

Bez tego otrzymasz błąd, nawet jeśli twój konstruktor jest poprawny

Wyjaśnienie

Dzieje się tak dlatego, że instancje klas wewnętrznych można tworzyć tylko w kontekście klasy zewnętrznej, więc najpierw trzeba byłoby utworzyć wystąpienie klasy zewnętrznej.

Zadeklarowanie statycznej klasy wewnętrznej czyni ją niezależną od klasy zewnętrznej

Marian Klühspies
źródło
Gdzie to jest udokumentowane?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Nie wiem, czy jest to gdziekolwiek udokumentowane, ale jeśli chcesz utworzyć instancję wewnętrznych klas niestatycznych, najpierw należy utworzyć instancję klasy zewnętrznej. Teraz, jeśli uruchomisz usługę, instancja zostanie utworzona przez system, który nie będzie wiedział, że musi najpierw utworzyć instancję z klasy zewnętrznej, więc ulegnie awarii. Ale w tym przypadku błąd jest naprawdę mylący. spójrz na stackoverflow.com/questions/70324/…
Marian Klühspies
32

Zadeklaruj domyślny konstruktor bez argumentów dla IntentService

public class ReminderService extends IntentService {
    public ReminderService() {
      super("ReminderService");
    }
}
ρяσѕρєя K
źródło