11

Mam widget Android, który korzysta z usług internetowych do pobierania i wyświetlania danych na widżecie. Widżet ma aktywność konfiguracyjną, która jest extends PreferenceActivity. Czynność konfiguracyjna zostanie uruchomiona natychmiast po zainstalowaniu widgetu, co jest pożądanym zachowaniem tego widgetu.Android Widget: pokazuje aktywność konfiguracji przed dodaniem widgetu do ekranu

Problem polega na tym, że gdy widget jest dodawany do ekranu głównego, widżet podejmuje próbę aktualizacji przed rozpoczęciem/zakończeniem działania konfiguracji, co może potencjalnie prowadzić do dużego opóźnienia (kilka sekund). Czynność konfigurowania powinna nastąpić przed próbą aktualizacji samego widgetu za każdym razem, gdy dodawany jest nowy widget.

Oto sekwencja zdarzeń, które widzę w LogCat kiedy widget dodaje:

  1. Widget.onRecive: action = APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive: akcja = APPWIDGET_UPDATE
  4. Widget.onUpdate: Usługa widgetów jest uruchomiona.
  5. WidgetService.onStartCommand: Potencjalnie długa praca, która opóźni działanie konfiguracyjne od natychmiastowego wyświetlenia.
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive: action = APPWIDGET_UPDATE
  8. Widget.onUpdate: Widget usługa jest uruchomiona ponownie
  9. WidgetService.onStartCommand: Potencjalnie długo działa praca jest wykonywana ponownie.

Co się dzieje, że po dodaniu widgetu usługa uruchomi się przed wyświetleniem widoku konfiguracji.

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> 



Pytanie
Czy istnieje sposób, aby wymusić aktywność konfiguracji, aby być pokazany zanim system próbuje dodać widżet do ekranu głównego?

+1

Miałem nieznany problem. Wywołanie metody update() następuje przed wyświetleniem aktywności konfiguracyjnej. Nie znalazłem sposobu na zmianę tego zachowania. – mrd

Odpowiedz

17

z Android dokumentacji: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

Sposób onUpdate() nie zostanie wywołana gdy Widget App jest tworzony (system nie wyśle ​​transmisję ACTION_APPWIDGET_UPDATE gdy aktywny konfiguracja jest uruchomiony). Obowiązkiem czynności konfiguracyjnej jest żądanie aktualizacji z AppWidgetManager po utworzeniu widgetu aplikacji. Jednak funkcja onUpdate() będzie wywoływana dla kolejnych aktualizacji - jest pomijana tylko za pierwszym razem.

JEDNAK, to nie wydaje się być poprawne!

To, co zrobiłem, to dodanie wartości boolowskiej do SharedPreferences, która mówi mi, czy ten widget widget został już skonfigurowany. Jeśli nie, pomiń tę aktualizację. Zaimplementuj to w swojej metodzie onUpdate klasy AppWidgetProvider.

+0

Widzę również ACTION_APPWIDGET_UPDATE wywoływane przed uruchomieniem działania konfiguracji – scottyab

+7

Wygląda na to, że dokumentacja jest przestarzała, a oni nie aktualizują jej. – Tarantula

+1

Ten problem jest zgłaszany na stronie https://code.google.com/p/ android/issues/detail? id = 3696 –

-1

stwierdzenie ActivityConfig w manifeście:

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

widget z klasą aktualizacja:

public abstract class SampleWiget extends AppWidgetProvider { 

}

śledzić android developer widget support to zrozumieć.

Powiązane problemy