Home进程重启后解耦AppWidget Intent
-
19-09-2019 - |
题
我的 Android 应用程序 Transdroid 提供了几个主屏幕小部件。每个 AppWidget 都有 2 个“按钮”(ImageButton),一个启动应用程序,一个启动一些刷新 AppWidget 内容的活动。很简单。 这里 是一个截图。小部件代码位于我的 Google 代码网站,但最重要的是:
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_15);
views.setOnClickPendingIntent(R.id.widget_action, PendingIntent.getActivity(context, 0, new Intent(context, Transdroid.class), 0));
appWidgetManager.updateAppWidget(id, views);
问题是:Home 进程重新启动后,不会调用小部件的 onUpdate,因此用于将功能附加到按钮的 PendingIntents 会丢失。
复制起来相当容易。
- 启动模拟器
- 添加一个小部件(使用 PendingIntent 来启动一个活动)
- 点击按钮查看实际效果
- 强制终止主进程('adb -e shell Kill 96',其中 96 是 android.process.acore 的 PID)
- 小部件的按钮不再起作用。
更确切:没有 onReceive,因此当 android.process.acore Home 进程重新启动时,不会调用 onUpdate。反过来,没有附加意图。
有人遇到过同样的问题并且知道如何规避这个问题吗?
解决方案
我刚刚测试了几个我自己的应用程序小部件,它们的点击事件在杀死 acore 后工作正常。这是我的相关代码:
final RemoteViews views = new RemoteViews(context.getPackageName(), layoutId);
views.setOnClickPendingIntent(R.id.widget_view, PendingIntent.getActivity(
context,
0,
new Intent(context, MyActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
PendingIntent.FLAG_UPDATE_CURRENT));
我看到的主要区别是与意图相关的标志;我想说它们绝对值得尝试。[这 layoutId
我的代码中的参数是在其他地方设置的;相同的代码用于具有不同布局的多个小部件]。
不隶属于 StackOverflow