窗口小部件未在启动器重启时更新

时间:2011-07-11 13:08:35

标签: android widget launcher android-pendingintent

我有一个小部件,只要有配置更改(例如屏幕方向),每当手机解锁时,它都会自动更新。此过程涉及为我的小部件上的按钮设置onClick处理程序。这很好用,但是我发现有一个使用案例会导致我的应用无法响应onClick个事件。这种特殊情况是每当启动器重新启动时。

有没有办法检测启动器何时重启,所以我可以手动更新我的小部件?或者是否有其他方法可以确保onClick处理程序不会丢失?

2 个答案:

答案 0 :(得分:10)

当我应该只调用一次以生成视图时,我发送垃圾邮件new RemoteViews(),然后在需要时引用该实例。在我的解决方案中,我有一个类变量存储这个单一的RemoteView实例,以及一个访问它的getter。

答案 1 :(得分:0)

@Glitch的提案可能不适用于某些情况,尤其是包含ListView的应用小部件。这是因为在ListView多次调用ListView之后,appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id)会变慢(尝试滚动RemoteView)。

我的猜测是,单个appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, list_id)实例会将其所有已执行的指令保留在列表中。随着时间的推移,指令列表将会增长。每次@SuppressLint("NewApi") @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (action.equals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) { // http://stackoverflow.com/questions/17396045/how-to-catch-widget-size-changes-on-devices-where-onappwidgetoptionschanged-not handleTouchWiz(context, intent); // Possible launcher restart. handleLauncherRestart(context, intent); } else if (action.equals("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) { // Possible launcher restart. handleLauncherRestart(context, intent); } super.onReceive(context, intent); } private void handleLauncherRestart(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); updateAppWidget(context, appWidgetManager, appWidgetId); } private void handleTouchWiz(Context context, Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int appWidgetId = intent.getIntExtra("widgetId", 0); int widgetSpanX = intent.getIntExtra("widgetspanx", 0); int widgetSpanY = intent.getIntExtra("widgetspany", 0); if (appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) { Bundle newOptions = new Bundle(); // We have to convert these numbers for future use // http://stackoverflow.com/questions/10008521/appwidget-size-calculation if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74 - 2); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74 - 2); } else { newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 70 - 30); newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 70 - 30); } onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); } } ,大型指令列表将重新执行。

我提出的解决方案如下。但是,我相信它只适用于某些设备,因为并非所有设备都会在启动器重启期间收到相同的广播消息。

{{1}}