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?
- Ajuste dinámico del contenido y del diseño del widget al tamaño que el usuario haya definido mediante el cambio de tamaño. Androide
- Permiso del proveedor de contenido al acceder a través de android.widget.RemoteViewsService
- Sube un diseño con el teclado suave pero guarda uno en la parte inferior
- Restaurar el estado del widget de vista de búsqueda de android
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.
- ¿Qué es "menú contextual" & método registerForContextMenu ()
- Alinear elementos del menú de opciones (en ActionBar)
- ¿Por dónde empezar para el efecto Flip de página en android?
- Actualización de Android de ListView
- Gen ya existe pero no es una carpeta de origen
- Actualizar datos en Arrayadapter
- Android EditText ("Textbox"): Auto capitalización de la primera letra de cada palabra mientras el usuario escribe
- ¿Hay una manera de mostrar la barra de desplazamiento de ListView todo el tiempo?
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?