Немає порожнього конструктора під час створення послуги


98

Я боюся з цією помилкою:

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

Я не розумію, чому трапляється ця помилка.

Я намагаюсь з’явитись сповіщення в певний час і, шукаючи час, я знайшов це старе запитання про stackoverflow . Я спробував все, але мій код дає помилку.

Будь ласка, допоможіть мені вирішити цю проблему.

Ось мій код 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);
        }
    };

}

і ось мій код нагадування:

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

}

і ось мій маніфест.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
Сміливий той Конструктор без аргументів
Пратік Бутані

44

Якщо ваша служба оголошена як Внутрішній клас / Вкладений клас , вам також потрібно зробити клас статичним

Без цього ви отримаєте помилку, навіть якщо ваш конструктор правильний

Пояснення

Причиною цього є те, що ви можете інстанціювати внутрішні класи лише в контексті зовнішнього класу, тому вам слід спочатку створити екземпляр зовнішнього класу.

Оголошення вашого внутрішнього класу статичним робить його незалежним від зовнішнього класу


Де це документально зафіксовано?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Я не знаю, чи це десь задокументовано, але якщо ви хочете створити внутрішні нестатичні класи, спочатку слід встановити зовнішній клас. Тепер, якщо ви запускаєте службу, екземпляр створюється системою, яка не знатиме, що вона повинна спершу зробити екземпляр із зовнішнього класу, тому він вийде з ладу. Але помилка в цьому випадку дійсно вводить в оману. дивитися на stackoverflow.com/questions/70324 / ...
Маріан Klühspies

32

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.