【问题标题】:TaskStackBuilder#startActivities() NullPointerExceptionTaskStackBuilder#startActivities() NullPointerException
【发布时间】:2015-02-26 23:22:42
【问题描述】:

我在 4.4.2 和 4.4.3 设备上不断发生崩溃(尽管我不确定这是一个 API 问题),其中在某些 ParsePushBroadcastReceiver 中,以下代码会在内部某处导致 NullPointerException startActivities 电话。

Intent intent = new Intent(context, SomeActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
TaskStackBuilder.create(context)
            .addParentStack(SomeActivity.class)
            .addNextIntent(intent)
            .startActivities();

我尝试过测试以查看上下文是否为空,但是,Intent 实例化会捕捉到这一点。值得注意的是,此应用程序正在使用Parse Push。 此崩溃的崩溃日志:

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)

【问题讨论】:

  • 我遇到了基本相同的事情。仅在 4.4.2 和 4.4.4 上可见
  • 运气好吗?你解决了吗?
  • 很遗憾,我没有。
  • 目前也只在三星上看到 - 4.4.2 和 4.4.4。我怀疑他们使用的是 ActivityManagerNative 的重写版本,因为我崩溃中的行号与 AOSP 代码不匹配

标签: android android-intent broadcastreceiver taskstackbuilder


【解决方案1】:

我无法解决此问题,因为我怀疑这可能是 4.4.* 设备特有的错误。作为替代方案,我将TaskStackBuilder 的使用替换为通过PendingIntent.getActivities 创建我的活动。就我而言,这提供了等效的功能,并且是一个简单的替代品。也许您会发现它也很有用。

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();

【讨论】:

  • 很棒的解决方法。将在此应用程序的下一次更新中将其作为 API 19 的替代方案,并将报告结果。
  • 已经在生产环境中运行了一段时间,没有遇到任何问题。很棒的东西@daniel
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2016-03-29
相关资源
最近更新 更多