为什么主屏幕上有隐藏的appWidget?

时间:2012-11-22 06:31:56

标签: android android-widget android-appwidget appwidgetprovider

从主屏幕删除我的上一个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 个答案:

答案 0 :(得分:3)

Android上的AppWidgets设计非常差。

重现错误:

  • 选择小工具(放在主屏幕上)
  • 选择返回(硬件密钥)以取消放置小部件
  • 现在你有隐藏的小部件。

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

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

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