Compruebe si existe un widget en la pantalla de inicio usando appWidgetId

Estoy utilizando AlarmManager para actualizar mis widgets. Y quiero detenerlo si no hay widget en la pantalla de inicio. Pero me enfrenta a un problema con la detección de si no hay widget en la pantalla de inicio.

Como siempre que intento conseguir el AppWidgetIds usando esta manera:

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

Obtengo la longitud de appWidgetIDs mientras que en realidad no hay ningún widget en la pantalla de inicio. ¿Por qué?

Por lo tanto, quisiera saber si hay una manera de detectar que un widget id existe en la pantalla de inicio.

Gracias por adelantado.

Enhorabuena, has encontrado aplicaciones phantom. Parece estar documentado en el rastreador de problemas de Android . Normalmente ocurren cuando la actividad de configuración para un appwidget se cancela, aunque parece ser a través de una implementación incorrecta de la actividad de configuración; Los desarrolladores se olvidan de incluir el ID de appwidget como un extra al establecer el resultado de la actividad en RESULT_CANCELED . (Incluso la aplicación de ejemplo de ApiDemos de Google no hace esto!)

La implementación adecuada es la siguiente:

 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); } } 

Hasta ahora no conozco ninguna forma de detectar la presencia de una aplicación fantasma sin hacer su propia contabilidad. Sugiero almacenar un valor SharedPreferences que indica que la actividad de configuración no se canceló y, a continuación, consultar este valor en su otro código. También puede utilizar esta información para "eliminar" un widget fantasma si se encuentra con uno. En la actividad de configuración de 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; } 

A continuación, puede comprobar que tiene al menos un appwidget no fantasma así:

 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 } 
  • android TextView.setText no funciona en widget simple
  • Vista de imagen de Android
  • Desplazamiento mediante programación de un EditText
  • No se puede importar android.widget.NumberPicker en android
  • Cómo actualizar un widget con precisión cada minuto
  • Android: alinear el centro LinearLayout para todos los tamaños de pantalla
  • R.id No se puede resolver
  • Vista de texto de Autocompletar de Twitter como Android
  • RelativeLayout ¿La gravedad no se aplica?
  • Animación de diálogo de progreso personalizado
  • Android Spinner - ¿Cómo hacer que la vista desplegable sea transparente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.