android – 使用appWidgetId检查主屏幕上是否存在小部件

前端之家收集整理的这篇文章主要介绍了android – 使用appWidgetId检查主屏幕上是否存在小部件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用AlarmManager来更新我的小部件.如果主屏幕上没有小部件,我想阻止它.但我在检测主屏幕上是否没有小部件时遇到问题.

每当我尝试使用这种方式获取AppWidgetIds时:

  1. AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
  2.  
  3. int[] appWidgetIDs = appWidgetManager
  4. .getAppWidgetIds(new ComponentName(context,Widget.class));

我得到了一段appWidgetID,而实际上主屏幕上没有小部件.为什么?

因此,我想知道是否有办法检测主屏幕上是否存在小部件ID.

先谢谢你.

解决方法

恭喜你,你遇到过幻影appwidgets.它似乎记录在 Android issue tracker上.它们通常在appwidget的配置活动被取消时发生,尽管它似乎是通过不正确的配置活动实现;在将活动结果设置为RESULT_CANCELED时,开发人员忽略将appwidget ID包含为额外ID. (即使Google的ApiDemos示例应用程序忽略了这样做!)

正确的实现是这样的:

  1. public class AppWidgetConfigActivity extends Activity {
  2.  
  3. private int appWidgetId;
  4. private Intent resultValue;
  5.  
  6. protected void onCreate(bundle saved) {
  7. super.onCreate(saved);
  8.  
  9. // get the appwidget id from the intent
  10. Intent intent = getIntent();
  11. appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
  12.  
  13. // make the result intent and set the result to canceled
  14. resultValue = new Intent();
  15. resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);
  16. setResult(RESULT_CANCELED,resultValue);
  17.  
  18. // if we weren't started properly,finish here
  19. if (appwidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
  20. finish();
  21. }
  22.  
  23. /* ... */
  24. }
  25.  
  26. /* ... */
  27.  
  28. private void finishConfigure() {
  29. /* finish configuring appwidget ... */
  30. setResult(RESULT_OK,resultValue);
  31. }
  32. }

到目前为止,我知道没有办法在没有自己的簿记的情况下检测幻影appwidget的存在.我建议存储一个SharedPreferences值,表示配置活动未被取消,然后在其他代码查询该值.如果遇到虚拟小部件,您还可以使用此信息“删除”虚拟小部件.在appwidget配置活动中:

  1. private void finishConfigure() {
  2. /* finish configuring appwidget ... */
  3. setResult(RESULT_OK,resultValue);
  4.  
  5. String key = String.format("appwidget%d_configured",appwidgetId);
  6. SharedPreferences prefs = getSharedPreferences("widget_prefs",0);
  7. prefs.edit().putBoolean(key,true).commit;
  8. }

然后你可以检查你至少有一个非幻像appwidget,如下所示:

  1. AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
  2. AppWidgetHost appWidgetHost = new AppWidgetHost(context,1); // for removing phantoms
  3. SharedPreferences prefs = getSharedPreferences("widget_prefs",0);
  4. boolean hasWidget = false;
  5.  
  6. int[] appWidgetIDs = appWidgetManager.getAppWidgetIds(new ComponentName(context,Widget.class));
  7. for (int i = 0; i < appWidgetIDs.length; i++) {
  8. int id = appWidgetIDs[i];
  9. String key = String.format("appwidget%d_configured",id);
  10. if (prefs.getBoolean(key,false)) {
  11. hasWidget = true;
  12. } else {
  13. // delete the phantom appwidget
  14. appWidgetHost.deleteAppWidgetId(id);
  15. }
  16. }
  17.  
  18. if (hasWidget) {
  19. // proceed
  20. } else {
  21. // turn off alarms
  22. }

猜你在找的Android相关文章