第10章Widget組件開發(fā)_第1頁
第10章Widget組件開發(fā)_第2頁
第10章Widget組件開發(fā)_第3頁
第10章Widget組件開發(fā)_第4頁
第10章Widget組件開發(fā)_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第第1010章章 WidgetWidget組件開發(fā)組件開發(fā) 本章學(xué)習(xí)目標(biāo):n了解Widget的概念及特征 n掌握Widget的設(shè)計(jì)原則和開發(fā)步驟 n了解Widget的調(diào)試方法 n掌握使用Activity配置Widget的方法 n掌握使用Service更新Widget 的方法10.1 Widget簡(jiǎn)介 nWidget qWidget是一個(gè)具有特定功能的視圖,一般被嵌入到主屏幕(Home screen)中,用戶在不啟動(dòng)任何程序的前提下,就可以在主屏幕上直接瀏覽Widget所顯示的信息 qWidget在主屏幕上顯示自定義的界面布局,在后臺(tái)周期性的更新數(shù)據(jù)信息,并根據(jù)這些更新的數(shù)據(jù)修改主屏幕的顯示內(nèi)容

2、 qWidget可以有效的利用手機(jī)的屏幕,快捷、方便的瀏覽信息,為用戶帶來良好的交互體驗(yàn) 10.1 Widget簡(jiǎn)介 nWidget qWidget是Android 1.5引入的新特性,發(fā)展到Android 4.0已經(jīng)有很大的進(jìn)步和改變,例如在Android 3.1引入的更改Widget尺寸功能,以及Android 4.0增加的自動(dòng)設(shè)置邊界功能 qWidget在主屏幕上可以出現(xiàn)多個(gè)相同的副本,也可以根據(jù)用戶的設(shè)置,產(chǎn)生尺寸、布局、刷新速率和更新邏輯完全不同的副本 q將Widget程序設(shè)計(jì)成多個(gè)界面風(fēng)格的版本,有助于適應(yīng)不同用戶的喜好 10.1 Widget簡(jiǎn)介 nWidget q各種Widge

3、t 10.1 Widget簡(jiǎn)介 nWidget q目前,在Android智能手機(jī)和平板電腦上具有非常廣泛的應(yīng)用,包括用Widget實(shí)現(xiàn)的微博客、RSS訂閱器、股市信息、天氣預(yù)報(bào)、日歷、時(shí)鐘、信息提醒、電量顯示、郵件、便簽、音樂播放、相冊(cè)和新聞等 q在Android 4.0系統(tǒng)中,自帶了多個(gè)Widget程序,包括時(shí)鐘、書簽、音樂播放器、相框和搜索欄等,如下圖所示q在Widget列表中可以查看所有的Widget組件,通過長(zhǎng)時(shí)間點(diǎn)擊Widget組件,可以將Widget組件添加到主屏幕上 10.1 Widget簡(jiǎn)介 nWidgetq Android 4.0中的Widget10.2 Widget基礎(chǔ) n

4、Widget基礎(chǔ)包括Widget的設(shè)計(jì)原則、開發(fā)步驟和調(diào)試過程 nWidget的設(shè)計(jì)原則將介紹Widget界面布局的設(shè)計(jì)要求,Widget開發(fā)步驟將以SimpleWidget為例介紹Widget的一般開發(fā)流程,Widget的調(diào)試過程將介紹Widget的安裝、加載和刪除方法 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qWidget是主屏幕上的顯示元素,不僅自身具有一定的設(shè)計(jì)規(guī)則,還要與主屏幕上其它的元素保持美觀一致 qWidget顯示在主屏幕上的結(jié)構(gòu)如下圖所示 q最外層是單元格邊界,這個(gè)邊界是不同Widget的分隔界限,在界面上這個(gè)界限對(duì)用戶是不可見的 q框架邊界是Widge

5、t背景圖像的界限,背景圖形會(huì)填充滿整個(gè)框架(Frame)。最里面是Widget Controls,這是顯示W(wǎng)idget界面元素的空間 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qWidget構(gòu)成 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qWidget Padding是框架邊界與Widget Controls之間的距離,可將Widget的界面元素顯示在背景圖片的中間區(qū)域 q為了保證多個(gè)Widget顯示時(shí)不會(huì)靠的太近,一般都會(huì)設(shè)定Widget Margins,這個(gè)值是單元格邊界與框架邊界的距離 q如果Widget Margins的值為0,則兩個(gè)Widget

