我有以下小部件提供商信息:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:initialLayout="@layout/widget_agenda"
android:minHeight="110dp"
android:minResizeHeight="110dp"
android:minResizeWidth="110dp"
android:minWidth="180dp"
android:previewImage="@drawable/widget_preview"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="600000" android:widgetCategory="home_screen"/>
在 list 中注册的小部件提供程序中使用:
<receiver
android:name=".AgendaWidgetProvider"
android:label="MyWidget">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/agenda_widget_info" />
</receiver>
我的RemoteViewsService
也已注册:
<service
android:name=".AgendaWidgetService"
android:permission="android.permission.BIND_REMOTEVIEWS" />
它有以下定义:
class AgendaWidgetService : RemoteViewsService() {
override fun onGetViewFactory(intent: Intent?) =
AgendaWidgetViewsFactory(applicationContext)
}
要强制更新小部件并调用 AgendaWidgetProvider
上的 onUpdate()
方法,我发送以下广播:
val widgetIds = AppWidgetManager.getInstance(context).getAppWidgetIds(
ComponentName(context, AgendaWidgetProvider::class.java)
)
if (widgetIds.isNotEmpty()) {
Intent(context, AgendaWidgetProvider::class.java).apply {
this.action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds)
context.sendBroadcast(this)
}
}
每次都会调用这个!我的 onUpdate()
看起来像这样:
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
appWidgetIds.forEach {
val rv = RemoteViews(context.packageName, R.layout.widget_agenda)
rv.setTextViewText(R.id.widgetDate, "Today")
val i = Intent(context, AgendaWidgetService::class.java)
i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
rv.setRemoteAdapter(
R.id.widgetAgendaList,
i
)
rv.setEmptyView(R.id.widgetAgendaList, R.id.widgetAgendaEmpty)
appWidgetManager.notifyAppWidgetViewDataChanged(it, R.id.widgetDate)
appWidgetManager.notifyAppWidgetViewDataChanged(it, R.id.widgetAgendaList)
appWidgetManager.updateAppWidget(it, rv)
}
super.onUpdate(context, appWidgetManager, appWidgetIds)
}
onDataSetChanged()
具有以下定义:
override fun onDataSetChanged() {
Timber.d("AAA onDataSetChanged")
}
我使用 Android 模拟器 (8.0) 和 Nexus 5x (8.1) 来测试这一点。 onUpdate()
每次都会调用,而 onDataSetChanged()
似乎仅在退出或进入应用程序时调用。有什么线索吗?
谢谢!
最佳答案
要在小部件中触发 onDataSetChanged()
,您无需创建广播。只需调用notifyAppWidgetViewDataChanged
从您的应用程序内部,如下所示:
Context context = getApplicationContext();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, AgendaWidgetProvider.class));
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widgetAgendaList);
此外,您不需要在 onCreate()
中调用 notifyAppWidgetViewDataChanged()
。根据this answer ,onCreate()
自动触发onDataSetChanged()
。
关于android - 更新 AppWidget 后未调用 RemoteViewsFactory 上的 onDataSetChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48802621/