我有一个小部件,只要有配置更改(例如屏幕方向),每当手机解锁时,它都会自动更新。此过程涉及为我的小部件上的按钮设置onClick
处理程序。这很好用,但是我发现有一个使用案例会导致我的应用无法响应onClick
个事件。这种特殊情况是每当启动器重新启动时。
有没有办法检测启动器何时重启,所以我可以手动更新我的小部件?或者是否有其他方法可以确保onClick
处理程序不会丢失?
答案 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}}