19

estoy poniendo en práctica un widget y estoy frente a los siguientes problemas:Widget onUpdate llama cuando se puso en marcha Configuración Actividad

1)onUpdate se llama cuando añado el widget a la pantalla de inicio, incluso si especificó una actividad de configuración. Tan pronto como lo agregue a la pantalla de inicio, se envía la emisión APPWIDGET_ENABLED, seguido del 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, no se debe llamar al método onUpdate.

2)onUpdate no se llama cada updatePeriodMillis segundos, que han sido establecidos a 10000, es decir 10 segundos para propósitos de prueba .. ¿Me he perdido algo en la declaración receiver dentro del archivo de manifiesto? Sigo recibiendo la advertencia de Pelusa Receptor exportado no requiere permiso pero creo que esto es un problema de pelusa y no es mi culpa. EDIT: 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 he especificado y he cambiado el tiempo a 1800000 milisegundos.

3) Quiero ofrecer mi propia acción de difusión para el proveedor de widgets, ¿es correcto añadir otro bloque receiver en el Manifiesto de la orientación de la misma clase de proveedor o debería agregar sólo otra acción intención dentro de la intent-filter que contiene la acción APPWIDGET_UPDATE? Por cierto, he comentado mi segundo bloque receiver y no es la causa de los problemas anteriores. Creé otro bloque receiver porque quería declararlo como no exportado, para permitir que la acción intent-filter se active solo por mi código de aplicación y 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> 
+3

Para ** 1) ** Vea mi respuesta aquí: http://stackoverflow.com/a/12236443/380151 – Spiff

+0

@Spiff así es como resolví el problema, usando una preferencia compartida booleana * isInitialized_ID * por -widget instancia. Gracias. –

+2

¿Puede proporcionar más descripciones sobre su solución? Tal vez algún ejemplo de código? – DrHolera

Respuesta

0

Proporcionar una respuesta después de cavar en el código fuente:

1) Este es el comportamiento esperado ver here

Este método también es llamado cuando el usuario añade la App Widget

2) Parece que ha encontrado su propia respuesta.Para otros que buscan la documentación ir here

Nota: Las actualizaciones solicitadas con updatePeriodMillis no se entregarán más de una vez cada 30 minutos

3) Desde el AppWidgetProvider extiende BroadcastReceiver pero no se declara definitiva 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 onRecibir en su MyWidgetProvider clase y si la acción es su mango acción personalizada, de lo contrario llamar a la super.onRecieve (contexto Contexto, la intención Intención), así:

@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 directamente las transmisiones de Widget de aplicación, puede implementar su propio BroadcastReceiver o anular la devolución de llamada onReceive (Contexto, Intención).

Una cosa a tener en cuenta con esto, la actualización de la vista remota solo se ejecutará en 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!

Cuestiones relacionadas