Monday 15 August 2011

android - OnReceive in BroacdcastReceiver return intent with extra but can't extract -



android - OnReceive in BroacdcastReceiver return intent with extra but can't extract -

problem

i have no thought why logcat give me npe because intent not null , has in onreceive() so, please help me find out , guide me somethings.

note

i have multiple broadcast receiver in project. i register them pending intent unique id.

logcat (prove has along with)

10-19 06:10:32.587 31593-31593/com.bis.prototype.airdroid e/broadcastreceiver_calibratemode﹕ intent { flg=0x14 cmp=com.bis.prototype.airdroid/.broadcastreceiver_calibratemode (has extras) }

broadcastreceiver_calibratemode.class

public class broadcastreceiver_calibratemode extends broadcastreceiver { @override public void onreceive(context context, intent intent) { log.e("broadcastreceiver_calibratemode", string.valueof(intent)); string slot = intent.getextras().getstring("node_slot"); log.e("broadcastreceiver_calibratemode", slot); // npe on line intent calibrateintent = new intent(context, service_mqttpush.class); calibrateintent.putextra("calibrate_mode",true); calibrateintent.putextra("node_slot", slot); context.startservice(calibrateintent); } }

logcat

java.lang.runtimeexception: unable start receiver com.bis.prototype.airdroid.broadcastreceiver_calibratemode: java.lang.nullpointerexception: println needs message @ android.app.activitythread.handlereceiver(activitythread.java:2476) @ android.app.activitythread.access$1700(activitythread.java:144) @ android.app.activitythread$h.handlemessage(activitythread.java:1322) @ android.os.handler.dispatchmessage(handler.java:102) @ android.os.looper.loop(looper.java:212) @ android.app.activitythread.main(activitythread.java:5135) @ java.lang.reflect.method.invokenative(native method) @ java.lang.reflect.method.invoke(method.java:515) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:877) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:693) @ dalvik.system.nativestart.main(native method) caused by: java.lang.nullpointerexception: println needs message @ android.util.log.println_native(native method) @ android.util.log.e(log.java:232) @ com.bis.prototype.airdroid.broadcastreceiver_calibratemode.onreceive(broadcastreceiver_calibratemode.java:17) @ android.app.activitythread.handlereceiver(activitythread.java:2469)             at android.app.activitythread.access$1700(activitythread.java:144)             at android.app.activitythread$h.handlemessage(activitythread.java:1322)             at android.os.handler.dispatchmessage(handler.java:102)             at android.os.looper.loop(looper.java:212)             at android.app.activitythread.main(activitythread.java:5135)             at java.lang.reflect.method.invokenative(native method)             at java.lang.reflect.method.invoke(method.java:515)             at com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:877)             at com.android.internal.os.zygoteinit.main(zygoteinit.java:693)             at dalvik.system.nativestart.main(native method)

code register broadcast

public static void registeralarm_calibratemode(context context){ (int = 0; < node_slot.length; i++) { log.e("registeralarm_calibratemode", node_slot[i]+" :: "+getnodeserial(context,node_slot[i])); if (!getnodeserial(context,node_slot[i]).equals("null")) { intent intent = new intent(context, broadcastreceiver_calibratemode.class); log.e("registeralarm_calibratemode", "putextra-->"+node_slot[i]); intent.putextra("node_slot", node_slot[i]); pendingintent pi = pendingintent.getbroadcast( context, get_node_broadcast_id_for_calibrate_mode[getnodeid(node_slot[i])], intent, intent.fill_in_data ); alarmmanager alarm = (alarmmanager)context.getsystemservice(context.alarm_service); calendar = calendar.getinstance(); now.add(calendar.minute,1); if (android.os.build.version.sdk_int < 19) { alarm.set(alarmmanager.rtc_wakeup, now.gettimeinmillis(), pi); } else { alarm.setexact(alarmmanager.rtc_wakeup,now.gettimeinmillis(),pi); } } } }

xml manifest

<receiver android:name=".broadcastreceiver_sleepmode"/> <receiver android:name=".broadcastreceiver_location"/> <receiver android:name=".broadcastreceiver_calibratemode"/> <receiver android:name=".broadcastreceiver_templog"/>

replace flowing code broadcastreceiver_calibratemode.java

public class broadcastreceiver_calibratemode extends broadcastreceiver { @override public void onreceive(context context, intent intent) { log.e("broadcastreceiver_calibratemode", string.valueof(intent)); string slot = intent.getextras().getstring("node_slot"); log.e("broadcastreceiver_calibratemode", slot); // npe on line intent calibrateintent = new intent(context, service_mqttpush.class); calibrateintent.putextra("calibrate_mode",true); calibrateintent.putextra("node_slot", slot); calibrateintent .setflags(intent.flag_activity_new_task); // spcial code context.startservice(calibrateintent); } }

when calling startactivity, new activity live in same screen stack (context) caller. sometime, caller may not have activity context, instance, starting activity broadcastreceive.onreceive() method, or starting activity service. in these cases, phone call startactivity cause exception of "calling startactivity() outside of activity context requires flag_activity_new_task", since new activity not have context live in.

to prepare issue, setting flag_activity_new_task intent follows, new context created new activity.

myintent.setflags(intent.flag_activity_new_task);

android android-intent nullpointerexception broadcastreceiver

No comments:

Post a Comment