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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、Widget基礎qWidget的設計原則:介紹Widget界面布局的設計要求q開發(fā)步驟:以SimpleWidget為例q調(diào)試過程 :介紹Widget的安裝、加載和刪除方法 10.2 Widget基礎 n10.2.1 設計原則設計原則 qWidget是主屏幕上的顯示元素,不僅自身具有一定的設計規(guī)則,還要與主屏幕上其它的元素保持美觀一致 qWidget顯示在主屏幕上的結構如下圖所示 q最外層是單元格邊界,這個邊界是不同Widget的分隔界限,在界面上這個界限對用戶是不可見的 q框架邊界是Widget背景圖像的界限,背景圖形會填充滿整個框架(Frame)。最里面是Widget Controls,這是

5、顯示W(wǎng)idget界面元素的空間 10.2 Widget基礎 n10.2.1 設計原則設計原則 qWidget構成 10.2 Widget基礎 n10.2.1 設計原則設計原則 qWidget Padding是框架邊界與Widget Controls之間的距離,可將Widget的界面元素顯示在背景圖片的中間區(qū)域 q為了保證多個Widget顯示時不會靠的太近,一般都會設定Widget Margins,這個值是單元格邊界與框架邊界的距離 q如果Widget Margins的值為0,則兩個Widget就會連在一起 q在Android 4.0中,系統(tǒng)會自動在添加Margins,保持兩個Widget可以保

6、持一定的間隔距離 10.2 Widget基礎 n10.2.1 設計原則設計原則 q筆者建議使用這個新功能,方法是只要將AnroidManifest.xml文件中的targetSdkVersion設置為14 q下面介紹如何設計出同時適應Android 4.0以及較早Android系統(tǒng)的Widget界面布局 q使之在較早的Android系統(tǒng)上具有自定義的Widget Margins值,而在Android 4.0上保持相同的顯示方式,而不會因為Android 4.0自動添加邊界間隔而出現(xiàn)顯示不一致的情況 10.2 Widget基礎 n10.2.1 設計原則設計原則 q具體方法如下 n首先,將Anro

7、idManifest.xml文件中的targetSdkVersion設置為14 n第二步建立布局文件,引用dimension資源,布局文件如下1 5 6 11 12 10.2 Widget基礎 n10.2.1 設計原則設計原則 q第三步 n建立兩個dimension資源,第1個在/res/values目錄下,為較早的Android系統(tǒng)提供自定義的Margins;第2個在/res/values-v14目錄下,為Android 4.0系統(tǒng)設定Margins res/values/dimens.xml:15dpres/values-v14/dimens.xml:0dp10.2 Widget基礎 n1

8、0.2.1 設計原則設計原則 qAndroid系統(tǒng)將主屏幕劃分為單元格,單元格的大小和數(shù)量會隨設備的變化而完全不同,一般智能手機會被劃分為44的單元格,而平板電腦一般會被劃分為87的單元格 q當用戶將Widget加入到主屏幕時,Widget會占據(jù)一定數(shù)量的單元格,占據(jù)單元格的數(shù)量由minWidth和minHeight決定,這兩個屬性是缺省情況下Widget的顯示尺寸,具體的計算方法可以查詢下表 q其中,dp表示與設備無關的像素,計算公式中之所以要減去30,是為了防止像素計算時的整數(shù)舍入導致錯誤 10.2 Widget基礎 n10.2.1 設計原則設計原則 qWidget尺寸與單元格數(shù)量的對應關

9、系 WidgetWidget尺寸尺寸(minWidthminWidth和和minHeightminHeight) 單元格數(shù)量單元格數(shù)量40dp 1 110dp 2 180dp 3 250dp 4 70*n-30 n 10.2 Widget基礎 n10.2.1 設計原則設計原則 q在設定minWidth和minHeight時,最基本的原則是使Widget處于最佳的顯示狀態(tài) q下面以“音樂播放器”為例說明如何計算Widget的minWidth和minHeight值 q音樂播放器的界面如下圖所示10.2 Widget基礎 n10.2.1 設計原則設計原則 q音樂播放器由一個顯示歌曲信息的TextVi

10、ew和兩個控制音樂播放的按鈕組成q音樂播放器的界面元素尺寸如下圖所示 10.2 Widget基礎 n10.2.1 設計原則設計原則 qminWidth應等于三個控件的寬度和,加上控件之間的空隙,minHeight應等于TextView控件的高度加上邊界空隙 q具體的計算方法可以參考下面的公式minWidth = 144dp + (2 8dp) + (2 56dp) = 272dpminHeight = 48dp + (2 4dp) = 56dp10.2 Widget基礎 n10.2.1 設計原則設計原則 q為了增加Widget對不同屏幕尺寸和單元格尺寸的適應性,建議盡量使用具有自適應能力的布局

