同事!我的问题是:我有一个配置活动的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。卸载然后重新安装应用程序小部件(之后所有鬼小部件都消失了) - 不是 正确解决我的问题。我想以编程方式控制幽灵和真实小部件。
有人知道如何修复此错误吗?
答案 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);
我不知道这是不是你搜索的内容。