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:
- Cómo agregar eventos para un calendario predeterminado de android4.0?
- Pasar el identificador de recursos de estilo de XML a la clase no funciona
- Problema con la presentación de TabHost Layout en una nueva intención
- Título de Autoscrollable en Android Actionbar (Marquee)
- ¿Hay algún ejemplo sobre el texto Spanned y Spannable?
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.
- Android.widget, textView no se puede convertir en android.widget, botón
- android: Establecer programaticamente alinear en RemoteView
- No se puede interactuar con PopupWindow y Background (GoogleMap)
- ¿Cómo logró Google lograr esto? Slide ActionBar en la aplicación de Android
- Cambiar el estilo de android MediaController
- Escribir texto multilínea en el botón en Android
- Actualizar programaticamente widget de actividad / servicio / receptor
- Android Full Width Estilo ICS Minimalista Bottom ButtonsViews
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 }
- Escribe un párrafo con textview en Android
- Reempaquetar el archivo APK para contener elementos personalizados: ¿qué herramienta de compilación usar?