11

Tengo un widget de Android que usa servicios web para recuperar y mostrar los datos en el widget. El widget tiene una actividad de configuración que extends PreferenceActivity. La actividad de configuración se inicia tan pronto como se instala el widget, que es el comportamiento deseado para este widget.Android Widget: muestra la actividad de configuración antes de agregar el widget a la pantalla

El problema es que cada vez que se agrega un widget a la pantalla de inicio, el widget intenta actualizarse antes de iniciar/completar la actividad de configuración, lo que puede ocasionar un gran retraso (varios segundos). La actividad de configuración debe ocurrir antes de que el widget intente actualizarse en sí mismo cada vez que se agrega un nuevo widget.

Aquí es la secuencia de eventos que estoy viendo en LogCat cuando se añade un widget:

  1. Widget.onRecive: action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: acción = APPWIDGET_UPDATE
  4. Widget.onUpdate: El servicio de widgets se ha iniciado.
  5. WidgetServicio.onStartCommand: trabajo de ejecución potencialmente largo que retrasará la actividad de configuración para que se muestre inmediatamente.
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: action = APPWIDGET_UPDATE
  8. Widget.onUpdate: Widget servicio se inicia de nuevo
  9. WidgetService.onStartCommand: Potencialmente larga duración se realiza el trabajo de nuevo.

Lo que sucede es que cuando se agrega un widget, el servicio se iniciará antes de que se muestre la vista de configuración.

Manifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xxx.xxx.xxxwidget" 
    android:versionCode="1" 
    android:versionName="@string/app_version" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:debuggable="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver android:name="xxxWidget" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_info" /> 
     </receiver> 

     <activity android:name="xxxWidgetConfigure" > 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service android:name="xxxWidgetService" /> 
    </application> 

</manifest> 



Pregunta
¿Hay una manera de forzar la actividad de configuración que se muestra antes de que el sistema trata de añadir el widget a la pantalla de inicio?

+1

Tuve un problema similar. La llamada al método update() ocurre antes de que se muestre la actividad de configuración. No encontré la manera de cambiar este comportamiento. – mrd

Respuesta

17

De la documentación androide: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

El método onUpdate() no se llamará cuando se crea la aplicación de widgets (el sistema no enviará la emisión ACTION_APPWIDGET_UPDATE cuando se puso en marcha una actividad de configuración). Es responsabilidad de la Actividad de configuración solicitar una actualización desde el AppWidgetManager cuando se crea el widget de la aplicación. Sin embargo, se llamará a onUpdate() para actualizaciones posteriores; solo se salta la primera vez.

SIN EMBARGO, esto no parece ser correcto!

Lo que hice fue agregar un booleano a SharedPreferences que me dice si este widgetId ha pasado por la configuración. Si no se salta esta actualización. Implemente esto en su clase AppWidgetProvider 'onUpdate method.

+0

También estoy viendo el ACTION_APPWIDGET_UPDATE llamado antes de que se inicie la actividad de configuración – scottyab

+7

Parece que la documentación está obsoleta y simplemente no la actualizan .. – Tarantula

+1

Este problema se informa en https://code.google.com/p/ android/issues/detail? id = 3696 –

-1

Declarar ActivityConfig en el manifiesto:

<activity android:name="com.zoostudio.moneylover.widget.ActivityWidgetConfig" android:label="Hello Widget Config"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity>

Con clase widget de actualización:

public abstract class SampleWiget extends AppWidgetProvider { 

}

siguen android developer widget support para entenderlo.

Cuestiones relacionadas