【问题标题】:App widget crash during second configuration launch在第二次配置启动期间应用小部件崩溃
【发布时间】:2016-12-20 09:12:16
【问题描述】:

我正在开发一个应用小部件,它在小部件移动到屏幕时启动配置活动。我第一次将小部件放在屏幕上时,配置启动并成功运行。在我删除小部件,然后再次将其放在屏幕上后,活动崩溃,logcat 显示以下内容:

E/AndroidRuntime(15830): FATAL EXCEPTION: main
E/AndroidRuntime(15830): Process: com.lge.launcher2, PID: 15830
E/AndroidRuntime(15830): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=5, result=-1, data=Intent { (has extras) }} to activity {com.lge.launcher2/com.lge.launcher2.Launcher}: java.lang.NullPointerException: Attempt to read from field 'android.content.ComponentName android.appwidget.AppWidgetProviderInfo.provider' on a null object reference
E/AndroidRuntime(15830):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3554)
E/AndroidRuntime(15830):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3597)
E/AndroidRuntime(15830):    at android.app.ActivityThread.access$1300(ActivityThread.java:148)
E/AndroidRuntime(15830):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332)
E/AndroidRuntime(15830):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(15830):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(15830):    at android.app.ActivityThread.main(ActivityThread.java:5272)
E/AndroidRuntime(15830):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(15830):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(15830):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
E/AndroidRuntime(15830):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
E/AndroidRuntime(15830): Caused by: java.lang.NullPointerException: Attempt to read from field 'android.content.ComponentName android.appwidget.AppWidgetProviderInfo.provider' on a null object reference
E/AndroidRuntime(15830):    at com.lge.launcher2.views.LauncherAppWidgetHostView.<init>(LauncherAppWidgetHostView.java:71)
E/AndroidRuntime(15830):    at com.lge.launcher2.application.LauncherAppWidgetHost.onCreateView(LauncherAppWidgetHost.java:56)
E/AndroidRuntime(15830):    at android.appwidget.AppWidgetHost.createView(AppWidgetHost.java:313)
E/AndroidRuntime(15830):    at com.lge.launcher2.application.WidgetManager.createView(WidgetManager.java:105)
E/AndroidRuntime(15830):    at com.lge.launcher2.Launcher.completeAddAppWidget(Launcher.java:1670)
E/AndroidRuntime(15830):    at com.lge.launcher2.Launcher.completeAdd(Launcher.java:649)
E/AndroidRuntime(15830):    at com.lge.launcher2.Launcher.onActivityResult(Launcher.java:685)
E/AndroidRuntime(15830):    at android.app.Activity.dispatchActivityResult(Activity.java:6179)
E/AndroidRuntime(15830):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3550)
E/AndroidRuntime(15830):    ... 10 more
W/ActivityManager( 1022):   Force finishing activity com.lge.launcher2/.Launcher
W/ResourcesManager(14274): Asset path '/system/framework/com.google.android.maps.jar' does not exist or contains no resources.
W/ResourcesManager(14274): Asset path '/system/framework/com.lge.mdm.jar' does not exist or contains no resources.
W/ResourcesManager(14274): Asset path '/system/framework/com.lge.telephony.sms.jar' does not exist or contains no resources.
W/ResourcesManager(14274): Asset path '/system/framework/lghiddenlibs.jar' does not exist or contains no resources.
W/ResourcesManager(14274): Asset path '/system/framework/qcrilhook.jar' does not exist or contains no resources.
W/PhoneWindowManagerEx( 1022): Call!!!getLGSystemUiVisibility. =0x0
D/StatusBarManagerServiceEx( 1022): setLGSystemUiVisibility(0x0)
D/StatusBarManagerServiceEx( 1022): manageNaviBtnDisableList userId=0 what=0x0 pkg=WindowManager.LayoutParams

我按照this question 中的建议切换了“不保留活动”配置,但这并没有改变任何东西。 我的测试系统是运行 Lollipop 的 LG3 设备。导致崩溃的原因是什么?

额外积分

  1. 如果我在第一个输入屏幕上等待一段时间(确切的时间待定),则会发生同样的崩溃。
  2. 我在onCreate中设置结果如下:

    意图结果值 = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_CANCELED, resultValue);

当用户完成配置过程时,如下:

 Intent resultValue = new Intent();
 resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
 setResult(RESULT_OK, resultValue);
 finish();
  1. 我的问题可能与this question有关,尚未得到答复。

【问题讨论】:

  • 您是否确保您的配置Activity 始终具有有效的结果Intent,无论它如何完成,并且Intent 附加了EXTRA_APPWIDGET_ID
  • 正如 Mike M 所说,EXTRA_APPWIDGET_ID 很重要,并确保 appwidgetid 有效。

标签: android android-appwidget


【解决方案1】:

当重新生成配置活动时,无论是在屏幕旋转还是放置新小部件时,我都想立即退出配置活动,因此我在 onCreate() 中间调用了 finish()。这做了坏事,并导致了问题的异常。

【讨论】:

    【解决方案2】:

    AppWidgetId 是有效的也不仅仅意味着它已经被传递给了activity,还意味着它已经被注册到了Android 的AppWidgetManager 中。 这在调用配置活动之前默认发生。

    但是,就我而言,每当调用 onUpdate 时,我都会从 Android 的 AppWidgetManager 中手动删除 appWidgetIds,而我的应用程序不知道该首选项。经验教训 - 不要更改 Android 的 appwidget 状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2021-04-09
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多