11、,例如線性布局、相對布局或框架布局q在設計界面元素時,將不可改變尺寸的界面元素的高度和寬度設置成固定值,而讓尺寸可改變的界面元素填充全部剩余空間q應保證所有界面元素在縱向上居中顯示 10.2 Widget基礎 n10.2.1 設計原則設計原則 q當Widget的尺寸不夠填充滿所應占的單元格時,Widget會在橫向和縱向拉伸,以填充所有應該占據(jù)的單元格 q下圖是音樂播放器在單元格尺寸為80dp100dp,Margins為16的顯示效果10.2 Widget基礎 n10.2.1 設計原則設計原則 q建議讀者使用9-patche文件作為背景圖像,文件擴展名為.9.png。這種圖像文件可以自動填充整個

12、背景空間,同時不會影響界面的美觀10.2 Widget基礎 n10.2.1 設計原則設計原則 qWidget模板包的下載n模板包里面包括NinePatch圖像文件、XML文件和Photoshop源文件等內(nèi)容,適用于不同屏幕分辨率和Android 版本系統(tǒng) n下載地址為http:/ 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 qWidget的一般開發(fā)步驟如下n設計Widget的布局 n定義Widget的元數(shù)據(jù) n實現(xiàn)Widget的添加、刪除、更新 n在AnroidManifest.xml文件中聲明Widget q以SimpleWidget為例,介紹Widget的開發(fā)步驟,以及W

13、idget框架類中個函數(shù)的調(diào)用順序 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q設計Widget的布局n創(chuàng)建用戶Widget的第一步是設計并實現(xiàn)Widget的組件布局,就是Widget和用戶交互的界面 nSimpleWidget示例設計目標如下圖所示,背景使用NinePatch的PNG圖片,內(nèi)部為白色背景,具有淺藍色的邊框nWidget內(nèi)部包含TextView和ImageButton控件,使用線性水平布局 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q設計Widget的布局nWidget與Activity的布局設計和實現(xiàn)方法上十分相似,都是在/res/la

14、yout目錄中建立基于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的字體顏色設置為黑色,第14行將TextView的背景顏色設置為淺藍色,主要用來確定TextView所占據(jù)的區(qū)域范圍 n第15行將layout_weight設為1,而沒有在ImageButton中設置這個參數(shù),表明T

15、extView控件會占據(jù)父節(jié)點所擁有的剩余空間n在Eclipse的界面控制器中,Widget的顯示效果與設計目標略有區(qū)別,如下圖所示,主要原因是線性布局的layout_width和layout_height屬性都被設置成fill_parent10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟n界面設計器中顯示效果10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟n出于Widget的安全和性能考慮,Widget支持的布局和控件存在一些限制 n目前Widget支持的布局有框架布局、線性布局和相關布局 n支持的界面控件有AnalogClock 、Button、Chronomete

16、r、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StatckView和AdapterViewFlipper 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) nWidget元數(shù)據(jù)定義了Widget最基本的信息,包括Widget的尺寸、更新周期、布局文件位置、預覽圖片、拉伸方向和配置界面等 nSimpleWidget示例Widget元數(shù)據(jù)的文件保存在/res/xml/widget_template.xml,該文件的完整代碼如下1 2 n第2行使用appwi

17、dget-provider標簽聲明了Widget的元數(shù)據(jù) n第4行和第5行定義了Widget的兩個關鍵屬性 nminWidth和minHeight分別表示缺省情況下Widget的顯示寬度和高度,也就是Widget在拖拽到主屏幕時的尺寸nAndroid 3.1后的系統(tǒng)支持改變Widget的顯示尺寸,代碼第6行聲明Widget的尺寸可變,horizontal|vertical表示在水平和垂直方向上的大小都是可以變化的10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) n其中,不可調(diào)整、水平方向調(diào)整、垂直方向調(diào)整、水平與垂直方向調(diào)整,這四種方式的參數(shù)分別為non

