为啥我的应用小部件没有在 API 3 或 4 中更新?

Posted

技术标签:

【中文标题】为啥我的应用小部件没有在 API 3 或 4 中更新?【英文标题】:Why doesn't my app widget update in API 3 or 4?为什么我的应用小部件没有在 API 3 或 4 中更新? 【发布时间】:2011-05-17 11:39:27 【问题描述】:

我正在开发一个 android 小部件,它在 API 级别 5 或更高级别中运行良好。 API 级别 1 或 2 根本不支持它。它在 3 和 4 中应该可以正常工作,但由于某种原因,小部件不会更新。

onUpdate 方法被调用并正确执行;但是,在 3 和 4 中,它不会更改小部件的文本。我几乎不知所措。有什么想法吗?

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

    DataAccess helper = new DataAccess(context);
    String text = helper.getCurrentText();
    helper.close();

    if (text != null)
        views.setTextViewText(R.id.widget_text, text);

    Intent intent = new Intent(context, WidgetDetailsActivity.class);
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.widget, pending);

    appWidgetManager.updateAppWidget(appWidgetIds, views);

【问题讨论】:

你调试过小部件吗?你得到预期的文本了吗?待处理的意图是否有效?是否执行了 onUpdate? 是的,我附加了调试器,除了文本更改外,一切正常。我可以更改颜色、大小、行为以及所有这些,但我无法更改文本。我已经很久没有在 1.5 或 1.6 中尝试过了,因为那个版本越来越过时了。 奇怪。我有适用于 1.5+ 的小部件,并且更新文本没有任何问题。 尝试添加一些日志,看看发生了什么。调试器可能会使用小部件进行欺骗。它应该在 1.5+ 上正常工作。你多久更新一次? 我收回我之前的评论。似乎没有针对小部件执行任何远程视图命令。没有错误或日志语句伴随它。它只是失败了。我在修改首选项时更新命令,然后每隔几个小时更新一次。我可能会拼凑一个快速测试小部件,看看我是否可以取出一些混淆变量。 【参考方案1】:

试试这个:

在更新方法结束时,您需要调用超级。

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

    DataAccess helper = new DataAccess(context);
    String text = helper.getCurrentText();
    helper.close();

    if (text != null)
        views.setTextViewText(R.id.widget_text, text);

    Intent intent = new Intent(context, WidgetDetailsActivity.class);
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.widget, pending);

    appWidgetManager.updateAppWidget(appWidgetIds, views);

   super.onUpdate(context, appWidgetManager, appWidgetIds);

【讨论】:

我试过这个。仍然没有运气。它似乎根本不执行远程视图。【参考方案2】:

您需要在更新方法上启动服务并将所有代码也放入服务中,这里我给出 onReceive 和服务演示 context.startService(new Intent(context, UpdateService.class));

public static class UpdateService extends Service 
    @Override
    public void onStart(Intent intent, int startId) 
        // Build the widget update for today
        RemoteViews updateViews = buildUpdate(this);
        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this,
                Widget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);
    

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    


@Override
public void onReceive(Context context, Intent intent) 
    final RemoteViews remoteViews  = buildUpdate(context);
    ComponentName cn = new ComponentName(context, Widget.class);
    AppWidgetManager.getInstance(context).updateAppWidget(cn, remoteViews);
    super.onReceive(context, intent);

其中 buildUpdate 是您的小部件更新代码的方法

【讨论】:

以上是关于为啥我的应用小部件没有在 API 3 或 4 中更新?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 Web API 和播放按钮小部件用于第 3 方 Spotify 移动应用程序吗?

为啥当主应用停止时我的小部件广播接收器服务停止

为啥我的 Center 小部件在 Dart 中不起作用? |扑

一些第 3 方小部件在应用程序升级后停止更新

如何使用 jquery 和一些 API 创建天气小部件?

WidgetKit - API 调用