Tidak ada konstruktor kosong saat membuat layanan

98

Saya berjuang dengan kesalahan ini:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Disebabkan oleh: java.lang.InstantiationException: tidak dapat membuat instance kelas com.example.localnotificationtest.ReminderService; tidak ada konstruktor kosong

Saya tidak mengerti mengapa kesalahan ini terjadi.

Saya mencoba untuk menampilkan pemberitahuan pada waktu tertentu dan setelah mencari waktu saya menemukan pertanyaan stackoverflow lama ini . Saya mencoba segalanya tetapi kode saya memberikan kesalahan.

Tolong bantu saya untuk memecahkan masalah ini.

Inilah kode MainActivity saya:

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

}

dan ini kode ReminderService saya:

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

}

dan inilah manifest.xml saya:

<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>

Saya tidak tahu di mana saya salah. Apakah saya melewatkan beberapa kode?

Pari
sumber

Jawaban:

221

Anda perlu menambahkan konstruktor kosong ke kelas Anda, yaitu yang tidak membutuhkan argumen:

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

Penjelasan dari dokumentasi :

Yang namedigunakan untuk nama thread pekerja.

CATATAN : ini hanya berlaku untuk layanan maksud.

chiuki
sumber
9
Berani Pembuat itu tanpa argumen
Pratik Butani
44

Jika Anda memiliki Service yang dideklarasikan sebagai Inner Class / Nested Class , Anda juga perlu membuat class tersebut menjadi statis

Tanpa itu Anda akan mendapatkan kesalahan meskipun konstruktor Anda benar

Penjelasan

Alasannya adalah, Anda hanya dapat membuat instance kelas dalam dalam konteks kelas luar, jadi Anda perlu membuat instance kelas luar terlebih dahulu.

Mendeklarasikan statis kelas dalam Anda membuatnya independen dari kelas luarnya

Marian Klühspies
sumber
Dimana ini didokumentasikan?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Saya tidak tahu apakah itu didokumentasikan di mana saja, tetapi jika Anda ingin membuat instance kelas non-statis batin, kelas luar harus dibuat terlebih dahulu. Sekarang jika Anda memulai sebuah layanan, instance tersebut dibuat oleh sistem, yang tidak akan tahu bahwa ia harus membuat instance dari kelas luar terlebih dahulu, sehingga akan macet. Tapi kesalahannya benar-benar menyesatkan dalam kasus itu. lihat di stackoverflow.com/questions/70324/…
Marian Klühspies
32

Deklarasikan konstruktor tanpa argumen default untuk IntentService

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