我正在 Android 上创建一个相当常见的 AppWidget 用例。
- AppWidgetProvider 调用
onAppWidgetOptionsChanged()
(可拉伸小部件)和onUpdate()
(定时) - 从这些方法我开始一个
IntentService
. 来自选项的案例已更改,我在 Intent 中传递了新大小。 - 该服务联系 Web 服务,构建 RemoteViews 并调用
updateAppWidget()
我的主要测试设备是 Nexus 7 (2012) running stock 4.3 (stock Launcher)
该小部件不使用 RemoteViewFactory,也不使用 AlarmManager。它是在 XML 中定义的具有恒定时间的静态视图。
它在大多数情况下都有效,但有时updateAppWidget()
启动器会完全忽略对的调用,并且屏幕上不会发生任何更新。如果我强制关闭启动器,清除它的缓存并重新调整小部件的大小(强制更新)然后它会更新。
我相信这与更新频率有关,因为我在 IntentService 中欺骗了一些东西,以便在调整大小时只调用最后一个意图(当用户停止弄乱小部件时)并且它缓和了一些问题。
让我们展示一些简化的代码(我相信它非常标准):
public class AlbumWidgetService extends WidgetUpdateIntentService {
@Override
protected void onHandleIntent(Intent intent) {
// get's widgetID or array of IDs and pass to 'doTheJob'
}
private void doTheJob(int appWidgetId, int heightInDp, int widthInDp) {
// ...
// here goes code with pre calculations and get data
// ...
// create Intent and PendingIntent with some extras
Intent intent = ... etc
PendingIntent pi = PendingIntent.getActivity( ... etc
// get url for some images
List<String> imageFilenames = getImagesFilename(albumId, totalImages);
// Create the remote view
RemoteViews views = new RemoteViews(getPackageName(), R.layout.album_widget);
// ...
// here goes a bunch of code that load bitmaps from the URLs
// set text and colors in the remote view
// put ImageViews into the remote view, etc
// ...
try {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetManager.updateAppWidget(appWidgetId, views);
Log.d(this, "Updating the widget id " + appWidgetId);
} catch (Exception e) {
// this exception happens if the RemoteView is too big, have too many bitmaps.
// I'm already minizing this to happen with the pre calculations, but better safe than sorry
Log.e(this, "Failed to update the widget id " + appWidgetId, e);
}
}
正如我所说,这件事大部分都有效(我可以看到日志,我可以看到屏幕上的结果。但每隔一段时间它在调整大小后不会更新,即使你可以看到日志并且它没有崩溃或任何东西。
想法?