Android:如何强制更新特定类型的所有小部件

Android:如何强制更新特定类型的所有小部件,第1张

概述我已经看到了很多这样的问题,我一遍又一遍地看到同样的答案.我不想为我的应用程序拥有的每种小部件都有一个服务,特别是因为我的应用程序已经拥有2个持久服务.具体来说,如果我的一个现有服务看到数据已更改,我想更新我的小部件.在计时器上执行此 *** 作很烦人,因为它可能是更新之间的

我已经看到了很多这样的问题,我一遍又一遍地看到同样的答案.我不想为我的应用程序拥有的每种小部件都有一个服务,特别是因为我的应用程序已经拥有2个持久服务.

具体来说,如果我的一个现有服务看到数据已更改,我想更新我的小部件.在计时器上执行此 *** 作很烦人,因为它可能是更新之间的天数,也可能在一小时内有几天.我希望我的小部件始终显示最新信息.

Android小部件设计似乎是基于您的小部件在需要时提取信息的基础上工作,我认为有许多明智的场景,其中活动可能希望将数据推送到小部件.

阅读下面的答案,了解我是如何做到这一点的.据我所知,如果做得好,没有任何不利影响.

解决方法:

强制更新特定窗口小部件提供程序的窗口小部件,我们需要执行以下 *** 作:

>设置我们的提供商以接收专门的广播
>发送专业广播:

>与提供者关联的所有当前窗口小部件ID
>要发送的数据
>只有我们的提供商响应的密钥(重要!)

>让我们的小部件点击更新(没有服务!)

第1步 – 设置我们的appwidgetprovider

我不会详细介绍如何创建info xml文件或更改AndroID Manifest – 如果你不知道如何正确创建一个小部件,那么你应该先阅读很多教程.

这是appwidgetprovider类的示例:

public class MyWidgetProvIDer extends appwidgetprovider {public static final String Widget_IDS_KEY ="myWidgetprovIDerWidgetIDs";public static final String Widget_DATA_KEY ="myWidgetprovIDerWidgetdata";}@OverrIDepublic voID onReceive(Context context, Intent intent) {    if (intent.hasExtra(Widget_IDS_KEY)) {        int[] IDs = intent.getExtras().getIntArray(Widget_IDS_KEY);        if (intent.hasExtra(Widget_DATA_KEY)) {           Object data = intent.getExtras().getParcelable(Widget_DATA_KEY);           this.update(context, AppWidgetManager.getInstance(context), IDs, data);        } else {            this.onUpdate(context, AppWidgetManager.getInstance(context), IDs);        }    } else super.onReceive(context, intent);}@OverrIDepublic voID onUpdate(Context context, AppWidgetManager appWidgetManager,        int[] appWidgetIDs) {    update(context, appWidgetManager, appWidgetIDs, null);}//This is where we do the actual updatingpublic voID update(Context context, AppWidgetmanager manager, int[] IDs, Object data) {    //data will contain some predetermined data, but it may be null   for (int WidgetID : IDs) {        .        .        //Update Widget here        .        .        manager.updateAppWidget(WidgetID, remoteVIEws);    }}

第2步 – 发送广播

在这里,我们可以创建一个静态方法,让我们的小部件更新.重要的是我们使用自己的键和小部件更新 *** 作,如果我们使用AppWidgetmanager.EXTRA_Widget_IDS,我们不仅会破坏我们自己的小部件,还会破坏其他小部件.

public static voID updateMyWidgets(Context context, Parcelable data) {    AppWidgetManager man = AppWidgetManager.getInstance(context);    int[] IDs = man.getAppWidgetIDs(            new Componentname(context,MyWidgetProvIDer.class));    Intent updateIntent = new Intent();    updateIntent.setAction(AppWidgetManager.ACTION_APPWidget_UPDATE);    updateIntent.putExtra(MyWidgetProvIDer.Widget_ID_KEY, IDs);    updateIntent.putExtra(MyWidgetProvIDer.Widget_DATA_KEY, data);    context.sendbroadcast(updateIntent);}

如果将此方法与多个提供程序一起使用,请确保它们使用不同的密钥.否则,您可能会发现Widget a的代码更新小部件b,这可能会产生一些奇怪的后果.

第3步 – 点击更新

另一件好事是让我们的小部件在点击时进行恶意更新.将以下代码添加到update方法中以实现此目的:

RemoteVIEws vIEws =       new RemoteVIEws(context.getPackagename(),R.layout.myWidget_layout);Intent updateIntent = new Intent();updateIntent.setAction(AppWidgetManager.ACTION_APPWidget_UPDATE);updateIntent.putExtra(myWidgetProvIDer.Widget_IDS_KEY, IDs);PendingIntent pendingIntent = PendingIntent.getbroadcast(      context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT);vIEws.setonClickPendingIntent(R.ID.vIEw_container, pendingIntent);

此代码将导致在单击窗口小部件时调用onUpdate方法.

笔记

>对updateWidgets()的任何调用都将导致更新我们窗口小部件的所有实例.
>单击窗口小部件将导致窗口小部件的所有实例都更新
>无需服务
>当然,小心不要经常更新 – 小部件更新使用电池电量.
>请记住,所有窗口小部件提供程序都会收到广播,并且它的特殊键确保它只是我们实际更新的窗口小部件.

总结

以上是内存溢出为你收集整理的Android:如何强制更新特定类型的所有小部件全部内容,希望文章能够帮你解决Android:如何强制更新特定类型的所有小部件所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1102201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存