11

我有一個Android小工具,它使用Web服務檢索並顯示小部件上的數據。該小部件的配置活動爲extends PreferenceActivity。只要安裝了小部件,配置活動就會啓動,這是此小部件所需的行爲。Android小工具:顯示小部件添加到屏幕前的配置活動

問題是,無論何時將小部件添加到主屏幕,小部件都會在啓動/完成配置活動之前嘗試更新iteself,這可能會導致很長的延遲(幾秒鐘)。配置活動應該在小部件每次添加新小部件時嘗試更新自身之前進行。

這裏是我看到在logcat的事件序列當添加小部件:

  1. Widget.onRecive:行動= APPWIDGET_ENABLED
  2. Widget.onEnabled
  3. Widget.onReceive:動作= APPWIDGET_UPDATE
  4. Widget.onUpdate:Widget服務已啓動。
  5. WidgetService.onStartCommand:潛在的長時間運行的工作,它會延遲配置活動立即顯示。
  6. WidgetConfiguration.onCreate
  7. Widget.onReceive:行動= APPWIDGET_UPDATE
  8. Widget.onUpdate:件服務再次
  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 2012-05-13 21:00:24

回答

17

從Android文檔: http://developer.android.com/guide/topics/appwidgets/index.html#Configuring

在創建應用程序的widget時的onUpdate()方法將不被調用(系統不會當配置活動被啓動發送ACTION_APPWIDGET_UPDATE廣播)。當App Widget首次創建時,配置Activity負責從AppWidgetManager請求更新。但是,onUpdate()將被調用用於後續更新 - 它只是第一次跳過。

然而,這似乎並不正確!

我所做的是向SharedPreferences添加一個布爾值,告訴我這個widgetId是否已經通過配置。如果不跳過此更新。在你的AppWidgetProvider類的onUpdate方法中實現它。

+0

在配置活動啓動之前,我還看到了ACTION_APPWIDGET_UPDATE調用 – scottyab 2012-09-03 20:52:25

+7

似乎文檔已過時,而且它們不會更新它。 – Tarantula 2012-11-16 18:01:36

+1

此問題在https://code.google.com/p/中報告android/issues/detail?id = 3696 – 2014-03-08 18:09:41

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

有了更新widget類:

public abstract class SampleWiget extends AppWidgetProvider { 

}

遵循android developer widget support去了解它。

相關問題