9

同事!我的问题是:我有一个带有配置活动的 App Widget(min SDK - 2.1),它工作正常,但有时它开始工作得更慢。我登录并发现在更新我的 App Widget 方法之前 onUpdate 收到了一组 App Widget Id

  @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        Log.d("onUpdate", Arrays.toString(appWidgetIds));

但事实是,我在主屏幕上只有两个 App Widget 实例,但数组的长度超过 2(两个):4,有时是 5 或 6。怎么会这样?我的 AppWidget 更新缓慢的原因是我必须为所有 id 调用 onUpdate-method,但某些 id(正如人们所说的“幻像小部件”)不是真实和正确的。

也许,有人遇到过这样的问题,并会帮助我弄清楚如何只处理真正的应用小部件 ID。

PS卸载然后重新安装应用程序小部件(之后所有幽灵小部件都消失了) - 不是我问题的正确解决方案。我想以编程方式控制幽灵和真实小部件。

有人知道如何解决这个错误吗?

4

3 回答 3

4

此代码将删除小部件(全部,甚至是屏幕上的小部件),因此不是理想的解决方案

ComponentName cn = new ComponentName(getApplicationContext(), YourWidget.class);
AppWidgetManager appWidgetManager =  AppWidgetManager.getInstance(getApplicationContext());
int[] appWidgetIds1 = appWidgetManager.getAppWidgetIds(cn);
AppWidgetHost host = new AppWidgetHost(getApplicationContext(), 0);
for (int appWidgetId : appWidgetIds1) {
    host.deleteAppWidgetId(appWidgetId);
}

在 4.2 上删除锁定屏幕小部件仍然存在问题(从未调用过 onReceive)

于 2012-12-03T19:03:11.073 回答
3

好的,我在网上搜索了一下,发现这似乎是一个全面的 android 错误,现在还没有修复。如果可以,请尝试清除缓存。转到设置-> 应用程序-> 管理应用程序。然后转到您的家庭启动器应用程序并清除缓存。然后请重新启动您的应用程序并查看是否仍有旧的应用程序小部件。我在网上发现了一些有趣的事情:

http://forum.xda-developers.com/showthread.php?t=1030804

http://eagle.phys.utk.edu/guidry/android/appWidget.html

甚至在 Android 开发者页面和 Group-Post 上也讨论了这一点:

http://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

https://groups.google.com/forum/?fromgroups=#!msg/android-developers/Nl0e06rDCRY/4nAh3xnKBeQJ

他们谈论 1.5 中的一个问题,但我认为即使是更高的系统也是一个问题。在小组帖子中有一个如何解决此问题的示例:

      @Override
        public void onReceive(Context context, Intent intent) {
         final String action = intent.getAction();
         if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
         final int appWidgetId = extras.getInt
       (AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
       if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
        this.onDeleted(context, new int[] { appWidgetId });
          }
       } else {
          super.onReceive(context, intent);
       }
      } 

似乎并非每个应用小部件都会自动删除,即使用户从主屏幕删除应用或替换小部件也是如此。如果这是正确的方向,请给我一些反馈。如果是,我们需要另一种方法来解决这个问题。对我来说这也很有趣,但目前我没有笔记本电脑来检查它。谢谢

于 2012-11-21T11:39:43.437 回答
0

我在一个月前编写的应用程序中遇到了同样的问题,就我而言,这并不重要。我找到了如何删除“幻像小部件”的教程。我从来没有测试过,试试吧:

http://blog.fiziksphreak.com/2011/07/28/remove-phantom-widgets-in-android/

但是,您确定这会减慢您的应用程序的速度吗?我无法想象这在资源上会很昂贵吗?

编辑

而不是杀死旧应用程序,这可能会有所帮助:

    Bundle extras = intent.getExtras();
     int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID);

或者

    Bundle extras = intent.getExtras();
     int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);

我不知道这是否是您搜索的内容。

于 2012-11-20T12:42:58.823 回答