我的小部件由 2 个按钮和一个显示数据的列表视图组成。大多数时候,当小部件提供者的 onUpdate 方法被调用时,一切都正常加载并且每个人都很开心。
但是我注意到有时在调用更新方法后,小部件完全无法加载其数据。列表视图为空,所有按钮均无响应。就好像我将布局初始化到小部件中,但没有设置任何待处理的意图和列表适配器。
我记录了所有内容,发现情况并非如此。每次都会创建挂起的意图,就像列表适配器一样,包括失败的随机时间。很长一段时间以来,我认为这与列表数据如何填充到适配器中有关,但每次看到它都有效,再加上按钮意图不起作用的事实让我相信 updateAppWidget 方法(ComponentName, RemoteViews) 是失败的原因。但是,没有错误堆栈可以帮助我确认这一点。
这是在 AppWidgetProvider 的 onUpdate 方法调用的单独服务中运行的代码:
@SuppressWarnings("deprecation")
private void updateWidget(int[] ids) {
AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
int[] widgetIds = widgetManager.getAppWidgetIds(new ComponentName(this, WidgetReceiver.class));
for (int currentWidgetId : widgetIds) {
RemoteViews widget = new RemoteViews(this.getPackageName(), R.layout.widget_layout);
Intent intent = new Intent(this, WidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, currentWidgetId);
intent.putExtra("random", randomNumber);
randomNumber++;
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
widget.setRemoteAdapter(currentWidgetId, android.R.id.list, intent);
Intent clickIntent = new Intent(this, DetailsActivity.class);
PendingIntent pending = PendingIntent.getActivity(this, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setPendingIntentTemplate(android.R.id.list, pending);
Intent settingsIntent = new Intent(this, WidgetSettingsActivity.class);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
settingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent settingsPending = PendingIntent.getActivity(this, 0, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setOnClickPendingIntent(R.id.widget_settings, settingsPending);
Intent mainIntent = new Intent(this, MainActivity.class);
PendingIntent mainPending = PendingIntent.getActivity(this, 0, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widget.setOnClickPendingIntent(R.id.widget_logo, mainPending);
ComponentName widgetCompName = new ComponentName(this, WidgetReceiver.class);
widgetManager.updateAppWidget(widgetCompName, widget);
}
}
这个错误最令人沮丧的是我无法可靠地重新创建它。有时我会(不)走运,它显示出丑陋的头,其他时候(大部分时间)它工作得很好。
我认为有趣的另一件事是,我在 Facebook 的小部件中看到了同样的问题。由于 NDA 我无法在我的应用程序失败时显示屏幕,但我可以显示 Facebook 相同问题的屏幕:
当 Facebook 的小部件看起来像这样时,它和我的问题完全相同。未加载数据,所有按钮均无响应。
对于 Facebook 和我的小部件,后续的更新间隔通常会使问题消失。
尽管我很感激我不是唯一遇到此问题的人,但在解决此问题之前我仍然不想发布。这里有没有人遇到过这个问题,并且更好地找到了解决方案,甚至是问题的原因?感谢您的帮助。
编辑:有趣的东西。我进行了一项实验,将更新间隔设置为一整天,而不是每 30 分钟一次。我的假设是,更新方法可能不是原因,而是其他原因导致小部件变为空白且无响应。
果然,大约 2 小时后,我检查了我的手机,尽管没有调用更新方法,但小部件已经死了。这会让我相信是其他东西导致了这个问题,widgetManager.updateAppWidget(widgetCompName, widget);
不像我以前想象的那样。
我知道配置更改可能会导致小部件被重建,因此它可能会失败。但是,如果需要,我已经使用 Service 类的 onConfigurationChanged 方法重新加载小部件。是否还有另一种情况,例如配置更改会导致小部件自行销毁并重新创建?