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