6、就會(huì)連在一起 q在Android 4.0中,系統(tǒng)會(huì)自動(dòng)在添加Margins,保持兩個(gè)Widget可以保持一定的間隔距離 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q筆者建議使用這個(gè)新功能,方法是只要將AnroidManifest.xml文件中的targetSdkVersion設(shè)置為14 q下面介紹如何設(shè)計(jì)出同時(shí)適應(yīng)Android 4.0以及較早Android系統(tǒng)的Widget界面布局 q使之在較早的Android系統(tǒng)上具有自定義的Widget Margins值,而在Android 4.0上保持相同的顯示方式,而不會(huì)因?yàn)锳ndroid 4.0自動(dòng)添加邊界間隔而出現(xiàn)顯示不一致的

7、情況 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q具體方法如下 n首先,將AnroidManifest.xml文件中的targetSdkVersion設(shè)置為14 n第二步建立布局文件,引用dimension資源,布局文件如下1 5 6 11 12 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q第三步 n建立兩個(gè)dimension資源,第1個(gè)在/res/values目錄下,為較早的Android系統(tǒng)提供自定義的Margins;第2個(gè)在/res/values-v14目錄下,為Android 4.0系統(tǒng)設(shè)定Margins res/values/dimens.xm

8、l:15dpres/values-v14/dimens.xml:0dp10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qAndroid系統(tǒng)將主屏幕劃分為單元格,單元格的大小和數(shù)量會(huì)隨設(shè)備的變化而完全不同,一般智能手機(jī)會(huì)被劃分為44的單元格,而平板電腦一般會(huì)被劃分為87的單元格 q當(dāng)用戶將Widget加入到主屏幕時(shí),Widget會(huì)占據(jù)一定數(shù)量的單元格,占據(jù)單元格的數(shù)量由minWidth和minHeight決定,這兩個(gè)屬性是缺省情況下Widget的顯示尺寸,具體的計(jì)算方法可以查詢下表 q其中,dp表示與設(shè)備無關(guān)的像素,計(jì)算公式中之所以要減去30,是為了防止像素計(jì)算時(shí)的整數(shù)舍入導(dǎo)致錯(cuò)誤

9、 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qWidget尺寸與單元格數(shù)量的對(duì)應(yīng)關(guān)系 WidgetWidget尺寸尺寸(minWidthminWidth和和minHeightminHeight) 單元格數(shù)量單元格數(shù)量40dp 1 110dp 2 180dp 3 250dp 4 70*n-30 n 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q在設(shè)定minWidth和minHeight時(shí),最基本的原則是使Widget處于最佳的顯示狀態(tài) q下面以“音樂播放器”為例說明如何計(jì)算Widget的minWidth和minHeight值 q音樂播放器的界面如下圖所示10

10、.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q音樂播放器由一個(gè)顯示歌曲信息的TextView和兩個(gè)控制音樂播放的按鈕組成q音樂播放器的界面元素尺寸如下圖所示 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qminWidth應(yīng)等于三個(gè)控件的寬度和,加上控件之間的空隙,minHeight應(yīng)等于TextView控件的高度加上邊界空隙 q具體的計(jì)算方法可以參考下面的公式minWidth = 144dp + (2 8dp) + (2 56dp) = 272dpminHeight = 48dp + (2 4dp) = 56dp10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原

11、則設(shè)計(jì)原則 q為了增加Widget對(duì)不同屏幕尺寸和單元格尺寸的適應(yīng)性,建議盡量使用具有自適應(yīng)能力的布局,例如線性布局、相對(duì)布局或框架布局q在設(shè)計(jì)界面元素時(shí),將不可改變尺寸的界面元素的高度和寬度設(shè)置成固定值,而讓尺寸可改變的界面元素填充全部剩余空間q應(yīng)保證所有界面元素在縱向上居中顯示 10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 q當(dāng)Widget的尺寸不夠填充滿所應(yīng)占的單元格時(shí),Widget會(huì)在橫向和縱向拉伸,以填充所有應(yīng)該占據(jù)的單元格 q下圖是音樂播放器在單元格尺寸為80dp100dp,Margins為16的顯示效果10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則

