Evitar el desencadenamiento de onUpdate de WidgetProvider

Estoy implementando un Widget que tiene una ConfigurationActivity, y debe permanecer compatible con Eclair (2.1).

La documentación sobre el método onUpdate de onUpdate establece claramente que:

… .Sin embargo, si ha declarado una actividad de configuración, este método no se llama cuando el usuario agrega el Widget de la aplicación, pero se le llama para las actualizaciones posteriores. Es responsabilidad de la actividad de configuración realizar la primera actualización cuando se realiza la configuración. (Consulte Creación de una actividad de configuración de Widget de aplicación a continuación.)

Desafortunadamente esto no es cierto (al menos para mi Nexus S con JellyBean). De hecho, onUpdate se llama antes onCreate de mis activadores ConfigurationActivity. Quiero saber, si hay un comportamiento similar en otros teléfonos, y si es posible evitar la llamada onUpdate dentro de mi proveedor?

Mi solución es almacenar un indicador en SharedPreferences dentro de mi WidgetConfigurationActivity con ese AppWidgetId en particular. Si no está allí, puedo suponer que ConfigurationActivity no se llamó primero. Esto funciona, pero es en mi punto de vista muy feo. Si no puedo evitar que onUpdate , ¿hay una solución mejor?

Sí, onUpdate () se llama cuando se agrega un widget en la pantalla de inicio. Mira aquí:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

http://developer.android.com/reference/android/appwidget/AppWidgetManager.html#ACTION_APPWIDGET_UPDATE

No estoy seguro si hay una manera de no disparar cuando se crea un widget. Pero puede detener la activación de nuevo estableciendo el campo "updatePeriodMillis" en el archivo XML de información de widgets en 0 o simplemente dejándolo en blanco .

Otra forma sería almacenar los identificadores de widget en alguna parte. Ahora, cada vez que se agrega un nuevo widget, en su clase Receiver, compruebe si el ID ya existe o no. Si no existe (es decir, un nuevo widget), entonces no ejecutar ningún código. Además, elimine la ID de widget de sus registros siempre que se elimine un widget. Dado que existe la posibilidad de que haya eliminado un widget, posteriormente agregó un nuevo widget que tiene el mismo ID que el antiguo.

¡Espero que ayude!

EDIT: En el método onReceive () en su clase Receiver, haga lo siguiente:

 public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); if( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID ) { super.onReceive(context, intent); } } 

Cuando un widget se selecciona por primera vez en la lista de widgets, su appWidgetId será igual a INVALID_APPWIDGET_ID hasta que se agregue en la pantalla de inicio. Dado que "super.onReceive ()" llama al método onUpdate () cuando se selecciona un widget, onUpdate () no se llamará la primera vez.

Tengo este error también.

Incluso he puesto updatePeriodMillis a 0. Mi onUpdate se está ejecutando antes de iniciar la configuración de la actividad Widget. Creo que esto es un error en el widget de Android.

He resuelto este problema mediante la adición de una acción a la intención en onUpdate, a continuación, hacer un if check onReceive para ver si se hizo clic en el widget:

He añadido intentClick.setAction(WIDGET_CLICKED); Que sólo se activa cuando se hace clic en el widget.

 public class WidgetProvider extends AppWidgetProvider { private static final String TAG = WidgetProvider.class.getSimpleName(); private static String WIDGET_CLICKED = "widget_clicked"; public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.e(TAG, "onUpdate()"); remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); watchWidget = new ComponentName(context, WidgetProvider.class); Intent intentClick = new Intent(context, WidgetProvider.class); intentClick.setAction(WIDGET_CLICKED); intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, "" + appWidgetIds[0]); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0], intentClick, 0); remoteViews.setOnClickPendingIntent(R.id.img_btn, pendingIntent); remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); appWidgetManager.updateAppWidget(watchWidget, remoteViews); } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); Log.e(TAG, "onReceive()"); Bundle extras = intent.getExtras(); //If AND ONLY IF WIDGET_CLICKED if (extras != null && intent.getAction().equals(WIDGET_CLICKED)) { remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); //If isPlaying if (isPlaying) { //setBackground as PLAY remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play); isPlaying = false; Intent i = new Intent(context, MediaPlayerService.class); i.putExtra("command", "stopSong"); context.startService(i); //If NOT playing } else { //setBackground as STOP remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.stop); isPlaying = true; Intent i = new Intent(context, MediaPlayerService.class); i.putExtra("command", "playRandomSong"); context.startService(i); } watchWidget = new ComponentName(context, WidgetProvider.class); (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews); } } 
  • Problema de auto popup de la documentación de Android Studio
  • ¿Dónde puedo descargar los documentos de la API para Android?
  • ¿Dónde puedo descargar la documentación de Android SDK?
  • ¿Qué significa esta línea? LOCAL_EXPORT_C_INCLUDES
  • ¿Cómo puedo agregar selectableItemBackground a un ImageButton mediante programación?
  • Documentación de las tareas Ant disponibles para Android?
  • Comprensión adicional setRetainInstance (true)
  • ¿Está correcta la documentación de Android Cursor.moveToNext ()?
  • Documentación para estilos en recursos de Android
  • Documentación para android cts api
  • Cómo obtener la documentación de la API de Android en Eclipse
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.