studio resueltos para intuitivas herramientas ejercicios desarrollo curso con avanzado aplicaciones android android-widget

resueltos - manual android studio avanzado



MĂșltiples instancias de widget solo actualizando el Ășltimo widget (3)

Aquí hay una explicación más detallada de por qué su código no funciona y cómo solucionarlo. De la documentación del SDK de Android:

Un PendingIntent en sí mismo es simplemente una referencia a un token mantenido por el sistema que describe los datos originales utilizados para recuperarlo. Esto significa que, incluso si se cancela el proceso de su aplicación propietaria, el propio PendingIntent seguirá siendo utilizable desde otros procesos que se le hayan dado. Si la aplicación que crea más tarde recupera el mismo tipo de PendingIntent (la misma operación, la misma acción de Intención, datos, categorías y componentes, y los mismos indicadores), recibirá una PendingIntent que representa el mismo token si eso sigue siendo válido, y puede por lo tanto, llame a cancel () para eliminarlo.

Debido a este comportamiento, es importante saber cuándo se considera que dos Intentos son los mismos para los fines de recuperar un PendingIntent. Un error común que cometen las personas es crear múltiples objetos PendingIntent con Intenciones que solo varían en sus contenidos "extra", esperando obtener un PendingIntent diferente cada vez. Esto no sucede. Las partes del Intent que se utilizan para hacer coincidir son las mismas definidas por Intent.filterEquals. Si usa dos objetos de Intent que son equivalentes según Intent.filterEquals, entonces obtendrá el mismo PendingIntent para ambos.

Tenga en cuenta que especificar contenidos "extra" diferentes no es suficiente para que los PendingIntents se consideren únicos, pero establecer un URI único con setData sí lo es. Es por eso que la solución URI de Snailer "mágicamente" soluciona el problema.

La documentación también ofrece una solución diferente (posiblemente más simple) al problema. En lugar de crear un URI personalizado, simplemente configure un código de solicitud único cuando llame a getActivity:

PendingIntent pendingIntent = PendingIntent.getActivity(context, appWidgetId, configIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Fuente: http://developer.android.com/reference/android/app/PendingIntent.html

Tengo un WidgetProvider y una actividad de configuración

Cuando se inicia el widget, comienza con la actividad de configuración y lo configuro haciendo una llamada personalizada al proveedor de widgets

(Lo que notarás es de los ejemplos del tutorial SDK)

// Push widget update to surface with newly set prefix AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); AwarenessWidget.updateAppWidget(context, appWidgetManager, mAppWidgetId, position); // Make sure we pass back the original appWidgetId Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); setResult(RESULT_OK, resultValue); finish();

Paso el ID de widget a la función ... dentro del widget creo un Intent como este:

Intent configIntent = new Intent(context, Configure.class); configIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); PendingIntent pendingIntent = PendingIntent.getActivity (context, 0, configIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.MainImage,pendingIntent); views.setImageViewResource(R.id.MainImage, lv_images[version]); appWidgetManager.updateAppWidget(appWidgetId, views);

Siempre estoy haciendo referencia al ID del widget e incluso lo agrego como un extra en la intención, pero cuando obtengo dos de estos widgets en la pantalla de inicio, el ID del widget siempre está haciendo referencia al último ID del widget colocado


En mis pruebas, usar setData (...) en el PendingIntent no soluciona el problema en un Verizon Thunderbolt que ejecuta Android 4.0.4. Funciona en mis otros dispositivos de prueba y emulador.

Probé el uso del código de solicitud en su lugar, y funciona en todos los casos. Acabo de configurar el código de solicitud para que sea el ID del widget:

pendingIntent = PendingIntent.getService(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);


Tuve un problema similar. Solo agregue esto a su actividad de configuración, donde establece su PendingIntent:

Uri data = Uri.withAppendedPath( Uri.parse(URI_SCHEME + "://widget/id/") ,String.valueOf(appWidgetId)); intent.setData(data);

La variable URI_SCHEME es una cadena, y puede ser lo que quieras ... es decir, "ABCD" Esto hace que cada widget tenga un PendingIntent único.