Zmagam się z tym błędem:
08-08 11: 42: 53.179: E / AndroidRuntime (20288): Spowodowany przez: java.lang.InstantiationException: nie można utworzyć instancji klasy com.example.localnotificationtest.ReminderService; brak pustego konstruktora
Nie rozumiem, dlaczego występuje ten błąd.
Próbuję pojawić się powiadomienie w określonym czasie i po wyszukaniu czasu znalazłem to stare pytanie o przepełnienie stosu . Próbowałem wszystkiego, ale mój kod wyświetla błąd.
Proszę, pomóż mi rozwiązać ten problem.
Oto mój kod 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);
}
};
}
a oto mój kod 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);
}
}
a oto mój 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>
Nie wiem, gdzie popełniam błąd. Czy brakuje mi kodu?
Jeśli Twoja usługa została zadeklarowana jako klasa wewnętrzna / klasa zagnieżdżona , musisz również ustawić klasę jako statyczną
Bez tego otrzymasz błąd, nawet jeśli twój konstruktor jest poprawny
źródło
Zadeklaruj domyślny konstruktor bez argumentów dla IntentService
źródło
Musisz dodać domyślny konstruktor bez argumentów do klasy ReminderService . Jest to dodawane niejawnie tylko wtedy, gdy nie napiszesz własnego konstruktora (który masz). Zobacz tutaj: http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html
źródło