Android 为什么主屏幕上有一个隐藏的appWidget?
从主屏幕删除上一个appWidget实例后,Android 为什么主屏幕上有一个隐藏的appWidget?,android,android-widget,android-appwidget,appwidgetprovider,Android,Android Widget,Android Appwidget,Appwidgetprovider,从主屏幕删除上一个appWidget实例后,onDisabled,onEnabled不工作 我将我的小部件注册为广播接收器,在主屏幕上没有实例,但广播接收器,并且我看到我的日志写在我的appWidget核心类中 卸载我的应用程序并再次安装后,问题得到解决,onDisabled,onEnabled在添加(删除)第一个(最后一个)实例后工作正常 我手动收集AppWidgetID并将其保存在一个文件中,以提供更好的方式来访问我的所有小部件ID,但隐藏的appWidget并没有从我收集的小部件ID中删除
onDisabled
,onEnabled
不工作
我将我的小部件注册为广播接收器,在主屏幕上没有实例,但广播接收器,并且我看到我的日志写在我的appWidget核心类中
卸载我的应用程序并再次安装后,问题得到解决,onDisabled
,onEnabled
在添加(删除)第一个(最后一个)实例后工作正常
我手动收集AppWidgetID并将其保存在一个文件中,以提供更好的方式来访问我的所有小部件ID,但隐藏的appWidget并没有从我收集的小部件ID中删除,也存在于主屏幕中
问题:
@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
}
这个问题是安卓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
}
android中AppWidget的设计非常糟糕 要复制错误,请执行以下操作:
- 选择小部件(在主屏幕上放置)
- 选择后退(硬件键)以取消删除小部件
- 现在您有了隐藏的小部件
setResult(结果被取消)
可防止此问题,但不会由android框架处理
因此,我将此代码用作愚蠢的解决方案:
@Override
protected void onDestroy() {
if ( !submitted) {
AppWidgetHost host = new AppWidgetHost(this, 1);
host.deleteAppWidgetId(mAppWidgetId);
}
}