无法在Android 4.0.4设备上启动小部件的接收器崩溃

时间:2013-09-27 19:09:53

标签: android android-widget broadcastreceiver android-pendingintent

我在运行Android 4.0.4的摩托罗拉Xoom上遇到了我的小部件崩溃。

这是堆栈跟踪:

09-24 15:03:33.288: E/AndroidRuntime(4719): FATAL EXCEPTION: main
09-24 15:03:33.288: E/AndroidRuntime(4719): java.lang.RuntimeException: Unable to start receiver com.chaitanya.widgets.MyWidgetProvider: java.lang.NullPointerException
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.app.ActivityThread.handleReceiver(ActivityThread.java:2126)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.app.ActivityThread.access$1500(ActivityThread.java:123)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.os.Looper.loop(Looper.java:137)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at java.lang.reflect.Method.invokeNative(Native Method)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at java.lang.reflect.Method.invoke(Method.java:511)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at dalvik.system.NativeStart.main(Native Method)
09-24 15:03:33.288: E/AndroidRuntime(4719): Caused by: java.lang.NullPointerException
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.widget.RemoteViews$SetOnClickPendingIntent.writeToParcel(RemoteViews.java:436)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.widget.RemoteViews.writeToParcel(RemoteViews.java:1655)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.updateAppWidgetIds(IAppWidgetService.java:435)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.appwidget.AppWidgetManager.updateAppWidget(AppWidgetManager.java:247)
09-24 15:03:33.288: E/AndroidRuntime(4719):     at android.appwidget.AppWidgetManager.updateAppWidget(AppWidgetManager.java:270)
<my code that calls updateAppWidget>

我的代码会侦听来自我应用的某些广播,并动态更新小部件视图。在此过程中,它会删除一些现有的视图(设置为Visibility.GONE),并通过将PendingIntents设置为null来清除它们。毕竟,它会调用AppWidgetManager.updateAppWidget()

现在,这在4.1.2设备和4.3设备上运行得非常好,但4.0.4设备上出现了这种情况。我搜索了很多,并用Intent选项进行了很多实验,但我无法解决这个问题。有没有人经历过这个?有什么指针吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

比较4.0.44.1.2上的RemoteViews.java的源代码,我们可以看到SetOnClickPendingIntent.writeToParcel()方法的4.0.4版本会因空pendingIntent而崩溃。您可以看到显然已致力于解决它的this change in the frameworks

对于您的情况,您的代码是否可以避免将挂起的意图设置为null?也许您可以使用特殊值代替可以忽略的intent操作?

答案 1 :(得分:1)

这可能有助于其他人阻止Android上的小部件上的NPE&lt; 4.1。 它用于禁用通知上的“onClick”:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    views.setOnClickPendingIntent(R.id.widgetIcon, null);
} else {
    // Android < 4.1
    PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, new Intent(), PendingIntent.FLAG_CANCEL_CURRENT);
    views.setOnClickPendingIntent(R.id.widgetIcon,
        pendingIntent);
}