18、e、horizontal、vertical、horizontal|verticaln第7行和第8行中,Widget的最小尺寸由minResizeWidth和minResizeHeight決定 nminResizeHeight是Widget能夠重新設置的最小高度,此值在大于minHeight時,或resizeMode中不支持垂直(vertical)拖拽時,此屬性不起作用 nminResizeWidth是Widget能夠重新設置的最小寬度,此值在超過minWidth時,或者resizeMode不支持水平(horizontal)拖拽時,此屬性不起作用 10.2 Widget基礎 n10.2.2 開發(fā)

19、步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) n第9行的updatePeriodMillis表示以毫秒為單位的更新周期,Android會以這個速率喚醒設備以便更新Widget,開發(fā)人員應盡可能的降低設備被喚醒的次數(shù),以降低設備的能量消耗 n當更新周期小于30分鐘時,Android系統(tǒng)并不按照此參數(shù)更新Widget,如果需要頻繁更新Widget,可以在Service服務中實現(xiàn) n第10行的initialLayout用來指定Widget的布局 n第11行的previewImage定義了在Android系統(tǒng)Widget列表中預覽圖像,如果不設置該值,則以程序的圖標作為預覽圖像 nSimpleWidget

20、示例的預覽圖像如下圖所示10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q定義Widget的元數(shù)據(jù) nSimpleWidget示例的預覽圖像10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q實現(xiàn)Widget的添加、刪除、更新 n實現(xiàn)Widget的添加、刪除、更新等過程,主要是通過AppWidgetProvider類來實現(xiàn) n這個類本身繼承BroadcastReceiver,用來接收與Widget相關的更新、刪除、生效和失效等消息,當AppWidgetProvider接收這些消息后,會分別調(diào)用響應的事件處理函數(shù),如下表所示 事件事件 調(diào)用函數(shù)調(diào)用函數(shù) 說明說明 ACT

21、ION_APPWIDGET_UPDATE onUpdate() Widget更新 ACTION_APPWIDGET_DELETED onDelete() Widget刪除 ACTION_APPWIDGET_ENABLED onEnabled() Widget生效 ACTION_APPWIDGET_DISABLED onDisabled() Widget失效 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q實現(xiàn)Widget的添加、刪除、更新 n在SimpleWidget示例中,WidgetProvider繼承AppWidgetProvider類,在Widget更新、刪除等操作過程

