tutorial - tipos de widgets en android
Widget onUpdate llamado cuando se inicia la actividad de configuración (1)
Proporcionar una respuesta después de excavar en el código fuente:
1) Este es el comportamiento esperado ver here
Este método también se llama cuando el usuario agrega el widget de aplicación
2) Parece que has encontrado tu propia respuesta. Para otros que buscan los documentos, vete here
Nota: las actualizaciones solicitadas con updatePeriodMillis no se entregarán más de una vez cada 30 minutos
3) Ya que el AppWidgetProvider
extiende BroadcastReceiver
pero no se declara definitivo, puede agregar la acción desde su segundo receptor
<receiver android:name="MyWidgetProvider"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_widget_info" />
</receiver>
luego puede anular onReceive en su clase MyWidgetProvider
y si la acción es su acción personalizada, manéjelo a super.onRecieve (contexto de contexto, intención de intento) de esta manera:
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction()
.equals("org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE")){
// handle your action
} else {
super.onRecieve(context, intent);
}
}
Según la Guía:
AppWidgetProvider es solo una clase de conveniencia. Si desea recibir las transmisiones del Widget de la aplicación directamente, puede implementar su propio BroadcastReceiver o anular la devolución de llamada onReceive (Context, Intent).
Una cosa a tener en cuenta con esto, la actualización a la vista remota solo se activará en el updatePeriodMillis, independientemente de que agregue su propia acción a la Intención para que el proveedor la maneje.
Buena suerte y feliz codificación!
Estoy implementando un widget y estoy enfrentando los siguientes problemas:
1) onUpdate
se llama cuando agrego el widget a la pantalla de inicio, incluso si especificé una Actividad de configuración. Tan pronto como lo agrego a la pantalla de inicio, se APPWIDGET_ENABLED
transmisión de APPWIDGET_ENABLED
, seguida de APPWIDGET_UPDATE
y luego se inicia la actividad de configuración ... ¿Es esto un error? ¿Cómo debo entender en el método onUpdate
que se invoca antes de que la actividad de configuración haya regresado? Puedo hacerlo a través de un valor de preferencia compartido, pero me gustaría que se comporte como está escrito en la guía del desarrollador, es decir, el método onUpdate
no debe llamarse.
2) onUpdate
no se llama cada updatePeriodMillis
segundos, que se han establecido en 10000
, es decir, 10
segundos para propósitos de prueba. ¿Perdí algo en la declaración del receiver
dentro del archivo Manifest? Sigo recibiendo la advertencia de Lint El receptor exportado no requiere permiso, pero creo que esto es un problema de Lint y no es mi culpa. EDITAR : Acabo de encontrar esto en los documentos de referencia: Nota: Las actualizaciones solicitadas con updatePeriodMillis no se entregarán más de una vez cada 30 minutos. Por lo tanto, es correcto que el widget no se actualice con la frecuencia que especifiqué y he cambiado el tiempo a 1800000
milisegundos.
3) Quiero enviar mi propia acción de difusión al proveedor del widget, ¿es correcto agregar otro bloque receiver
en el Manifest dirigido a la misma clase de proveedor o debo agregar solo otra acción de intención dentro del intent-filter
que contiene la acción APPWIDGET_UPDATE
? Por cierto, he comentado mi segundo bloque de receiver
y no es la causa de los problemas anteriores. Creé otro bloque de receiver
porque quería declararlo como no exportado, para permitir que la acción del intent-filter
sea activada solo por el código de mi aplicación y no por nadie más.
AndroidManifest.xml
<receiver android:name="MyWidgetProvider"
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/my_widget_info" />
</receiver>
<receiver android:name="MyWidgetProvider"
android:exported="false">
<intent-filter>
<action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
</intent-filter>
</receiver>
my_widget_info.xml
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="294dp"
android:minHeight="110dp"
android:updatePeriodMillis="1800000"
android:initialLayout="@layout/my_widget_layout"
android:configure="org.test.mywidget.MyWidgetConfiguration"
android:resizeMode="none">
</appwidget-provider>