Problemas con appwidget appWidgetIds (instancias reales y fantasmas de widget)

Colegas Mi problema es: Tengo un Widget de aplicación con la actividad de configuración (min SDK – 2.1), funciona correctamente, pero a veces comienza a trabajar más lentamente. Inicié sesión y descubrí que antes de actualizar mi método Widget de aplicación onUpdate recibió una matriz de ID de Widget de la aplicación

@Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.d("onUpdate", Arrays.toString(appWidgetIds)); 

Pero la verdad es que yo tenía sólo dos instancias de App Widget en la pantalla de inicio, pero el lenth de matriz es más de 2 (dos): 4, a veces 5 o 6. ¿Cómo puede ser así? La razón de la lentitud de mis Actualizaciones de AppWidget es que tengo que llamar a onUpdate-method para todos los ids pero algunos ids (como uno dice "widgets fantasma") no son reales y correctos.

Tal vez, alguien se ha encontrado con tal problema y me ayudaría a averiguar cómo manejar sólo los identificadores de widget de aplicación real.

PS Desinstalar y luego reinstalar el widget de la aplicación (y después de que todos los widgets de fantasmas se fueron) – no son la solución adecuada de mi problema. Me gustaría controlar el fantasma y el widget real programáticamente.

¿Alguien sabe cómo solucionar este error?

Este código borrará los widgets (todos, incluso los que aparecen en la pantalla), por lo que no es la solución ideal

 ComponentName cn = new ComponentName(getApplicationContext(), YourWidget.class); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); int[] appWidgetIds1 = appWidgetManager.getAppWidgetIds(cn); AppWidgetHost host = new AppWidgetHost(getApplicationContext(), 0); for (int appWidgetId : appWidgetIds1) { host.deleteAppWidgetId(appWidgetId); } 

Todavía tiene problemas con la eliminación de los widgets de Lock Screen en 4.2 (onReceive nunca llamado)

Ok, he buscado un poco en la web y averiguar, que esto parece ser un allover bug android que no es fijo ahora. Si es posible, intente borrar la caché. Ir a la configuración -> aplicaciones -> administrar aplicaciones. A continuación, vaya a su aplicación de inicio-lanzador y limpie la memoria caché. A continuación, reinicia tu aplicación y comprueba si todavía hay widgets de aplicaciones antiguos. He encontrado algunos interesantes en la web sobre esto:

http://forum.xda-developers.com/showthread.php?t=1030804

http://eagle.phys.utk.edu/guidry/android/appWidget.html

Incluso esto se discute en la página de desarrolladores de Android y el Grupo-Post:

http://developer.android.com/guide/topics/appwidgets/index.html#AppWidgetProvider

https://groups.google.com/forum/?fromgroups=#!msg/android-developers/Nl0e06rDCRY/4nAh3xnKBeQJ

Hablan de un problema en 1.5, pero creo que es un problema, incluso con los sistemas superiores. En el post del grupo hay un ejemplo de cómo arreglar esto:

  @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) { final int appWidgetId = extras.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) { this.onDeleted(context, new int[] { appWidgetId }); } } else { super.onReceive(context, intent); } } 

Parece que no todos los widgets de aplicaciones se eliminan automáticamente, incluso si el usuario elimina la aplicación o reemplaza el widget desde la pantalla de inicio. Por favor, déme algunos comentarios si esta es la dirección correcta. Si es así, necesitamos otro enfoque para este problema. Para mí también es interesante, pero por el momento no tengo computadora portátil aquí para comprobarlo. Gracias

Tuve el mismo problema en una aplicación que escribí antes de un mes, en mi caso no importa. He encontrado un tutorial de cómo eliminar "widgets fantasma". Nunca lo probé, sólo inténtelo:

http://blog.fiziksphreak.com/2011/07/28/remove-phantom-widgets-in-android/

Pero, ¿estás seguro de que esto está ralentizando tu aplicación? No puedo imaginar que esto sería caro en recursos?

EDITAR

En lugar de matar aplicaciones antiguas, esto podría ayudar:

  Bundle extras = intent.getExtras(); int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 

o

  Bundle extras = intent.getExtras(); int[] appWidgetIds = extras.getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

No sé si esto es lo que buscas.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.