Android Widget: muestra la actividad de configuración antes de que el widget se agregue a la pantalla.

Tengo un Widget de Android que utiliza 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.

El problema es que cuando se agrega un widget a la pantalla de inicio, el widget intenta actualizarse antes de que se inicie o termine la actividad de configuración, lo que puede conducir potencialmente a un largo retraso (varios segundos). La actividad de configuración debe ocurrir antes de que el widget intente actualizarse cada vez que se añade un nuevo widget.

Esta es la secuencia de eventos que veo en LogCat cuando se agrega un widget:

  1. Widget.onRecive: action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: action = APPWIDGET_UPDATE
  4. Widget.onUpdate: Se ha iniciado el servicio Widget.
  5. WidgetService.onStartCommand: Trabajo de ejecución potencialmente largo que retrasará la actividad de configuración de ser mostrado inmediatamente.
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: action = APPWIDGET_UPDATE
  8. Widget.onUpdate: El servicio de widgets se inicia de nuevo
  9. WidgetService.onStartCommand: El trabajo de ejecución potencialmente largo se vuelve a realizar.

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 alguna manera de forzar la actividad de configuración para que se muestre antes de que el sistema intente agregar el widget a la pantalla de inicio?

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

El método onUpdate () no se llamará cuando se cree el Widget de la aplicación (el sistema no enviará la transmisión ACTION_APPWIDGET_UPDATE cuando se inicia una Actividad de configuración). Es responsabilidad de la actividad de configuración solicitar una actualización de AppWidgetManager cuando se crea por primera vez el Widget de la aplicación. Sin embargo, onUpdate () se llamará para actualizaciones posteriores, sólo se omite la primera vez.

SIN EMBARGO, esto no parece ser correcto!

Lo que hice fue añadir un booleano a SharedPreferences que me dice si este widgetId ha pasado por la configuración. Si no omite esta actualización. Implementar esto en el método onUpdate de su clase AppWidgetProvider.

Declare 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 la clase de widget de actualización:

 public abstract class SampleWiget extends AppWidgetProvider { 

}

Siga el soporte para desarrolladores de Android para comprenderlo.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.