Нет пустого конструктора при создании сервиса


98

Я борюсь с этой ошибкой:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): вызвано: java.lang.InstantiationException: невозможно создать экземпляр класса com.example.localnotificationtest.ReminderService; нет пустого конструктора

Я не понимаю, почему возникает эта ошибка.

Я пытаюсь отобразить уведомление в определенное время, и после определенного времени я нашел этот старый вопрос о стеке . Я пробовал все, но мой код выдает ошибку.

Пожалуйста, помогите мне решить эту проблему.

Вот мой код 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);
        }
    };

}

а вот мой код 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);
    }

}

и вот мой 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>

Я не знаю, где я ошибаюсь. Мне не хватает кода?

Ответы:


221

Вам нужно добавить в свой класс пустой конструктор, то есть тот, который не принимает аргументов:

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

Пояснение из документации :

nameИспользуется для именования рабочего потока.

ПРИМЕЧАНИЕ : это применимо только к намеренному обслуживанию.


9
Смелый конструктор без аргументов
Pratik Butani

44

Если ваша служба объявлена ​​как внутренний класс / вложенный класс , вам также необходимо сделать класс статическим.

Без этого вы получите ошибку, даже если ваш конструктор правильный.

Объяснение

Причина этого в том, что вы можете создавать экземпляры внутренних классов только в контексте внешнего класса, поэтому вам нужно сначала создать экземпляр внешнего класса.

Объявление статического внутреннего класса делает его независимым от внешнего класса.


Где это задокументировано?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Я не знаю, задокументировано ли это где-нибудь, но если вы хотите создать экземпляры внутренних нестатических классов, сначала необходимо создать экземпляр внешнего класса. Теперь, если вы запустите службу, экземпляр будет создан системой, которая не будет знать, что она должна сначала создать экземпляр из внешнего класса, поэтому произойдет сбой. Но в этом случае ошибка действительно вводит в заблуждение. взгляните на stackoverflow.com/questions/70324/…
Marian Klühspies

32

Объявить конструктор без аргументов по умолчанию для IntentService

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.