AppWidgetProvider - 每次对任何 AppWidget 文件进行更改时都会触发 onUpdate 吗?

Posted

技术标签:

【中文标题】AppWidgetProvider - 每次对任何 AppWidget 文件进行更改时都会触发 onUpdate 吗?【英文标题】:AppWidgetProvider - Is onUpdate triggered every time a change has been made to any of the AppWidget files? 【发布时间】:2018-10-09 05:06:51 【问题描述】:

我想知道onUpdate 方法。我知道第一次将小部件放置在主屏幕上时调用它,然后在我在 appwidget info xml 文件中定义的时间段内调用它。 但似乎每当我对AppWidgetProvider 类进行更改时,也会调用此方法,即。添加或删除方法。这个观察正确吗?我不明白这如何触发onUpdate 方法?

public class ExampleAppWidgetProvider extends AppWidgetProvider 

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    for (int appWidgetId : appWidgetIds) 
        Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

        SharedPreferences prefs = context.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
        String buttonText = prefs.getString(KEY_BUTTON_TEXT + appWidgetId, "Press me");

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_widget);
        views.setOnClickPendingIntent(R.id.example_widget_button, pendingIntent);
        views.setCharSequence(R.id.example_widget_button, "setText", buttonText);

        Bundle appWidgetOptions = appWidgetManager.getAppWidgetOptions(appWidgetId);
        resizeWidget(appWidgetOptions, views);

        appWidgetManager.updateAppWidget(appWidgetId, views);
    

【问题讨论】:

【参考方案1】:

但似乎每当我对我的 AppWidgetProvider 类进行更改时也会调用此方法,即。添加或删除方法

此处的行为可能取决于主屏幕或其他应用小部件宿主的实现。但是,是的,如果您安装不同版本的应用程序(包括开发期间的更改),则可能会调用您的 onUpdate() 方法。

我不明白这如何触发 onUpdate 方法?

嗯,android 是一个操作系统。它知道应用程序何时安装和更新。当应用程序小部件提供程序的 APK 更改时,我可以看到通过 onProviderChanged() 通知 AppWidgetHost 的位置。 AppWidgetManager 后面的操作系统代码也可能发送广播以使 AppWidgetProvider 传递新的 RemoteViews 是相当合理的。或者,当使用onProviderChanged() 调用主屏幕时,它本身可能能够请求刷新。

【讨论】:

感谢您的回答!我觉得这很有趣。我进一步测试了它,这一定是真的,因为它甚至会在我添加另一个空行时触发。对不起,我问了两次这个问题,我完全忘记了。

以上是关于AppWidgetProvider - 每次对任何 AppWidget 文件进行更改时都会触发 onUpdate 吗?的主要内容,如果未能解决你的问题,请参考以下文章

桌面小部件Wight父类AppWidgetProvider的三个方法

扩展 AppWidgetProvider 的 Widget 中是不是可以使用 TextView Marquee?

Android 桌面小组件

是否可以在 appWidget 中重用 RemoteViews 而不是每次都创建新的?我该如何存储它们?

AppWidgetProvider 中的 super.onUpdate() 推荐?

AppWidgetProvider:在小部件放置时未调用 onAppWidgetOptionsChanged