11

У меня есть Android-виджет, который использует веб-службы для извлечения и отображения данных в виджетах. Виджет имеет конфигурационную активность, которая extends PreferenceActivity. Активность конфигурации запускается сразу после установки виджета, что является желательным поведением для этого виджета.Android-виджет: показать активность конфигурации перед добавлением виджета на экран

Проблема заключается в том, что всякий раз, когда виджет добавляется на главный экран, виджет пытается обновить его до того, как будет запущено/завершено действие конфигурации, что может потенциально привести к длительной задержке (несколько секунд). Активность конфигурации должна произойти до того, как виджет попытается обновить себя в любое время, когда будет добавлен новый виджет.

Вот последовательность событий, которые я вижу в LogCat, когда виджет добавлен:

  1. Widget.onRecive: действие = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: действие = APPWIDGET_UPDATE
  4. Widget.onUpdate: запускается служба виджета.
  5. WidgetService.onStartCommand: Потенциально длинная работа, которая будет задерживать активность конфигурации сразу же.
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: действие = APPWIDGET_UPDATE
  8. Widget.onUpdate: Widget Service запускается снова
  9. WidgetService.onStartCommand: Потенциально долго выполняющиеся работа выполняется снова.

Что происходит, когда добавляется виджет, служба запускается до отображения вида конфигурации.

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> 



Вопрос
Есть ли способ заставить активность конфигурации, который будет показан перед системой пытается добавить виджет на главном экране?

+1

У меня была знакомая проблема. Вызов метода update() происходит до отображения активности конфигурации. Я не нашел способа изменить это поведение. – mrd

ответ

17

От андроида документации: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

Метод OnUpdate() не будет вызываться, когда App Widget создается (система не будет посылать ACTION_APPWIDGET_UPDATE вещания, когда конфигурация активности запускается). Задание конфигурации запрашивает обновление из AppWidgetManager при первом создании виджета приложения. Однако onUpdate() будет вызываться для последующих обновлений - он пропускается только в первый раз.

ОДНАКО, это не кажется правильным!

Что я сделал, добавлял логическое значение в SharedPreferences, которое сообщает мне, был ли этот widgetId через конфигурацию. Если вы не пропустите это обновление. Внедрите это в свой метод onUpdate класса AppWidgetProvider.

+0

Я также вижу ACTION_APPWIDGET_UPDATE, который вызывается перед запуском конфигурации. – scottyab

+7

Похоже, что документация устарела, и они просто не обновляют ее. – Tarantula

+1

Эта проблема возникает на https://code.google.com/p/ android/issues/detail? id = 3696 –

-1

Объявить ActivityConfig в манифесте:

<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>

С Классом обновление виджета:

public abstract class SampleWiget extends AppWidgetProvider { 

}

следовать android developer widget support, чтобы понять это.

Смежные вопросы