android - How to set an alarm inside a broadcastreceiver -
in app there's option user make event repeat, , each recurrence of repeating event have notification (an alarm) remind user event start.
so when first alarm gets called, opens broadcastreceiver, creates notification , should set alarm next recurrence:
@override public void onreceive(context context, intent intent) { // when onreceive gets called event notification triggered databasehelper mydatabasehelper = new databasehelper(context); // create notification int id = intent.getintextra("id", 0); string name = intent.getstringextra("name"); long notificationtime = intent.getlongextra("notificationtime", 0); string recurrencetype = intent.getstringextra("recurrencetype"); string message = intent.getstringextra("message"); if (recurrencetype.equals("every week")) { // repeatinterval = unix timestamp * 1000 in millis notificationtime long repeatinterval = 604800 * 1000; notificationtime += repeatinterval; mydatabasehelper.updatenotificationtime(notificationtime); setalarm(context, intent, id, name, notificationtime, recurrencetype, message); } else { mydatabasehelper.updatenotificationtime(0); } createnotification(context, message, name, id); } } now works fine first alarm of event. notification created. when second alarm gets called intent empty, after first alarm other intents empty , empty notification created app crashes nullpointerexception. note: i'm keeping app open , device. setalarm(...) method inside broadcastreceiver class.
how set alarms:
public void setalarm(context context, intent intent, int id, string name, long notificationtime, string recurrencetype, string message){ alarmmanager alarmmanager = (alarmmanager) context.getsystemservice(context.alarm_service); intent intentalarm = new intent(context, alarmreceiver.class); intent.putextra("id", id); intent.putextra("name", name); intent.putextra("notificationtime", notificationtime); intent.putextra("recurrencetype", recurrencetype); intent.putextra("message", message); // pendingintent specifies action take in future [context, request code, intent, flag] pendingintent pendingintent = pendingintent.getbroadcast(context, id, intentalarm, pendingintent.flag_update_current); // rtc_wakeup wake device when goes off alarmmanager.set(alarmmanager.rtc_wakeup, notificationtime, pendingintent); } stacktrace:
08-25 12:12:35.917 19323-19323/com.madgusto.when2game e/androidruntime: fatal exception: main process: com.madgusto.when2game, pid: 19323 java.lang.runtimeexception: unable start receiver com.madgusto.when2game.alarm.alarmreceiver: java.lang.nullpointerexception: attempt invoke virtual method 'boolean java.lang.string.equals(java.lang.object)' on null object reference @ android.app.activitythread.handlereceiver(activitythread.java:3018) @ android.app.activitythread.-wrap18(activitythread.java) @ android.app.activitythread$h.handlemessage(activitythread.java:1544) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:154) @ android.app.activitythread.main(activitythread.java:6077) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:866) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:756) caused by: java.lang.nullpointerexception: attempt invoke virtual method 'boolean java.lang.string.equals(java.lang.object)' on null object reference @ com.madgusto.when2game.alarm.alarmreceiver.onreceive(alarmreceiver.java:48) @ android.app.activitythread.handlereceiver(activitythread.java:3011) @ android.app.activitythread.-wrap18(activitythread.java) @ android.app.activitythread$h.handlemessage(activitythread.java:1544) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:154) @ android.app.activitythread.main(activitythread.java:6077) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:866) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:756) so null pointer @ :
if (recurrencetype.equals("every week")) { now how go on set alarm inside broadcastreceiver correct way? thanks!
it pretty clear happening. @ code:
intent intentalarm = new intent(context, alarmreceiver.class); intent.putextra("id", id); intent.putextra("name", name); intent.putextra("notificationtime", notificationtime); intent.putextra("recurrencetype", recurrencetype); intent.putextra("message", message); pendingintent pendingintent = pendingintent.getbroadcast(context, id, intentalarm, pendingintent.flag_update_current); you create intent in variable intentalarm, put "extras" intent using variable intent. pass intentalarm argument pendingintent.getbroadcast(). of course intentalarm doesn't have "extras" in it.
try putting "extras" in intentalarm instead.
Comments
Post a Comment