I am struggling with this error:
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
I don't understand why this error occurs.
I am trying to appear notification at specific time and after searching for a time i found this old stackoverflow question. I tried everything but my code gives error.
Please help me to solve this problem.
Here is my MainActivity code:
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);
}
};
}
and here is my ReminderService code:
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);
}
}
and here is my 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>
I don't know where I am going wrong. Am I missing some code?
An empty constructor is required when we need to create a new instance via reflection by our framework. If we don't create any other constructor with arguments for the class, we don't need to create an empty constructor because one default will already be present.
Having an empty constructor (whether static or not) in a class is redundant, and ReSharper issues a warning to that effect. In the above, an empty static constructor is, in fact, a necessary detail that guarantees lazy initialization.
The reason to have an empty constructor is to allow people to create the type without any parameters. Sometimes that makes sense, other times you decide it doesn't. If you don't define ANY constructors, a default constructor is automatically provided.
A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).
You need to add an empty constructor to your class i.e. one that takes no arguments:
public ReminderService() { super("ReminderService"); }
Explanation from the documentation:
The name
is used to name the worker thread.
NOTE: this is only applicable to intent service.
If you have your Service declared as an Inner Class / Nested Class, you also need to make the class static
Without that you´ll get the error even if your constructor is correct
Explanation
The reason for that is, you can only instantiate inner classes in the context of the outer class, so you would need to create an instance of the outer class first.
Declaring your inner class static makes it independent from its outer class
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With