22、中調(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 WidgetProvider extends AppWidgetProvider 9 private static fina

23、l String TAG = WIDGET;10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q實現(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(Context context, int appWidgetIds) 18 Log.d(TAG, onDele

24、ted);19 20 21 Override22 public void onEnabled(Context context) 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q實現(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基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q實現(xiàn)Widget的添加、刪除、更新 n代碼中雖然重載了的onUpdate()

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

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

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

28、添加到主屏幕時,系統(tǒng)會按順序調(diào)用onEnable()和onUpdate() n當再次向主屏幕添加Widget時,系統(tǒng)則僅調(diào)用onUpdate() n當從主屏幕刪除Widget時,如果主屏幕還有這個Widget的實例,則系統(tǒng)僅調(diào)用onDelete() n如果被刪除的是這個Widget的最后一個實例,則系統(tǒng)在調(diào)用onDelete()后會調(diào)用onDisable() 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q在AnroidManifest.xml文件中聲明Widget n要讓Widget生效還需在AnroidManifest.xml文件中進行聲明,主要在該文件中聲明AppWidg

29、etProvider類。AnroidManifest.xml的完整代碼如下1 2 6 7 8 9 12 13 15 16 17 18 19 20 10.2 Widget基礎 n10.2.2 開發(fā)步驟開發(fā)步驟 q在AnroidManifest.xml文件中聲明Widgetn第12行聲明了receiver標簽,android:name屬性定義了AppWidgetProvider的子類 n第13行meta-data標簽中的android:name屬性,使用vider表示這里的數(shù)據(jù)是Widget的元數(shù)據(jù) n第14行的android:resource屬性聲明了元

30、數(shù)據(jù)的資源路徑 n第15行定義了intent-filter標簽,代碼第16行聲明接收ACTION_APPWIDGET_UPDATE 消息 10.2 Widget基礎 n10.2.3 調(diào)試過程調(diào)試過程 q在完成SimpleWidget示例的所有代碼后,進入Widget的調(diào)試過程q在進行Widget調(diào)試前,首先介紹如何安裝、加載和刪除Widget組件q安裝Widget與安裝其它程序相似,是通過Eclipse上的運行(Run)按鈕啟動程序的編譯、鏈接、打包和安裝過程,唯一區(qū)別是在Widget安裝到模擬器后,不會直接出現(xiàn)在主屏幕上,而需要用戶在Android系統(tǒng)的Widget列表中手動將Widget添

31、加到主屏幕上。Android系統(tǒng)的Widget列表如下圖所示 10.2 Widget基礎 n10.2.3 調(diào)試過程調(diào)試過程 qAndroid系統(tǒng)的Widget列表10.2 Widget基礎 n10.2.3 調(diào)試過程調(diào)試過程 q用戶通過長時間(超過2秒)點擊SimpleWidget的預覽圖標,將SimpleWidget實例加載到主屏幕上,缺省情況下占據(jù)31個單元格,如下圖(a)所示q在主屏幕上,通過長時間點擊SimpleWidget實例,可以進入調(diào)整Widget尺寸狀態(tài),如下圖(b)所示,Widget邊緣出現(xiàn)四個實心菱形,通過拖拽這些實心菱形,可以調(diào)整Widget的尺寸。SimpleWidget

32、實例在下圖(b)中占據(jù)了42個單元格 10.2 Widget基礎 n10.2.3 調(diào)試過程調(diào)試過程 qSimpleWidget示例效果n左:圖(a)初始尺寸 右:圖(b)拉伸效果10.2 Widget基礎 n10.2.3 調(diào)試過程調(diào)試過程 q如果希望添加第二個SimpleWidget實例,過程與添加第一個SimpleWidget實例的過程完全一樣 q在希望刪除Widget時,同樣是通過長時間點擊主屏幕上的Widget實例,主屏幕上方會會出現(xiàn)垃圾桶,直接將Widget實例拖到垃圾桶即可 q需要注意的是主屏幕上的垃圾桶是隱藏的,需要通過長時間點擊Widget示例才會出現(xiàn) q當Widget實例在垃圾

33、桶上方呈現(xiàn)出紅色時,松開手指便可完成了刪除操作 10.3 Widget配置 n在Widget的使用過程中,有時用戶需要根據(jù)個人喜好設置Widget的不同特征,如Widget的外觀風格、字體顏色、字體大小、更新時間或背景圖案等n比較普遍的做法是在Widget添加到主屏幕時,啟動一個用于配置Widget的Activity,用戶在這個Activity中設定Widget的特征n配置Widget特征的Activity,需要在Widget元數(shù)據(jù)XML文件中進行聲明,聲明的屬性為android:configure,其值為Activity所在的類,示例代碼如下 10.3 Widget配置 Widget元數(shù)據(jù)X

34、ML文件中的聲明代碼1 2 n代碼第5行中,Activity使用了帶命名空間(edu.hrbeu.ConfigWidget)的聲明方式,這是因為調(diào)用Activity的Widget宿主與Activity并不在相同的命名空間中n元數(shù)據(jù)中聲明的Activity,在每個Widget實例被添加到主屏幕前會被啟動n當用戶完成配置選擇關閉Activity,Widget才會出現(xiàn)在主屏幕上10.3 Widget配置 n用戶配置Widget的Activity也需要在AndroidManifest.xml文件中聲明n不同于聲明普通的Activity,這種Activity是被Widget的宿主通過發(fā)送android.

35、appwidget.action.APPWIDGET_CONFIGURE動作(Action)啟動的,所以此Activity需要接收Intent消息,示例代碼如下1 2 3 4 5 10.3 Widget配置 n當用戶使用Activity完成Widget的配置后,Activity有責任調(diào)用相應代碼對Widget進行更新nActivity可以直接調(diào)用AppWidgetManager類更新Widget,也可也調(diào)用開發(fā)人員在AppWidgetProvider中編寫的靜態(tài)更新函數(shù),實現(xiàn)Widget的更新nAppWidgetManger是負責管理Widget的類,向AppWidgetProvider發(fā)送通

36、知10.3 Widget配置 n要實現(xiàn)使用Activity配置Widget特征,并在適當?shù)臅r候更新Widget,可以參考如下步驟q獲取Widget的IDnWidget的宿主在啟動Activity時,將Widget的ID保存在Intent中,通過調(diào)用extras.getInt()函數(shù),獲取Widget的IDnextras.getInt(String key, int defaultValue)函數(shù)中,參數(shù)1是獲取數(shù)據(jù)的關鍵字,應使用關鍵字appWidgetId,或AppWidgetManager.EXTRA_APPWIDGET_IDn參數(shù)2是無法獲取數(shù)據(jù)時函數(shù)返回的代替數(shù)據(jù),示例代碼如下1 In

37、tent 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_APPWIDGET_ID) 7 finish();8 10.3 Widget配置 n第4行的AppWidgetMana

38、ger.INVALID_APPWIDGET_ID的值為0,表示沒有獲取到Widget的IDn第6行和第7行說明,在沒有正確獲取到Widget的ID時,可以立即關閉Activity,因為沒有正確的ID,即使完成配置工作,也無法將配置信息正確傳遞回Widget q配置Widgetn這個過程用戶會在界面上選擇相應的配置方案和配置信息,并最終通過事件引發(fā)更新Widget過程,并關閉Activity q更新Widgetn在更新Widget時,首先通過調(diào)用getInstance(context)函數(shù)獲取AppWidgetManager實例,然后建立一個RemoteViews,在這個RemoteViews上

39、更改Widget的界面元素,最后調(diào)用updateAppWidget(int, views)函數(shù)完成Widget更新 10.3 Widget配置 nRemoteViews是可在其它進程中顯示的視圖類,提供對部分界面控件的最基本的操作。示例代碼如下1 AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);2 RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.widget_layout);3 views.setText

