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:
- Documentación incompleta de Android para el método Environment.getExternalStorageDirectory ()
- ¿Cómo gestionar la documentación de usuario de una aplicación de Android?
- ¿Cómo podría SystemClock.uptimeMillis () siempre envolver?
- Directorio de iconos y pantallas splash de Cordova
- ¿Cómo configurar IntelliJ para Mac para mostrar la documentación de Java y Android dentro del editor (offline, no en línea)?
… .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?
- Mezcla de archivos de audio
- Diálogo de confirmación de Android SMS
- ¿Hay un documento / manual de ayuda estándar en Android?
- Documentación multilingüe de Android Sdk
- ¿Dónde está la documentación de filterscript (y cómo puedo usarla)?
- ¿Dónde está la documentación de Fragment.onCreateAnimator ()?
- ¿Dónde está la documentación completa sobre las formas XML de Android?
- ¿Dónde en el árbol de proyectos de una aplicación de Android para poner la documentación de los desarrolladores?
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
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); } }
- File Observer no funciona desde el servicio de intenciones
- Referencia de activos de WebView de Android