2012-08-08 8 views
87

estoy luchando con este error:constructor vacío cuando se crea un servicio de

08-08 11:42:53.179: E/AndroidRuntime(20288): Caused by: java.lang.InstantiationException: can't instantiate class com.example.localnotificationtest.ReminderService; no empty constructor

No entiendo por qué se produce este error.

Estoy tratando de aparecer la notificación en el momento específico y después de buscar por un tiempo encontré esto old stackoverflow question. Intenté todo pero mi código da error.

Ayúdame a solucionar 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 lo hago sé dónde me estoy equivocando. ¿Me falta algún código?

Respuesta

210

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

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

Explicación de la documentation:

El name se utiliza para nombrar el subproceso de trabajo.

NOTA: esto solo se aplica al servicio intent.

+9

Negrita que ** Constructor sin argumento ** –

31

declarar una predeterminado constructor sin argumentos para IntentService

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

Si usted tiene su servicio declarada como una interior Clase/anidada Clase, también es necesario para hacer que el clase estática

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

+0

¿Dónde está esto documentado? –

+0

No sé si está documentado en alguna parte, pero si desea crear instancias de clases internas no estáticas, primero debe crearse una instancia de la clase externa. Ahora, si inicia un servicio, el sistema crea la instancia, que no sabrá que tiene que crear primero una instancia de la clase externa, por lo que se bloqueará. Pero el error es realmente engañoso en ese caso. echa un vistazo a http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –

Cuestiones relacionadas