12、q建議讀者使用9-patche文件作為背景圖像,文件擴(kuò)展名為.9.png。這種圖像文件可以自動(dòng)填充整個(gè)背景空間,同時(shí)不會(huì)影響界面的美觀10.2 Widget基礎(chǔ) n10.2.1 設(shè)計(jì)原則設(shè)計(jì)原則 qWidget模板包的下載n模板包里面包括NinePatch圖像文件、XML文件和Photoshop源文件等內(nèi)容,適用于不同屏幕分辨率和Android 版本系統(tǒng) n下載地址為http:/ 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 qWidget的一般開發(fā)步驟如下n設(shè)計(jì)Widget的布局 n定義Widget的元數(shù)據(jù) n實(shí)現(xiàn)Widget的添加、刪除、更新 n在AnroidManifes

13、t.xml文件中聲明Widget q以SimpleWidget為例,介紹Widget的開發(fā)步驟,以及Widget框架類中個(gè)函數(shù)的調(diào)用順序 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q設(shè)計(jì)Widget的布局n創(chuàng)建用戶Widget的第一步是設(shè)計(jì)并實(shí)現(xiàn)Widget的組件布局,就是Widget和用戶交互的界面 nSimpleWidget示例設(shè)計(jì)目標(biāo)如下圖所示,背景使用NinePatch的PNG圖片,內(nèi)部為白色背景,具有淺藍(lán)色的邊框nWidget內(nèi)部包含TextView和ImageButton控件,使用線性水平布局 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q設(shè)計(jì)

14、Widget的布局nWidget與Activity的布局設(shè)計(jì)和實(shí)現(xiàn)方法上十分相似,都是在/res/layout目錄中建立基于XML的布局資源文件 nSimpleWidget示例建立的Widget布局文件的文件名為widget_layout.xml,將Widget背景圖片放置在/res/drawable 目錄中,文件名為widget_background.9.png nwidget_layout.xml的完整代碼 如下1 2 8 9 1718 24 25 n第13行將TextView的字體顏色設(shè)置為黑色,第14行將TextView的背景顏色設(shè)置為淺藍(lán)色,主要用來確定TextView所占據(jù)的區(qū)域范

15、圍 n第15行將layout_weight設(shè)為1,而沒有在ImageButton中設(shè)置這個(gè)參數(shù),表明TextView控件會(huì)占據(jù)父節(jié)點(diǎn)所擁有的剩余空間 n在Eclipse的界面控制器中,Widget的顯示效果與設(shè)計(jì)目標(biāo)略有區(qū)別,如下圖所示,主要原因是線性布局的layout_width和layout_height屬性都被設(shè)置成fill_parent10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟n界面設(shè)計(jì)器中顯示效果10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟n出于Widget的安全和性能考慮,Widget支持的布局和控件存在一些限制 n目前Widget支持的布局有框架

16、布局、線性布局和相關(guān)布局 n支持的界面控件有AnalogClock 、Button、Chronometer、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StatckView和AdapterViewFlipper 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) nWidget元數(shù)據(jù)定義了Widget最基本的信息,包括Widget的尺寸、更新周期、布局文件位置、預(yù)覽圖片、拉伸方向和配置界面等 nSimpleWidget示例Widget元數(shù)據(jù)的文件保存在/r

17、es/xml/widget_template.xml,該文件的完整代碼如下1 2 n第2行使用appwidget-provider標(biāo)簽聲明了Widget的元數(shù)據(jù) n第4行和第5行定義了Widget的兩個(gè)關(guān)鍵屬性 nminWidth和minHeight分別表示缺省情況下Widget的顯示寬度和高度,也就是Widget在拖拽到主屏幕時(shí)的尺寸nAndroid 3.1后的系統(tǒng)支持改變Widget的顯示尺寸,代碼第6行聲明Widget的尺寸可變,horizontal|vertical表示在水平和垂直方向上的大小都是可以變化的10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget

