为啥主屏幕上有隐藏的 appWidget?

Posted

技术标签:

【中文标题】为啥主屏幕上有隐藏的 appWidget?【英文标题】:Why is there a hidden appWidget on home screen?为什么主屏幕上有隐藏的 appWidget? 【发布时间】:2012-11-10 12:24:46 【问题描述】:

从主屏幕删除我最后一个 appWidget 实例后,onDisabledonEnabled 无法正常工作。

我将我的小部件注册为广播接收器,主屏幕上没有实例,但广播接收,而且我看到我的日志写在我的 appWidget 核心类中!

卸载我的应用程序并再次安装后,问题解决了,onDisabledonEnabled 在添加(删除)第一个(最后一个)实例后正常工作。

我手动收集了 appWidgetIds 并将其保存在一个文件中,以提供更好的方式来访问我所有的小部件 ID,但隐藏的 appWidget 并未从我收集的小部件 ID 中删除,并且还存在于主屏幕中!

问题:

这个问题是 android 版本 2.3.4(测试设备)上的错误吗?在这种情况下,解决方案是什么?

代码的重要部分:

@Override
public void onEnabled(Context context) 
    G.logger.out("Enabled");
    super.onEnabled(context);



@Override
public void onDisabled(Context context) 
    super.onDisabled(context);
    G.logger.out("Disabled");
    File file = new File(G.infoDir + "/" + getClass().getSimpleName() + ".dat");
    if (file.exists()) 
        file.delete();
    


@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    WidgetProperty property = G.widgetPropertyMap.get(getClass().getSimpleName());
    property.appWidgetIds = appWidgetIds;

    addWidgetIds(appWidgetIds, getClass().getSimpleName()); // add widget ids to a file ( duplicates will skip )
    updateAll(getClass(), context);


@Override
public void onDeleted(Context context, int[] appWidgetIds) 
    G.logger.out("Deleted");
    removeWidgetIds(appWidgetIds, getClass().getSimpleName()); // remove widget ids from file

【问题讨论】:

【参考方案1】:

Android 中 AppWidgets 的设计非常糟糕。

重现错误:

选择小部件(放在主屏幕上) 选择返回(硬件键)取消放置小部件 现在您有了隐藏的小部件。

我被包含setResult(RESULT_CANCELED); 来防止这个问题,但不会被android框架处理!!!

所以我用这个代码作为一个愚蠢的解决方案:

@Override
protected void onDestroy() 
    if ( !submitted) 
        AppWidgetHost host = new AppWidgetHost(this, 1);
        host.deleteAppWidgetId(mAppWidgetId);
    

【讨论】:

以上是关于为啥主屏幕上有隐藏的 appWidget?的主要内容,如果未能解决你的问题,请参考以下文章

AppWidget(桌面小部件)

AppWidget(桌面小部件)

主屏幕小部件文本视图未更新

将 AppWidgets 绑定到 AppWidgetHost - Android

AppWidget 警报管理器未更新

启动配置活动时调用Widget onUpdate