I have a crash that keeps occurring on 4.4.2 and 4.4.3 devices (although I'm not sure this is an API issue), where in some ParsePushBroadcastReceiver
the following code causes a NullPointerException
somewhere deep inside the startActivities
call.
Intent intent = new Intent(context, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TaskStackBuilder.create(context)
.addParentStack(SomeActivity.class)
.addNextIntent(intent)
.startActivities();
I have tried testing to see whether the context was null, however, the Intent instantiation would've caught that. It might also be worth noting that this application is using Parse Push
.
The crash log for this crash:
java.lang.RuntimeException: Unable to start receiver com.example.app.android.receiver.PushReceiver: java.lang.NullPointerException
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2567)
at android.app.ActivityThread.access$1800(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1341)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(NativeStart.java)
Caused by: java.lang.NullPointerException
at android.os.Parcel.readException(Parcel.java:1471)
at android.os.Parcel.readException(Parcel.java:1419)
at android.app.ActivityManagerProxy.startActivities(ActivityManagerNative.java:4494)
at android.app.Instrumentation.execStartActivitiesAsUser(Instrumentation.java:1496)
at android.app.Instrumentation.execStartActivities(Instrumentation.java:1458)
at android.app.ContextImpl.startActivities(ContextImpl.java:1465)
at android.content.ContextWrapper.startActivities(ContextWrapper.java:350)
at android.content.ContextWrapper.startActivities(ContextWrapper.java:350)
at android.support.v4.content.ContextCompatJellybean.startActivities(ContextCompatJellybean.java:26)
at android.support.v4.content.ContextCompat.startActivities(ContextCompat.java:105)
at android.support.v4.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:325)
at android.support.v4.app.TaskStackBuilder.startActivities(TaskStackBuilder.java:301)
at com.example.app.android.receiver.PushReceiver.routePush(PushReceiver.java:59)
at com.example.app.android.receiver.PushReceiver.onPushOpen(PushReceiver.java:35)
at com.parse.ParsePushBroadcastReceiver.onReceive(ParsePushBroadcastReceiver.java:108)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2552)
at android.app.ActivityThread.access$1800(ActivityThread.java:161)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1341)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Method.java)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(NativeStart.java)
I wasn't able to solve this problem as I have a suspicion that this might be a bug specific to 4.4.* devices. As an alternative, I replaced my use of the TaskStackBuilder
with creating my activities via PendingIntent.getActivities
. In my case, this provided equivalent functionality and it was a straightforward replacement. Perhaps you might find it useful as well.
final Intent parentIntent = new Intent(context, ParentActivity.class);
parentIntent.putExtra(ParentActivity.EXTRA, extraValue);
final Intent childIntent = new Intent(context, ChildActivity.class);
childIntent.putExtra(ChildActivity.EXTRA, extraChildValue);
childIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final Intent[] intents = new Intent [] {parentIntent, childIntent};
PendingIntent pendingIntent = PendingIntent.getActivities(context, INTENT_REQUEST_CODE, intents, PendingIntent.FLAG_ONE_SHOT);
pendingIntent.send();