Widget初學者文檔之Widget開發初體驗
Widget初學者文檔之Widget開發初體驗是本文要介紹的內容,主要是來了解并學習Widget應用及開發,具體內容的實現來看本文詳解。
要構建一個widget ,需要組織以下內容。在AndroidManifest.xml聲明一個意向接收者<receiver >
AndroidManifest.xml是android應用的結構解析文件,安裝程序的時候android虛擬機會從該文件中讀取應用的組成和結構,生成應用圖標、名稱等。并為應用中的接收器注冊事件(意向)。
所謂的意向(Intent:翻譯為意向或目的)在android中似乎很常用,一個Activity啟動另外一個Activity就是用的意向呼叫的形式
java代碼
- Intent in = new Intent(ex12.this, rgActivity.class);
- startActivityForResult(in,RG_REQUEST);
android在某一事件(意向)發生時會將該意向在相應的命名空間中以廣播(broadcast)的形式發布出去,已在命名空間中注冊了該意向的意向接收器都會接收到它,并根據需要進行處理。
所以,構建一個widget,首先需要聲明它作為一個receiver ,即在AndroidManifest.xml文件內的<application>節點下加入一個recever節點
xml代碼
- <receiver android:name="MyAppWidget">
- <intent-filter>
- <action android:name="android.appwidget.action.APPWIDGET_UPDATE"></action>
- <action android:name="ice4c.test.intent.BtnDown"></action>
- </intent-filter>
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" />
- </receiver>
這段代碼中大致表示了以下意思
- <receiver android:name="MyAppWidget">
這里聲明了一個recever,它指向工程中定義的[package].MyAppWidget.java的類,亦即使用MyAppWidget.java來接收android.appwidget.action.APPWIDGET_UPDATE和ice4c.test.intent.BtnDown這兩個動作的意向,因此當該應用中廣播了這兩個意向,這兩個意向就會被MyAppWidget.java類接收。其中android.appwidget.action.APPWIDGET_UPDATE這一個動作是在widget被添加到桌面時觸發的,而ice4c.test.intent.BtnDown則是自定義的一個動作。
- <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_provider" />
這里聲明了一個媒體對象,指向了android.appwidget.provider,并聲明它的源res/xml/widget_provider.xml,即使用該xml來進行該widget的配置。
構建上一步提到的widget_provider.xml
上一步的<meta-data >將android.appwidget.provider的源指向widget_provider.xml,于是android的widget管理器會生成相應的菜單,及在桌面菜單的widget中提供添加該小應用的入口。而widget_provider.xml則是定義該應用的初始化參數的配置文件
該配置文件的內容如下:
xml代碼
- <?xml version="1.0" encoding="utf-8"?>
- ppwidget-provider
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:minWidth="294dp"
- android:minHeight="72dp"
- android:updatePeriodMillis="86400000"
- android:initialLayout="@layout/widget_layout"
- android:configure="ice4c.test.AppWidgetConfigure"
- >
- appwidget-provider>
該文件提供了如下 信息:
android:minWidth="294dp":widget的***寬度
android:minHeight="72dp":widget的***高度
android:updatePeriodMillis="86400000" :widget的刷新時間,即從widget添加到桌面之后再次觸發MyAppWidget.java中onUpdate()方法的周期。
android:initialLayout="@layout/widget_layout" :使用res/layout/widget_layout.xml文件來進行該widget的初始化布局。
android:configure="ice4c.test.AppWidgetConfigure" 為widget的高級配置文件,指向一個Activity,該Activity提供對添加的widget進行初始化配置的功能
注意:若使用了該選項,則MyAppWidget.java中的的OnEnlable將會失效,因此初始化的過程需要在AppWidgetConfigure.java的onCreate()中進行。
構建MyAppWidget.java
***步的receiver中指向了MyAppWidget,該類繼承AppWidgetProvider
java代碼
- public class MyAppWidget extends AppWidgetProvider{
- .....
- }<BR>
該類從AppWidgetProvider繼承了如下方法,需要的時候可以覆蓋這些方法來實現對應的功能
onUpdate(Context, AppWidgetManager, int[]) :該方法在widget被添加到桌面或刷新(android:updatePeriodMillis周期)widget時被觸發,用來對widget進行更新。(但若定義了android:configure,則添加時不會觸發該方法)。
onDeleted(Context, int[]):該方法在widget被刪除的時候觸發。
onEnabled(Context):***次添加該應用時觸發該方法,可用作初始化靜態變量或作全局數據庫的配置。
onDisabled(Context):***一個應用被刪除時觸發該方法,可用作清理殘留的相關數據。
onReceive(Context, Intent):與應用相關的intent被接收時觸發,包括框架中定義的android.appwidget.action.APPWIDGET_UPDATE和自定義的“ice4c.test.intent.BtnDown”等,克依據對應的intent進行處理。
onUpdate的定義
java代碼
- public void onUpdate(Context context, AppWidgetManager appWidgetManager,
- int[] appWidgetIds) {
- // TODO Auto-generated method stub
- super.onUpdate(context, appWidgetManager, appWidgetIds);
- Log.i("widget", "update");
- int N = appWidgetIds.length;
- for( int i = 0 ; i <SPAN style="COLOR: #0000ff"><</SPAN> N ; i++ ){
- int appId = appWidgetIds[i];
- Intent intent = new Intent("ice4c.test.intent.BtnDown");
- PendingIntent pendingintent = PendingIntent.getBroadcast(context, 0, intent, 0);
- remoteV.setOnClickPendingIntent(R.id.wg_btn, pendingintent);
- appWidgetManager.updateAppWidget(appId, remoteV);
- }
- }
該方法有三個參數
Context context上下文環境,
AppWidgetManager appWidgetManager:widget管理器int[] appWidgetIds:該類的所有實例widget的id組
該方法注冊了一個待定的意向(PendingIntent ),并將該意向綁定到widget中的一個button,當該button被點擊的時候將觸發
- Intent("ice4c.test.intent.BtnDown");
的動作,并將其廣播出去,由于AndroidManifest.xml中聲明了
- <action android:name="ice4c.test.intent.BtnDown">
- </action>
這個動作由MyAppWidget.java處理,因此onReceive(Context, Intent)將收到Intent("ice4c.test.intent.BtnDown"); 并對其進行處理。
<H5>此時widget就已經可以完成了,但是若widget_provider.xml 中聲明了
- <SPAN style="COLOR: #ff0000">android</SPAN>:
- <SPAN style="COLOR: #ff0000">configure</SPAN>=
- <SPAN style="COLOR: #0000ff">"
- ice4c.test.AppWidgetConfigure"</SPAN>
2 ,那么就還需要一個類,對widget進行配置。 </H5>
構建AppWidgetConfigure.java
AppWidgetConfigure是一個常規的Activity,但需要在AndroidManifest.xml中添加一個<Activity> xml代碼
- <SPAN style="COLOR: #0000ff">
- <</SPAN><SPAN style="COLOR: #800000">activity</SPAN>
- <SPAN style="COLOR: #ff0000">android</SPAN>:
- <SPAN style="COLOR: #ff0000">name</SPAN>=
- <SPAN style="COLOR: #0000ff">".AppWidgetConfigure"</SPAN>
- <SPAN style="COLOR: #0000ff">></SPAN>
- <SPAN style="COLOR: #0000ff"><</SPAN>
- <SPAN style="COLOR: #800000">intent</SPAN>-
- <SPAN style="COLOR: #ff0000">filter</SPAN>
- <SPAN style="COLOR: #0000ff">></SPAN>
- <SPAN style="COLOR: #0000ff"><</SPAN><SPAN style="COLOR: #800000">action</SPAN>
- <SPAN style="COLOR: #ff0000">android</SPAN>:<SPAN style="COLOR: #ff0000">name</SPAN>=
- <SPAN style="COLOR: #0000ff">"android.appwidget.action.APPWIDGET_CONFIGURE"</SPAN>
- <SPAN style="COLOR: #0000ff">/></SPAN>
- <SPAN style="COLOR: #0000ff"></</SPAN>
- <SPAN style="COLOR: #800000">intent</SPAN>-filter<SPAN style="COLOR: #0000ff">></SPAN>
- <SPAN style="COLOR: #0000ff"></</SPAN>
- <SPAN style="COLOR: #800000">activity</SPAN><SPAN style="COLOR: #0000ff">></SPAN>
在widget被添加到桌面的時候,將會啟動該Activity,提供界面和互動對相應的widget進行配置。有名的“七鍵開關”就是使用的這樣的方式對添加到桌面的widget進行配置的。
注意:在AppWidgetConfigure運行時將不會觸發MyAppWidget.java的onUpdate(),因此需要在onCreate()中手動調用該方法進行配置,但該方法會在之后的update中被調用。
配置widget的一般步驟(android api中提供的步驟):
從啟動這個Activity的Intent獲得widget的idjava代碼
- Intent intent = getIntent();
- Bundle extras = intent.getExtras();
- if (extras != null) {
- mAppWidgetId = extras.getInt(
- AppWidgetManager.EXTRA_APPWIDGET_ID,
- AppWidgetManager.INVALID_APPWIDGET_ID);
- }
對widget進行配置
配置完成使用AppWidgetManager 的getInstance(context)方法獲得widget管理器的實例java代碼
- AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
通過updateAppWidget(mAppWidgetId, RemounViews)的方式更新widgetjava代碼
- RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.example_appwidget);
- appWidgetManager.updateAppWidget(mAppWidgetId, views);
生成返回的Intent,設置返回值,結束Activityjava代碼
- Intent resultValue = new Intent();
- resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
- setResult(RESULT_OK, resultValue);
- finish();
另外,可以在Activity創建時設置setResult(RESULT_CANCELED);若配置時用戶按返回鍵,則不會創建任何實例。
終于寫完了,不過其中還有許多不懂的地方,以后的學習中慢慢再了解吧。
小結:Widget初學者文檔之Widget開發初體驗的內容介紹完了,希望通過Widget開發初體驗內容的學習能對你有所幫助。