AppWidget 視窗小組件的開發思想和Demo
這篇文章講一下android系統“視窗小組件”(也叫做,主畫面組件)的開發過程。什麼叫視窗小組件呢?
是指在主畫面上顯示的獨立視圖(不過填充了資料)。這些視圖的資料內容由後台進程頂起更新。要用到RemoteViews來
顯示組件,還要指派廣播接收器更新這些RemoteViews. 既可以單獨做個視窗小組件,也可在App中嵌入多個視窗小組件。
如<圖一>就是人人網用戶端帶個一個小組件和Google play的小組件。
<圖一>
接下來就以"生日提醒通知"的例子簡述下小組件的開發思想。
一:首先需要聲明一個appwidget-provider控制項
在res→xml裡定義一個檔案AppWidgetProviderInfo.xml檔案。
<?xml version="1.0" encoding="utf-8"?><appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="150dp" //寬(這個有講究,文章最後有注釋*) android:minHeight="120dp" //長 android:updatePeriodMillis="86400000" //更新頻率 ms為單位 android:initialLayout="@layout/bday_widget" //布局檔案 android:configure="com.carman.birthdayremind.ConfigureBDayWidgetActivity" > //配置活動(可選) </appwidget-provider>
android:initialLayout這個屬性就是你所要顯示的介面,根據自己的需求來設計。
二:AppWidgetProvider 類的實現
要實現視窗小組件的開發,必須繼承AppWidgetProvider 的子類。實現定義基本方法以允許你編程來和App Widget串連,這基於廣播 事件。通過它,當這個App Widget被更新,啟用,禁用和刪除的時候,你都將接收到廣播通知。
如下:BDayWidgetProvider.class
public class BDayWidgetProvider extends AppWidgetProvider { @Override public void onDeleted(Context context, int[] appWidgetIds) { // TODO Auto-generated method stub //當App Widget的執行個體從宿主中刪除時被調用。 } @Override public void onDisabled(Context context) { 當你的App Widget的最後一個執行個體被從宿主中刪除時被調用。因為:譬如中的人人網小組件,你可添加N個執行個體。 } @Override public void onEnabled(Context context) { // 當一個App Widget執行個體第一次建立時被調用。 } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { //這個方法調用來間隔性的更新App Widget,間隔時間用AppWidgetProviderInfo 裡的updatePeriodMillis屬性定義(參見添加AppWidgetProviderInfo中繼資料)。}
@Override public void onReceive(Context context, Intent intent) { //這個接收到每個廣播時都會被調用,而且在上面的回呼函數之前。你通常不需要實現這個方法,因為預設的AppWidgetProvider實現過濾所有Ap p Widget 廣播並恰當的調用上述方法。 }
}
要實現複雜的需求,也不外乎就是擴充上述類中的這幾個方法。這裡只講原理,故不多說哈。
三:在manifest中註冊並添加廣播。
<receiver android:name=".BDayWidgetProvider" > <meta-data android:name="android.appwidget.provider" android:resource="@xml/AppWidgetProviderInfo" /> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter></receiver>
<intent-filter> 元素必須包括一個含有android:name屬性的<action>元素。該元素指定AppWidgetProvider接受ACTION_APPWIDGET_UPDATE 廣播。這是唯一你必須顯式聲明的廣播。當需要的時候,AppWidgetManager 會自動發送所有其他App Widget廣播給AppWidgetProvider。
*【注釋】:小組件的長寬的定義規則
預設的App Widgets所在視窗的案頭位置基於有確切高度和寬度的單元網格。如果App Widget的最小長寬和這些網格單元的
尺寸不匹配,那麼這個App Widget將收縮到最接近的單元尺寸(參見App Widget Design Guidelines 以擷取更多關於案頭單元尺寸的資訊)
因為案頭布局方向(由此,單元的尺寸)可以變化,按照拇指規則,你應該假設最壞情況單元尺寸是74像素高和寬。不過,你必須
從最後的尺寸中減去2以把像素計算過程中產生的任何的整數舍入誤差考慮在內。要找到像素密度無關的最小寬度和高度,使用這個公式:
(number of cells * 74) - 2
遵循這個公式,你應該使用72dp為每一個單元高度,294dp為四個單元寬度。
已經以上三步就可以製作一個最簡單的小視窗組件了。原理與已清楚了哈,下面說說我自己的BirthdayRemind的功能:
BirthdayRemind可通過設定檔輸入姓名和日期,用來算某人生日的倒計時。小視窗每日會更新,數字將減1,並且做了一個“Buy”連結,
可用來調用購買生日禮物的連結。運行如<圖二>,感興趣的朋友可下載下來玩玩。
BirthdayRemind源碼地址:http://pan.baidu.com/share/link?shareid=23016&uk=1442961174
<圖二>
可以轉載,但請註明出處,謝謝!
作者:Carman 2012-08-13 15:27:10
郵箱:carman_loneliness@163.com