18、的元數(shù)據(jù) n其中,不可調(diào)整、水平方向調(diào)整、垂直方向調(diào)整、水平與垂直方向調(diào)整,這四種方式的參數(shù)分別為none、horizontal、vertical、horizontal|verticaln第7行和第8行中,Widget的最小尺寸由minResizeWidth和minResizeHeight決定 nminResizeHeight是Widget能夠重新設(shè)置的最小高度,此值在大于minHeight時(shí),或resizeMode中不支持垂直(vertical)拖拽時(shí),此屬性不起作用 nminResizeWidth是Widget能夠重新設(shè)置的最小寬度,此值在超過minWidth時(shí),或者resizeMode不

19、支持水平(horizontal)拖拽時(shí),此屬性不起作用 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) n第9行的updatePeriodMillis表示以毫秒為單位的更新周期,Android會(huì)以這個(gè)速率喚醒設(shè)備以便更新Widget,開發(fā)人員應(yīng)盡可能的降低設(shè)備被喚醒的次數(shù),以降低設(shè)備的能量消耗 n當(dāng)更新周期小于30分鐘時(shí),Android系統(tǒng)并不按照此參數(shù)更新Widget,如果需要頻繁更新Widget,可以在Service服務(wù)中實(shí)現(xiàn) n第10行的initialLayout用來指定Widget的布局 n第11行的previewImage定義了在Androi

20、d系統(tǒng)Widget列表中預(yù)覽圖像,如果不設(shè)置該值,則以程序的圖標(biāo)作為預(yù)覽圖像 nSimpleWidget示例的預(yù)覽圖像如下圖所示10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) nSimpleWidget示例的預(yù)覽圖像10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 n實(shí)現(xiàn)Widget的添加、刪除、更新等過程,主要是通過AppWidgetProvider類來實(shí)現(xiàn) n這個(gè)類本身繼承BroadcastReceiver,用來接收與Widget相關(guān)的更新、刪除、生效和失效等消息,當(dāng)AppWidgetProvide

21、r接收這些消息后,會(huì)分別調(diào)用響應(yīng)的事件處理函數(shù),如下表所示 事件事件 調(diào)用函數(shù)調(diào)用函數(shù) 說明說明 ACTION_APPWIDGET_UPDATE onUpdate() Widget更新 ACTION_APPWIDGET_DELETED onDelete() Widget刪除 ACTION_APPWIDGET_ENABLED onEnabled() Widget生效 ACTION_APPWIDGET_DISABLED onDisabled() Widget失效 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 n在SimpleWidget示例中,

22、WidgetProvider繼承AppWidgetProvider類,在Widget更新、刪除等操作過程中調(diào)用其內(nèi)部的函數(shù)。WidgetProvider.java文件的完整代碼如下1 package edu.hrbeu.SimpleWidget;2 3 import android.appwidget.AppWidgetManager;4 import android.appwidget.AppWidgetProvider;5 import android.content.Context;6 import android.util.Log;7 8 public class WidgetProv

23、ider extends AppWidgetProvider 9 private static final String TAG = WIDGET;10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新10 11 Override12 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) 13 Log.d(TAG, onUpdate);14 15 16 Override17 public void onDeleted(Con

24、text context, int appWidgetIds) 18 Log.d(TAG, onDeleted);19 20 21 Override22 public void onEnabled(Context context) 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新23 Log.d(TAG, onEnabled);24 25 26 Override27 public void onDisabled(Context context) 28 Log.d(TAG, onDisabled);29 30 10.2 Widget基礎(chǔ) n10.

25、2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 n代碼中雖然重載了的onUpdate()、onDelete()、onEnabled()和onDisabled()四個(gè)函數(shù),但僅在函數(shù)中設(shè)置了調(diào)試信息,后期可以利用調(diào)試信息觀察這些函數(shù)何時(shí)會(huì)被調(diào)用nonUpdate(Context, AppWidgetManager, int)函數(shù)在updatePeriodMillis定義時(shí)間間隔到期時(shí)被調(diào)用,主要用來更新Widget組件的界面顯示 n除此以外,在用戶每次將Widget拖拽到主屏幕時(shí),該函數(shù)也會(huì)被調(diào)用,可在此函數(shù)中為界面元素定義按鈕點(diǎn)擊事件處理函數(shù),或者啟動(dòng)一個(gè)臨時(shí)的Service進(jìn)

