Widget no eliminado al pasar RESULT_CANCELED como resultado de la actividad de configuración

Tengo algunos problemas con mis widgets. Aquí está la descripción:

Contexto:

Tengo un widget de inicio.

Cuando lo añado, aparece una actividad de configuración para establecer algunos parámetros para el widget.

Si llamo a setResult (RESULT_OK, resultValue); Antes de finalizar la Actividad de configuración, el widget se agrega a Inicio.

Si elimino el widget arrastrándolo al contenedor de basura, se invoca public void onDeleted (Context context, int [] appWidgetIds) de mi clase AppWidgetProvider. Hasta aquí todo bien.

Problema: si la actividad de configuración sale con el código de resultado RESULT_CANCELED ( setResult (RESULT_CANCELED); ), public void onDeleted (Context context, int [] appWidgetIds) de mi clase AppWidgetProvider no se llama y el widget permanece en la lista de widgets activos. Cuando reinicio el teléfono, se llama onUpdate (Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) de mi clase AppWidgetProvider y en int [] appWidgetIds Tengo todos los widgets (los ids) que supuestamente se cancelaron (borrados antes de ser agregados) + Los activos (los que realmente se muestran en Inicio). Los widgets que se eliminaron al arrastrar a la papelera no se muestran en esta lista. Con el tiempo, esta lista de identificadores de widgets se hace cada vez más grande si el usuario está cancelando desde la actividad de configuración.

La referencia de la API dice algo como: "Si devuelve RESULT_OK usando Activity.setResult (), se agregará AppWidget y recibirá una difusión ACTION_APPWIDGET_UPDATE para este AppWidget. Si devuelve RESULT_CANCELED, el host cancelará el agregado y no mostrará Este AppWidget, y recibirá una emisión ACTION_APPWIDGET_DELETED. "

¿Puede alguien darme algunos consejos sobre esto? Gracias.

Aquí está mi manifiesto:

<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> <receiver android:name=".MytWidget" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/my_widget_provider" /> </receiver> <activity android:name=".ConfigurationActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> </application> 

El resto del código no es relevante ya que se explicó anteriormente (y no tengo permiso para publicarlo).

Tuve este mismo problema, lo hice en el evento onPause

 public void removeWidget(int appWidgetId) { AppWidgetHost host = new AppWidgetHost(Config.this, 1); host.deleteAppWidgetId(appWidgetId); } 

Comprobado los identificadores de widget, el widget se elimina. El identificador de host no es importante si sólo tiene un host de widget de aplicación.

 private boolean canceled = true; @Override protected void onPause() { if(canceled) { removeWidget(appWidgetId); } super.onPause(); } 

En el clic de OK, establezco el false

¿Está seguro de que su código no es relevante? Todo en su manifiesto está fuera del libro y se ve bien. Su código debe verse muy similar a esto:

  public void configCancelOnClick(View v) { MyLog.d(TAG, "configCancelOnClick"); Intent intent = new Intent(); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); setResult(RESULT_CANCELED, intent); finish(); } 

El putExtra se requiere para decirle al OS qué widget no estás creando … El acabado es necesario para apagar correctamente. Si no lo tiene, no obtendrá la intención pasado al sistema operativo correctamente y perder el setResult.

Por último, cuando la configuración no sale correctamente (tecla de retroceso, clave de inicio o código incorrecto), se crea un widget fantasma. Incluso con un código perfecto, si el usuario pulsa la tecla de inicio mientras está en la configuración, tendrá un widget en la cola del sistema que realmente no existe en ninguna pantalla de inicio. Por eso los llamo fantasmas. Una vez que un widget ha completado satisfactoriamente la configuración, invocará onDeleted cuando se retire de la pantalla de inicio. Te queda el problema de que, si se han creado fantasmas, onDisabled nunca, nunca, se ejecutará.

Un último cheque. Desde config se ejecuta, usted tiene lo siguiente en su archivo info xml. Pero por si acaso, se ve así:

  android:configure=your.package.name.ConfigurationActivity" 

He resuelto este problema como este,

En el método onUpdate () del proveedor de widgets comprobar si el widget fue configurado, y si no lo era no hago nada, por lo que no hay widgets de fantasmas. Al final de la configuración que acaba de poner a la verdad y estoy bien para ir. Simplemente no olvide eliminarlo de la preferencia compartida cuando se elimina el widget.

 @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); for(final int appWidgetId : appWidgetIds) { final StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(appWidgetId); stringBuilder.append("_conf"); if(context.getSharedPreferences("settings",0).getBoolean(stringBuilder.toString(),false)) updateAppWidget(context,appWidgetId,appWidgetManager); } } 

Parece que hay muchos problemas con widgets desde edades. Dicho esto, al buscar una solución a una de ellas, encontré esta publicación: https://code.google.com/p/android/issues/detail?id=2539#c15

Básicamente la idea es eliminar la actividad de configuración de la aplicación del manifiesto y comprobar durante onUpdate si se ha configurado el widget, si no se abre la actividad de configuración.

Es totalmente transparente para el usuario y se dice que soluciona el problema de "add / zombie widget". Lo intentaré ahora.


Sin embargo, no resuelve el problema con los widgets eliminados que se actualizan al reiniciar, aunque parece que se han corregido en versiones recientes de Android (4.4 y no estoy seguro de cuál).

En las versiones anteriores de Android, observé que todos los widgets que he eliminado manualmente del lanzador se transforman en zombies al reiniciar, el OS llamando de forma efectiva a onUpdate para cada uno de esos widgets, por lo que tuve que mantener una lista de widget eliminado.

Ahora los ID de widget eliminados se reutilizan para los nuevos widgets, así que debo dejar de seguir los widgets eliminados. Lamentablemente no tengo ni idea de cuándo (qué versión de Android) este problema fue corregido y los ID comenzaron a ser reutilizados.

  • Cómo ocultar vistas parcialmente visibles en Android xml layout sin código?
  • Dos botones de widgets de Android que llaman a la misma actividad con diferentes intenciones
  • Obtener la posición de la imagen actual en la Galería
  • ¿Podemos usar CSS en formularios Android para los componentes de Android?
  • Cómo disparar onListItemClick en Listactivity con los botones en la lista?
  • Cómo acceder a las imágenes predeterminadas de Android (por ejemplo, la imagen para el pulgar de seekbar cuando se presiona) de código java?
  • ¿Tiene Android XML Layout 'include' Tag realmente funciona?
  • Cómo ocultar la barra inferior del sistema en la tableta android
  • Cargar imágenes en ImageView en Android
  • Inverted ListView en Android?
  • Android - Personalización del widget Spinner Look and Feel
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.