android - 更新 AppWidget 后未调用 RemoteViewsFactory 上的 onDataSetChanged()

标签 android android-appwidget remoteview

我有以下小部件提供商信息:

<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 answeronCreate()自动触发onDataSetChanged()

关于android - 更新 AppWidget 后未调用 RemoteViewsFactory 上的 onDataSetChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48802621/

相关文章:

带有 ListView 的 Android Widget 仅显示加载 View

android - 如何在android中以编程方式更改应用程序小部件中的图像

java - 如何混淆ProGuard,但在测试过程中保持名称可读性?

android - ppi 和 dpi 有什么区别?

Android AppWidget 不适用于 Lollipop

android - 如何更改小部件中的 ProgressBar 颜色?

android - 应用小工具 : can you specify a minimum AND a default size?

android - RemoteViews 支持的方法列表

java - 在 Android 上混合 guice 和 scala 时得到 "failure in processEncodedAnnotation"

java - Android Studio 如果输入为 Decimal 应用程序崩溃