26、行數(shù)據(jù)獲取等 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 nonDeleted(Context context, int appWidgetIds)函數(shù)是當(dāng)一個(gè)AWidget從主屏幕上被刪除時(shí)調(diào)用的函數(shù),用來回收資源nonEnabled(Context context)函數(shù)在首個(gè)Widget實(shí)例被創(chuàng)建并添加到主屏幕時(shí)被調(diào)用 nWidget可以在主屏幕上創(chuàng)建多個(gè)實(shí)例,但只有在第一個(gè)Widget實(shí)例被創(chuàng)建時(shí)才調(diào)用該函數(shù) nonEnabled()一般用來進(jìn)行一些初始化工作,比如打開一個(gè)新的數(shù)據(jù)庫(kù),或者執(zhí)行對(duì)所有Widget實(shí)例來說只需進(jìn)行一次的

27、設(shè)置 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 nonDisabled(Context context)函數(shù)在最后一個(gè)Widget實(shí)例被刪除時(shí)調(diào)用,用來釋放在onEnabled()中使用的資源,如刪除在onEnabled()函數(shù)中創(chuàng)建臨時(shí)數(shù)據(jù)庫(kù) n將Widget添加到主屏幕上,或者從主屏幕刪除Widget都會(huì)引發(fā)AppWidgetProvider中的事件處理函數(shù) n以SimpleWidget示例,通過觀察Eclipse中LogCat的輸出信息,分析用戶對(duì)Widget進(jìn)行不同操作所引發(fā)的事件處理函數(shù),以及其調(diào)用順序關(guān)系 10.2 Widg

28、et基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q實(shí)現(xiàn)Widget的添加、刪除、更新 n當(dāng)Widget第一次添加到主屏幕時(shí),系統(tǒng)會(huì)按順序調(diào)用onEnable()和onUpdate() n當(dāng)再次向主屏幕添加Widget時(shí),系統(tǒng)則僅調(diào)用onUpdate() n當(dāng)從主屏幕刪除Widget時(shí),如果主屏幕還有這個(gè)Widget的實(shí)例,則系統(tǒng)僅調(diào)用onDelete() n如果被刪除的是這個(gè)Widget的最后一個(gè)實(shí)例,則系統(tǒng)在調(diào)用onDelete()后會(huì)調(diào)用onDisable() 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q在AnroidManifest.xml文件中聲明Widget n要讓W(xué)

29、idget生效還需在AnroidManifest.xml文件中進(jìn)行聲明,主要在該文件中聲明AppWidgetProvider類。AnroidManifest.xml的完整代碼如下1 2 6 7 8 9 12 13 15 16 17 18 19 20 10.2 Widget基礎(chǔ) n10.2.2 開發(fā)步驟開發(fā)步驟 q在AnroidManifest.xml文件中聲明Widgetn第12行聲明了receiver標(biāo)簽,android:name屬性定義了AppWidgetProvider的子類 n第13行meta-data標(biāo)簽中的android:name屬性,使用

30、vider表示這里的數(shù)據(jù)是Widget的元數(shù)據(jù) n第14行的android:resource屬性聲明了元數(shù)據(jù)的資源路徑 n第15行定義了intent-filter標(biāo)簽,代碼第16行聲明接收ACTION_APPWIDGET_UPDATE 消息 10.2 Widget基礎(chǔ) n10.2.3 調(diào)試過程調(diào)試過程 q在完成SimpleWidget示例的所有代碼后,進(jìn)入Widget的調(diào)試過程q在進(jìn)行Widget調(diào)試前,首先介紹如何安裝、加載和刪除Widget組件q安裝Widget與安裝其它程序相似,是通過Eclipse上的運(yùn)行(Run)按鈕啟動(dòng)程序的編譯、鏈接、打包和安裝過程,唯一區(qū)別是在Widget安裝到

31、模擬器后,不會(huì)直接出現(xiàn)在主屏幕上,而需要用戶在Android系統(tǒng)的Widget列表中手動(dòng)將Widget添加到主屏幕上。Android系統(tǒng)的Widget列表如下圖所示 10.2 Widget基礎(chǔ) n10.2.3 調(diào)試過程調(diào)試過程 qAndroid系統(tǒng)的Widget列表10.2 Widget基礎(chǔ) n10.2.3 調(diào)試過程調(diào)試過程 q用戶通過長(zhǎng)時(shí)間(超過2秒)點(diǎn)擊SimpleWidget的預(yù)覽圖標(biāo),將SimpleWidget實(shí)例加載到主屏幕上,缺省情況下占據(jù)31個(gè)單元格,如下圖(a)所示q在主屏幕上,通過長(zhǎng)時(shí)間點(diǎn)擊SimpleWidget實(shí)例,可以進(jìn)入調(diào)整Widget尺寸狀態(tài),如下圖(b)所示,Wi

32、dget邊緣出現(xiàn)四個(gè)實(shí)心菱形,通過拖拽這些實(shí)心菱形,可以調(diào)整Widget的尺寸。SimpleWidget實(shí)例在下圖(b)中占據(jù)了42個(gè)單元格 10.2 Widget基礎(chǔ) n10.2.3 調(diào)試過程調(diào)試過程 qSimpleWidget示例效果n左:圖(a)初始尺寸 右:圖(b)拉伸效果10.2 Widget基礎(chǔ) n10.2.3 調(diào)試過程調(diào)試過程 q如果希望添加第二個(gè)SimpleWidget實(shí)例,過程與添加第一個(gè)SimpleWidget實(shí)例的過程完全一樣 q在希望刪除Widget時(shí),同樣是通過長(zhǎng)時(shí)間點(diǎn)擊主屏幕上的Widget實(shí)例,主屏幕上方會(huì)會(huì)出現(xiàn)垃圾桶,直接將Widget實(shí)例拖到垃圾桶即可 q需要

33、注意的是主屏幕上的垃圾桶是隱藏的,需要通過長(zhǎng)時(shí)間點(diǎn)擊Widget示例才會(huì)出現(xiàn) q當(dāng)Widget實(shí)例在垃圾桶上方呈現(xiàn)出紅色時(shí),松開手指便可完成了刪除操作 10.3 Widget配置 n在Widget的使用過程中,有時(shí)用戶需要根據(jù)個(gè)人喜好設(shè)置Widget的不同特征,如Widget的外觀風(fēng)格、字體顏色、字體大小、更新時(shí)間或背景圖案等n比較普遍的做法是在Widget添加到主屏幕時(shí),啟動(dòng)一個(gè)用于配置Widget的Activity,用戶在這個(gè)Activity中設(shè)定Widget的特征n配置Widget特征的Activity,需要在Widget元數(shù)據(jù)XML文件中進(jìn)行聲明,聲明的屬性為android:confi

34、gure,其值為Activity所在的類,示例代碼如下 10.3 Widget配置 Widget元數(shù)據(jù)XML文件中的聲明代碼1 2 n代碼第5行中,Activity使用了帶命名空間(edu.hrbeu.ConfigWidget)的聲明方式,這是因?yàn)檎{(diào)用Activity的Widget宿主與Activity并不在相同的命名空間中n元數(shù)據(jù)中聲明的Activity,在每個(gè)Widget實(shí)例被添加到主屏幕前會(huì)被啟動(dòng)n當(dāng)用戶完成配置選擇關(guān)閉Activity,Widget才會(huì)出現(xiàn)在主屏幕上10.3 Widget配置 n用戶配置Widget的Activity也需要在AndroidManifest.xml文件中聲

35、明n不同于聲明普通的Activity,這種Activity是被Widget的宿主通過發(fā)送android.appwidget.action.APPWIDGET_CONFIGURE動(dòng)作(Action)啟動(dòng)的,所以此Activity需要接收Intent消息,示例代碼如下1 2 3 4 5 10.3 Widget配置 n當(dāng)用戶使用Activity完成Widget的配置后,Activity有責(zé)任調(diào)用相應(yīng)代碼對(duì)Widget進(jìn)行更新nActivity可以直接調(diào)用AppWidgetManager類更新Widget,也可也調(diào)用開發(fā)人員在AppWidgetProvider中編寫的靜態(tài)更新函數(shù),實(shí)現(xiàn)Widget的更

36、新nAppWidgetManger是負(fù)責(zé)管理Widget的類,向AppWidgetProvider發(fā)送通知10.3 Widget配置 n要實(shí)現(xiàn)使用Activity配置Widget特征,并在適當(dāng)?shù)臅r(shí)候更新Widget,可以參考如下步驟q獲取Widget的IDnWidget的宿主在啟動(dòng)Activity時(shí),將Widget的ID保存在Intent中,通過調(diào)用extras.getInt()函數(shù),獲取Widget的IDnextras.getInt(String key, int defaultValue)函數(shù)中,參數(shù)1是獲取數(shù)據(jù)的關(guān)鍵字,應(yīng)使用關(guān)鍵字appWidgetId,或AppWidgetManage

37、r.EXTRA_APPWIDGET_IDn參數(shù)2是無法獲取數(shù)據(jù)時(shí)函數(shù)返回的代替數(shù)據(jù),示例代碼如下1 Intent intent = getIntent();2 Bundle extras = intent.getExtras();3 if (extras != null) 4 mAppWidgetId = extras.getInt( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);5 6 if (mAppWidgetId = AppWidgetManager.INVALID_APPWIDG

38、ET_ID) 7 finish();8 10.3 Widget配置 n第4行的AppWidgetManager.INVALID_APPWIDGET_ID的值為0,表示沒有獲取到Widget的IDn第6行和第7行說明,在沒有正確獲取到Widget的ID時(shí),可以立即關(guān)閉Activity,因?yàn)闆]有正確的ID,即使完成配置工作,也無法將配置信息正確傳遞回Widget q配置Widgetn這個(gè)過程用戶會(huì)在界面上選擇相應(yīng)的配置方案和配置信息,并最終通過事件引發(fā)更新Widget過程,并關(guān)閉Activity q更新Widgetn在更新Widget時(shí),首先通過調(diào)用getInstance(context)函數(shù)獲取

39、AppWidgetManager實(shí)例,然后建立一個(gè)RemoteViews,在這個(gè)RemoteViews上更改Widget的界面元素,最后調(diào)用updateAppWidget(int, views)函數(shù)完成Widget更新 10.3 Widget配置 nRemoteViews是可在其它進(jìn)程中顯示的視圖類,提供對(duì)部分界面控件的最基本的操作。示例代碼如下1 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);2 RemoteViews views = new RemoteViews(context.getP

40、ackageName(),R.layout.widget_layout);3 views.setTextColor(R.id.label,textColor);4 appWidgetManager.updateAppWidget(appWidgetId, views);q第2行的R.layout.widget_layout是Widget的布局 q第3行setTextColor()函數(shù)可以設(shè)置TextView控件的字體顏色,TextView控件的ID為R.id.label,textColor是代表顏色的Int型整數(shù) q第4行的updateAppWidget()函數(shù)中,參數(shù)1是Widget的ID,

41、參數(shù)2是剛建立的RemoteViews q設(shè)置返回信息,并關(guān)閉Activityn通過調(diào)用setResult(int resultCode, Intent data)函數(shù),設(shè)置Activity的返回代碼和返回?cái)?shù)據(jù) n返回代碼應(yīng)為RESULT_OK或RESULT_CANCELED。RESULT_OK表示W(wǎng)idget設(shè)置成功,Widget宿主會(huì)將Widget實(shí)例加載到主屏幕上10.3 Widget配置 n如果返回的是RESULT_CANCELED,Widget宿主則取消Widget實(shí)例的加載過程,Widget也不會(huì)出現(xiàn)在主屏幕上n返回?cái)?shù)據(jù)應(yīng)包含Widget的ID,并使用AppWidgetManage

42、r.EXTRA_APPWIDGET_ID作為關(guān)鍵字,示例代碼如下1 Intent resultValue = new Intent();2 resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);3 setResult(RESULT_OK, resultValue);4 finish();n需要注意的是,需要處理用戶在未完成Widget配置前,通過回退鍵離開Activity的情況,方法非常簡(jiǎn)單,只有在Activity的onCreate()函數(shù)開始處,添加如下代碼即可1 public void onCreat

43、e(Bundle icicle) 2 setResult(RESULT_CANCELED);3 .4 10.3 Widget配置 n在未正確完成Widget配置前,如果用戶離開Activity配置界面,Activity的返回代碼則是RESULT_CANCELED nConfigWidget示例中提供了完整的代碼,說明如何在Activity中選擇Widget中TextView的字體顏色 nConfigWidget示例是在SimpleWidget示例代碼的基礎(chǔ)上進(jìn)行的修改和添加,部分代碼的理解可以參考SimpleWidget示例代碼的說明 nConfigWidget示例的Widget配置界面如下圖

44、所示10.4 Widget與Service n在Widget中如果需要進(jìn)行頻繁更新,一般采用Service周期性更新Widget的方法 nWidget元數(shù)據(jù)中的updatePeriodMillis屬性是無法進(jìn)行頻繁更新的,對(duì)于低于30分鐘的設(shè)定值,該屬性并不生效 n當(dāng)進(jìn)行Widget更新時(shí),如果在onUpdate()函數(shù)中代碼運(yùn)行時(shí)間超過5秒鐘,例如進(jìn)行網(wǎng)絡(luò)操作、復(fù)雜運(yùn)算等,則會(huì)產(chǎn)生應(yīng)用程序無響應(yīng)(ANR,Application Not Responding) 錯(cuò)誤n使用Service更新Widget可以避免這種問題的出現(xiàn),將比較耗時(shí)的代碼在Service中實(shí)現(xiàn),然后直接在Service中更新

45、Widget的界面 10.4 Widget與Service n下面以ServiceWidget為例,說明如何使用Service更新Widget。ServiceWidget示例的用戶界面如下圖所示nServiceWidget示例在AppWidgetProvider中啟動(dòng)Service,當(dāng)最后一個(gè)Widget實(shí)例在主屏幕上被刪除時(shí)停止這個(gè)Service nService在啟動(dòng)后會(huì)開啟一個(gè)工作線程,線程每2秒鐘產(chǎn)生一個(gè)隨機(jī)小數(shù),并將這個(gè)隨機(jī)小數(shù)顯示在Widget的界面上 10.4 Widget與Service nService的核心代碼1 Override2 public void run() 3

46、while(!Terrupted() 4 double randomDouble = Math.random();5 String msg = String.valueOf(randomDouble);6 WidgetProvider.updateAppWidget(this, msg); 7 8 try 9 Thread.sleep(2000);10 catch (InterruptedException e) 11 e.printStackTrace();12 13 14 q第6行調(diào)用了WidgetProvider中的靜態(tài)函數(shù)updateAppWidget(),進(jìn)行Wid

47、get界面更新10.4 Widget與Service nWidgetProvider類繼承AppWidgetProvider,其中的公有靜態(tài)函數(shù)updateAppWidget()的代碼如下 1 private static Queue widgetIds=new LinkedList();2 3 public static void updateAppWidget(Context context, String displayMsg ) 4 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 5

48、RemoteViews views = newRemoteViews(context.getPackageName(),R.layout.widget_layout); 6 views.setTextViewText(R.id.label, displayMsg); 7 8 final int N = widgetIds.size();9 for (int i=0; iN; i+) 10 int appWidgetId = widgetIds.poll();11 appWidgetManager.updateAppWidget(appWidgetId, views);12 widgetIds.

49、add(appWidgetId);13 14 10.4 Widget與Service qupdateAppWidget()函數(shù)每2秒被執(zhí)行一次,負(fù)責(zé)所有Widget實(shí)例的更新q代碼第1行定義了一個(gè)隊(duì)列widgetIds,用于保存所有Widget實(shí)例的ID值 q代碼第8行獲取Widget實(shí)例的數(shù)量,并在代碼第11行實(shí)現(xiàn)Widget的更新操作 q代碼第10行和第12行分別實(shí)現(xiàn)隊(duì)列數(shù)據(jù)的取出和加入,主要目的是為了遍歷隊(duì)列中所有Widget的ID值 n更新所有Widget實(shí)例需要Widget的ID值,因此在WidgetProvider類onUpdate()函數(shù)中需將新建Widget的ID值添加到widgetIds隊(duì)列中,并在onDeleted()函數(shù)中刪除被移除Widget的ID值10.4 Widget與Service nWidgetProvider類onUpdate()函數(shù)的代碼如下1 Override2 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds) 3 Log.d(TAG, onUpdate);4 5 for (int i = 0 ;iappWidgetIds.length; i+ ) 6 widgetIds.add(appWidgetIds

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論