40、Color(R.id.label,textColor);4 appWidgetManager.updateAppWidget(appWidgetId, views);q第2行的R.layout.widget_layout是Widget的布局 q第3行setTextColor()函數(shù)可以設置TextView控件的字體顏色,TextView控件的ID為R.id.label,textColor是代表顏色的Int型整數(shù) q第4行的updateAppWidget()函數(shù)中,參數(shù)1是Widget的ID,參數(shù)2是剛建立的RemoteViews q設置返回信息,并關閉Activityn通過調(diào)用setResul

41、t(int resultCode, Intent data)函數(shù),設置Activity的返回代碼和返回數(shù)據(jù) n返回代碼應為RESULT_OK或RESULT_CANCELED。RESULT_OK表示W(wǎng)idget設置成功,Widget宿主會將Widget實例加載到主屏幕上10.3 Widget配置 n如果返回的是RESULT_CANCELED,Widget宿主則取消Widget實例的加載過程,Widget也不會出現(xiàn)在主屏幕上n返回數(shù)據(jù)應包含Widget的ID,并使用AppWidgetManager.EXTRA_APPWIDGET_ID作為關鍵字,示例代碼如下1 Intent resultValue

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

43、0.3 Widget配置 n在未正確完成Widget配置前,如果用戶離開Activity配置界面,Activity的返回代碼則是RESULT_CANCELED nConfigWidget示例中提供了完整的代碼,說明如何在Activity中選擇Widget中TextView的字體顏色 nConfigWidget示例是在SimpleWidget示例代碼的基礎上進行的修改和添加,部分代碼的理解可以參考SimpleWidget示例代碼的說明 nConfigWidget示例的Widget配置界面如下圖所示10.4 Widget與Service n在Widget中如果需要進行頻繁更新,一般采用Servic

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

45、如何使用Service更新Widget。ServiceWidget示例的用戶界面如下圖所示nServiceWidget示例在AppWidgetProvider中啟動Service,當最后一個Widget實例在主屏幕上被刪除時停止這個Service nService在啟動后會開啟一個工作線程,線程每2秒鐘產(chǎn)生一個隨機小數(shù),并將這個隨機小數(shù)顯示在Widget的界面上 10.4 Widget與Service nService的核心代碼1 Override2 public void run() 3 while(!Terrupted() 4 double randomDouble =

46、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(),進行Widget界面更新10.4 Widget與Service nWidgetProvider類繼承AppWidg

47、etProvider,其中的公有靜態(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 RemoteViews views = newRemoteViews(context.getPackag

48、eName(),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.add(appWidgetId);13 14 10.4 Widget與Service qupdateAp

49、pWidget()函數(shù)每2秒被執(zhí)行一次,負責所有Widget實例的更新q代碼第1行定義了一個隊列widgetIds,用于保存所有Widget實例的ID值 q代碼第8行獲取Widget實例的數(shù)量,并在代碼第11行實現(xiàn)Widget的更新操作 q代碼第10行和第12行分別實現(xiàn)隊列數(shù)據(jù)的取出和加入,主要目的是為了遍歷隊列中所有Widget的ID值 n更新所有Widget實例需要Widget的ID值,因此在WidgetProvider類onUpdate()函數(shù)中需將新建Widget的ID值添加到widgetIds隊列中,并在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(appWidgetIdsi);7 L

溫馨提示

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

評論

0/150

提交評論