19

我採取一個小窗口,我面臨着以下問題:窗口小部件的onUpdate調用時配置活動推出

1)onUpdate,當我的小部件添加到主屏幕被調用,即使我指定配置活動。只要我將它添加到主屏幕,發送APPWIDGET_ENABLED廣播,然後APPWIDGET_UPDATE,然後配置活動啓動..這是一個錯誤?在配置活動返回之前,我應該如何理解onUpdate正在調用的方法?我可以通過共享的首選項值來實現,但我希望它的行爲與開發人員指南中的相同,即不應調用onUpdate方法。

2)onUpdate不叫每updatePeriodMillis秒,已被設置爲10000,即10秒用於測試目的..我錯過清單文件內的receiver申報的東西嗎?我一直收到林特警告導出的接收器不需要許可但我認爲這是一個Lint問題,不是我的錯。 編輯:我剛剛在參考文檔中發現了這個:注意:使用updatePeriodMillis請求的更新不會每30分鐘發送一次。因此,小部件未更新的頻率是正確的,我已將時間更改爲1800000毫秒。

3)我想送我自己的廣播動作控件提供者,是正確的在清單中添加另一receiver塊針對同一供應商類或者我應該包含intent-filter中只添加另一種意圖行動動作是APPWIDGET_UPDATE?順便說一句,我已經評論我的第二個receiver區塊,它不是上述問題的原因。我創建了另一個receiver塊,因爲我想將其聲明爲未導出,以便讓intent-filter操作僅由我的應用程序代碼而不是其他任何人觸發。

的AndroidManifest.xml

<receiver android:name="MyWidgetProvider" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.appwidget.provider" 
      android:resource="@xml/my_widget_info" /> 
    </receiver> 
    <receiver android:name="MyWidgetProvider" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" /> 
     </intent-filter> 
    </receiver> 

my_widget_info.xml

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:minWidth="294dp" 
    android:minHeight="110dp" 
    android:updatePeriodMillis="1800000" 
    android:initialLayout="@layout/my_widget_layout" 
    android:configure="org.test.mywidget.MyWidgetConfiguration" 
    android:resizeMode="none"> 
</appwidget-provider> 
+3

對於** 1)**請參閱我的答案在這裏:http://stackoverflow.com/a/12236443/380151 – Spiff 2012-09-03 14:12:47

+0

@Spiff這是我如何解決這個問題,通過使用* isInitialized_ID *布爾共享首選項-widget實例。謝謝。 – 2012-09-04 14:10:36

+2

您能否提供關於您的解決方案的更多描述?也許一些代碼示例? – DrHolera 2016-03-18 10:39:55

回答

0

挖掘到的源代碼之後提供一個答案:

1)這是預期行爲見here

這種方法,當用戶添加該應用的Widget

2)看來你已經找到自己的答案也被稱爲。對於其他人尋找文檔去here

注:與updatePeriodMillis要求的更新將不低於每30分鐘一次

3)由於AppWidgetProvider延伸BroadcastReceiver但沒有宣佈最終傳遞更多你可以添加從你的第二個接收器的動作

<receiver android:name="MyWidgetProvider" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" /> 
     </intent-filter> 

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

然後你可以覆蓋onReceive在你的MyWidgetProvider類,如果行動是你的自定義操作手柄,否則打電話到super.onRecieve(上下文的背景下,意圖意圖),像這樣:

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction() 
     .equals("org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE")){ 
     // handle your action 
    } else { 
     super.onRecieve(context, intent); 
    } 
} 

按照該指南:

的AppWidgetProvider是隻是一個便利的課程。如果您希望 直接接收App Widget廣播,則可以實現您自己的 BroadcastReceiver或覆蓋onReceive(Context,Intent)回調。

有一點需要注意,遠程視圖的更新只會在updatePeriodMillis上調用,無論您將自己的操作添加到供應商處理的Intent中。

好運和快樂編碼!

相關問題