我正在使用AlarmManager来更新我的小部件.如果主屏幕上没有小部件,我想阻止它.但我在检测主屏幕上是否没有小部件时遇到问题.
每当我尝试使用这种方式获取AppWidgetIds时:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] appWidgetIDs = appWidgetManager .getAppWidgetIds(new ComponentName(context,Widget.class));
我得到了一段appWidgetID,而实际上主屏幕上没有小部件.为什么?
因此,我想知道是否有办法检测主屏幕上是否存在小部件ID.
先谢谢你.
解决方法
恭喜你,你遇到过幻影appwidgets.它似乎记录在
Android issue tracker上.它们通常在appwidget的配置活动被取消时发生,尽管它似乎是通过不正确的配置活动实现;在将活动结果设置为RESULT_CANCELED时,开发人员忽略将appwidget ID包含为额外ID. (即使Google的ApiDemos示例应用程序忽略了这样做!)
正确的实现是这样的:
public class AppWidgetConfigActivity extends Activity { private int appWidgetId; private Intent resultValue; protected void onCreate(bundle saved) { super.onCreate(saved); // get the appwidget id from the intent Intent intent = getIntent(); appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID); // make the result intent and set the result to canceled resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId); setResult(RESULT_CANCELED,resultValue); // if we weren't started properly,finish here if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { finish(); } /* ... */ } /* ... */ private void finishConfigure() { /* finish configuring appwidget ... */ setResult(RESULT_OK,resultValue); } }
到目前为止,我知道没有办法在没有自己的簿记的情况下检测幻影appwidget的存在.我建议存储一个SharedPreferences值,表示配置活动未被取消,然后在其他代码中查询该值.如果遇到虚拟小部件,您还可以使用此信息“删除”虚拟小部件.在appwidget配置活动中:
private void finishConfigure() { /* finish configuring appwidget ... */ setResult(RESULT_OK,resultValue); String key = String.format("appwidget%d_configured",appwidgetId); SharedPreferences prefs = getSharedPreferences("widget_prefs",0); prefs.edit().putBoolean(key,true).commit; }
然后你可以检查你至少有一个非幻像appwidget,如下所示:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AppWidgetHost appWidgetHost = new AppWidgetHost(context,1); // for removing phantoms SharedPreferences prefs = getSharedPreferences("widget_prefs",0); boolean hasWidget = false; int[] appWidgetIDs = appWidgetManager.getAppWidgetIds(new ComponentName(context,Widget.class)); for (int i = 0; i < appWidgetIDs.length; i++) { int id = appWidgetIDs[i]; String key = String.format("appwidget%d_configured",id); if (prefs.getBoolean(key,false)) { hasWidget = true; } else { // delete the phantom appwidget appWidgetHost.deleteAppWidgetId(id); } } if (hasWidget) { // proceed } else { // turn off alarms }