轉載自:http://www.eoeandroid.com/thread-71213-1-1.html
這是我們這個小項目的最後一篇了,大家一定是非常期待的,那麼我們就來看看這最後一篇的內容吧。
注意: 因爲這個AppWidgetProvider 是一個廣播接收器BroadcastReceiver,不能保證你的進程在回調函數返回後仍然繼續運行(參見應用程序基礎>廣播接收器的生命週期 Application Fundamentals > Broadcast Receiver Lifecycle以獲取更多信息)。如果你的App Widget設置過程能持續幾秒鐘(也許當執行網頁請求時)而且你要求你的進程繼續,考慮在onUpdated()方法裏啓動一個服務Service 。從這個服務裏,你可以執行自己的App Widget更新,而不必擔心AppWidgetProvider 由於一個應用程序無響應錯誤Application Not Responding (ANR)而關閉。參見Wiktionary sample's AppWidgetProvider,這是個App Widget運行一個Service的例子。
同樣參見ExampleAppWidgetProvider.java 例子類。
接收App Widget廣播意圖
AppWidgetProvider 只是一個簡便類。如果你想直接接收App Widget 廣播,你可以實現自己的BroadcastReceiver 或者重寫 onReceive(Context, Intent) 回調函數。你需要注意的4個意圖如下:
Java代碼:
ACTION_APPWIDGET_UPDATE
ACTION_APPWIDGET_DELETED
ACTION_APPWIDGET_ENABLED
ACTION_APPWIDGET_DISABLED
創建一個App Widget 配置活動
如果你想讓用戶在添加一個新的App Widget時調整設置,你可以創建一個App Widget配置活動。這個活動將被App Widget宿主自動啓動並允許用戶在創建時配置可用的設置,比如App Widget顏色,尺寸,更新週期或者其它功能設置。
這個配置活動應該在Android清單文件中聲明爲一個通用活動。不過,它將被通過ACTION_APPWIDGET_CONFIGURE活動而被App Widget宿主啓動,因此這個活動需要接受這個意圖。比如:
Java代碼:
< activity android:name=".ExampleAppWidgetConfigure">
< intent-filter>
< action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
< /intent-filter>
< /activity>
同樣的,活動必須在AppWidgetProviderInfo XML 文件中聲明,通過android:configure屬性(參見上面的添加AppWidgetProviderInfo元數據Adding the AppWidgetProviderInfo Metadata)。比如,配置活動可以聲明如下:
Java代碼:
< appwidget-provider xmlns:android=http://schemas.android.com/apk/res/android
...
android:configure="com.example.android.ExampleAppWidgetConfigure"
... >
< /appwidget-provider>
注意這個活動是用全名聲明的,因爲它將從你的程序包外被引用。
這就是所有關於配置活動你一開始需要了解的。現在你需要一個真實的活動。這兒就有,不過,當你實現這個活動時記住兩件重要的事情:
App Widget 宿主調用配置活動而且配置活動應該總是返回一個結果.這個結果應該包含這個通過啓動該活動的意圖傳遞的App Widget ID(以EXTRA_APPWIDGET_ID保存在意圖的附加段Intent extras中)
當這個 App Widget 被創建時將不會調用onUpdate() 方法(當一個配置活動啓動時,系統將不會發送ACTION_APPWIDGET_UPDATE廣播).配置活動應該在 App Widget 第一次被創建時負責從AppWidgetManager請求一個更新.不過, onUpdate() 將在後續更新中被調用-只忽略第一次.
參見下面章節的代碼片斷,該示例說明了如何從配置中返回一個結果並更新這個App Widget.
從配置活動中更新一個App Widget
當一個App Widget使用一個配置活動,那麼當配置結束時,就應該由這個活動來更新這個App Widget.你可以直接AppWidgetManager裏請求一個更新來這麼做.
下面是恰當的更新App Widget 以及關閉配置活動這個過程的一個概要描述:
1. 首先,從啓動這個活動的意圖中獲取App Widget ID:
Java代碼:
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
2. 實施你的App Widget 配置。
3. 當配置完成後,通過調用getInstance(Context)獲取一個AppWidgetManager實例:
Java代碼:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
4. 以一個RemoteViews佈局調用updateAppWidget(int, RemoteViews)更新App Widget:
Java代碼:
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
5. 最後,創建返回意圖,設置活動結果,並結束這個活動:
Java代碼:
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
setResult(RESULT_OK, resultValue);
finish();
提示: 當你的配置活動第一次打開時,設置活動結果爲RESULT_CANCELED。這樣,如果用戶在結束之前從活動外返回,這個App Widget 宿主會接收到配置取消通知而不會添加這個App Widget。