我正在使用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
- }