Sin constructor vacío al crear un servicio

98

Estoy luchando con este error:

08-08 11: 42: 53.179: E / AndroidRuntime (20288): Causado por: java.lang.InstantiationException: no se puede crear una instancia de la clase com.example.localnotificationtest.ReminderService; sin constructor vacío

No entiendo por qué ocurre este error.

Estoy tratando de que aparezca una notificación en un momento específico y, después de buscar un momento, encontré esta vieja pregunta de stackoverflow . Intenté todo, pero mi código da error.

Por favor ayúdame a resolver este problema.

Aquí está mi código 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);
        }
    };

}

y aquí está mi código 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);
    }

}

y aquí está mi 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>

No sé dónde me estoy equivocando. ¿Me falta algún código?

Pari
fuente

Respuestas:

221

Debe agregar un constructor vacío a su clase, es decir, uno que no tenga argumentos:

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

Explicación de la documentación :

Se nameusa para nombrar el hilo de trabajo.

NOTA : esto solo se aplica al servicio por intención.

chiuki
fuente
9
Audaz que constructor sin argumentos
Pratik Butani
44

Si tiene su servicio declarado como una clase interna / clase anidada , también debe hacer que la clase sea estática

Sin eso, obtendrá el error incluso si su constructor es correcto

Explicación

La razón de esto es que solo puede crear instancias de clases internas en el contexto de la clase externa, por lo que primero necesitaría crear una instancia de la clase externa.

Declarar su clase interna estática la hace independiente de su clase externa

Marian Klühspies
fuente
¿Dónde está documentado esto?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
No sé si está documentado en alguna parte, pero si desea instanciar clases internas no estáticas, primero debe instanciar la clase externa. Ahora, si inicia un servicio, la instancia es creada por el sistema, que no sabrá que primero tiene que crear una instancia de la clase externa, por lo que se bloqueará. Pero el error es realmente engañoso en ese caso. eche un vistazo a stackoverflow.com/questions/70324/…
Marian Klühspies
32

Declare un constructor sin argumentos predeterminado para IntentService

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