appwidget appWidgetIds的麻烦(小部件的真实和虚幻实例)

时间:2012-11-20 10:19:32

标签: android android-widget instance android-appwidget

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

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

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

也许,有人遇到过这样的问题,并会帮助我弄清楚如何只处理真实问题 app widget ID。

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

有人知道如何修复此错误吗?

3 个答案:

答案 0 :(得分:3)

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

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从未调用过)

答案 1 :(得分:2)

好吧,我在网上搜索了一下,发现,这似乎是一个全面的机器人bug,现在还没有解决。如果可以,请尝试清除缓存。转到设置 - >应用程序 - >管理应用程序。然后转到home-launcher应用程序并清除缓存。然后,请再次启动您的应用程序,看看是否还有旧的应用程序小部件。我在网上发现了一些有趣的内容:

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中的一个问题,但我认为即使有更高的系统,这也是一个问题。在Group post中有一个例子如何解决这个问题:

      @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);
       }
      } 

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

答案 2 :(得分: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);

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