AppWidget 就是HomeScreen上顯示的小部件,提供直觀的交互操作。通過在HomeScreen中長按,在彈出的對話框中選擇Widget部件來進行創建,長按部件後並拖動到垃圾箱裏進行刪除。同壹個Widget部件可以同時創建多個。
AppWidget的實現主要涉及到以下類:
AppWidgetProvider
RemoteViews
AppWidgetManager
1. 首先需要提供壹個定義了Widget界面布局的XML文件(位於res/layout/..),需要註意的是使用的組件必須是RemoteViews所支持的,目前原生API中支持的組件如下:
FrameLayout
LinearLayout
RelativeLayout
AnalogClock
Button
Chronmeter
ImageButton
ImageView
ProgressBar
TextView
*如果使用了除此之外的組件,則在Widget創建時會導致android.view.InflateExceptionn異常。
2. 然後需要提供壹個xml文件來定義Widget的基本屬性,放置到res/xml/..目錄下。
如果使用的是Eclipse可按如下操作:
1) 在res/目錄下創建xml/目錄
2)創建xml文件(名字可任意),選擇類型為AppWidgetProvider
3)在彈出的便捷界面進行參數設置
主要設置的參數如下:
minWidth: 定義Wdiget組件的寬度
minHeight: 定義Wdiget組件的高度
updatePeriodMillis: 更新的時間周期
initialLayout: Widget的布局文件
configure: 如果需要在啟動前先啟動壹個Activity進行設置,在這裏給出Activity的完整類名(後面會說到,與壹般Activity的實現有些許差別)
3. xml都定義好後,接下來就是創建壹個繼承自AppWidgetProvider的子類,AppWidgetProvider實際上就是壹個BroadcastReceiver,裏面提供了以下函數:
onReceive(Context, Intent)
onUpdate(Context , AppWidgetManager, int[] appWidgetIds)
onEnabled(Context)
onDeleted(Context, int[] appWidgetIds)
onDisabled(Context)
可通過重寫以上函數來監聽Widget狀態的變化並進行相應的處理。
4. 最後,更新AndroidManifest.xml。
AppWidgetProvider對應壹個receiver屬性:
Xml代碼
<receiver android:name="MyWidgetProvider">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/></intent-filter>
<meta-data android:resource="@xml/widget_property" android:name="android.appwidget.provider"/>
</receiver>
5. 提供Configuration Activity
Configuration Activity是壹個在Widget啟動前先啟動的Activity,方便用戶對Widget的屬性進行設置。
需要註意的是,如果設置了Configure屬性,則必須在指定的Activity中進行如下處理:
1.在onCreate中setContentView()函數前添加setResult(RESULT_CANCLE) ,這樣如果在Activity初始化完成前按下了BACK按鍵,則Widget不會啟動;
2.在setContentView()函數之後(不壹定要在onCreate中,在Activity退出前即可),添加如下設置以指定需要啟動的Widget: