【问题标题】:How to update a widget on app start如何在应用启动时更新小部件
【发布时间】:2011-01-23 23:31:26
【问题描述】:

我有一个与我的应用程序配合使用的小部件。首次启动应用程序时,我会保留上下文和值,以便在事情发生变化时从应用程序调用我的 UpdateWidget()。但是如果应用程序不知道上下文和 AppID 是什么,我不知道如何获取该信息。我认为无论如何我尝试这样做的方式都是错误的,但不确定还有什么可以尝试的。

所以基本上小部件已经在桌面上。我启动应用程序并进行了一些更改,我需要使用新信息向应用程序发送更新。

我原以为应用程序在启动时会与小部件建立这种连接,但事实并非如此。

@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Toast.makeText(context, "onUpdate", Toast.LENGTH_SHORT).show();

        Ct = context;
        ApMgr = appWidgetManager;
        WidgetID = appWidgetIds;

        WidgetOn = true;

        UpdateWidget();

    }

【问题讨论】:

    标签: android widget


    【解决方案1】:

    当应用程序首次启动时,我会保留上下文

    除非这是应用程序上下文,否则您正在泄漏内存。请不要泄漏内存。

    和值,以便当事情发生变化时我可以从应用程序中调用我的 UpdateWidget()

    您的应用程序中可能需要更新小部件的任何地方,您已经有一个Context。例如:

    但如果应用不知道上下文和 AppID 是什么,我不知道如何获取这些信息。

    您绝对知道“上下文”是什么。这是你的Activity。或者,如果有问题的代码在您的自定义 Application 对象中,“上下文”就是 Application

    关于应用小部件 ID,将其存储在文件中。或者数据库。请务必在卸载应用小部件时对其进行清理。

    或者,如果您不支持多个应用小部件,则完全跳过应用小部件 ID,并使用不采用应用小部件 ID 数组的 updateAppWidget() 方法。

    【讨论】:

    • 感谢您提供的信息!如果我不使用 ID,那么它需要一个组件名称。我不知道组件名称是什么......对不起,我是新手。 appWidgetManager.updateAppWidget(WidgetID,remoteViews);我应该输入什么来代替 WidgetID?
    • 我还是将 ID 保存到了数据库中,现在 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) AppWidgetManager 为空。我也不能保存,可以吗?
    • @Mark Worsnop:这是一个带有应用小部件的示例项目,可能会对您有所帮助:github.com/commonsguy/cw-andtutorials/tree/master/…
    • 非常感谢您的教程!!!抱歉,我无法让它工作。请参阅下一个答案以获取我的回复。你能解释一下我们为什么使用 startService 吗?
    【解决方案2】:

    我在不传递 AppWidget ID 的情况下为我的 AppWidget 执行此操作,它工作正常。

    Context context = getApplicationContext();
    context.startService(new Intent(context, UpdateService.class));
    

    或者如果你知道上下文,你可以做这样的事情 -

    startService(new Intent(myClass.this, UpdateService.class));
    

    两者都有效!!!

    【讨论】:

      【解决方案3】:

      在 CommonsWare 的大力帮助和线索下,我发现了这一点。我试图做的是确保应用程序可以在应用程序数据库发生更改时向小部件发送更新。其他任何时候都不需要更新小部件。当应用程序因重新启动或新版本而与小部件断开连接时,链接被切断。下面的这个小功能再次获得“链接”。再次感谢 Stackoverflow 和 CommonsWare!我希望我这样做是正确的,它确实可以达到我想要的效果。

      public static void UpdateWidget(Context Ct)
      {
      
              ComponentName Me =new ComponentName(Ct, Widget.class);
      
              remoteViews=new RemoteViews(Ct.getPackageName(), R.layout.widget);
      
              AppWidgetManager ApMgr=AppWidgetManager.getInstance(Ct);
      
              DisplayTop(Ct); // This gets the data from the DB and updates the remote view
      
              ApMgr.updateAppWidget( Me, remoteViews);
      
      }
      

      【讨论】:

        【解决方案4】:

        完全没有问题。你只能使用;

        int[] ids = AppWidgetManager.getInstance(Context.getApplication()).getAppWidgetIds(new ComponentName(Context.getApplication(), Widget.class));
                            Widget myWidget = new Widget();
                            myWidget.onUpdate(Context, AppWidgetManager.getInstance(Context),ids);
        

        【讨论】:

          猜你喜欢
          • 2011-10-02
          • 1970-01-01
          • 1970-01-01
          • 2017-03-27
          • 2012-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多