詳解從零開始創(chuàng)建Android主屏幕Widget_第1頁
詳解從零開始創(chuàng)建Android主屏幕Widget_第2頁
詳解從零開始創(chuàng)建Android主屏幕Widget_第3頁
詳解從零開始創(chuàng)建Android主屏幕Widget_第4頁
詳解從零開始創(chuàng)建Android主屏幕Widget_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

詳解從零開始創(chuàng)建Android主屏幕Widget創(chuàng)建Android主屏幕Widget是本文要介紹的內(nèi)容,主要是來了解AndroidWidget的創(chuàng)建過程,文中很詳細(xì)的講解了AndroidWidget創(chuàng)建過程,一起來看本文詳解。當(dāng)最基本的控件,如Clock和PictureFrameHomeScreen,隨有第一款A(yù)ndroid手機(jī)的發(fā)布后,Android用戶就開始嘗試編寫各種應(yīng)用Widget(小工具)了,隨著WidgetAPI的公開,為開發(fā)人員帶來了全新有趣的開發(fā)模式,除了傳統(tǒng)的電話應(yīng)用外,還可以做其它方面的應(yīng)用開發(fā)。開發(fā)人員可以使用WidgetAPI(包含在Androidl.5中,最新版本已經(jīng)到Android2.0了)創(chuàng)建簡單的控件,然后在新的Widget中顯示和使用這些控件。本文向你介紹如何從零開始創(chuàng)建一個(gè)主屏幕應(yīng)用Widget,通過使用AlarmManager接口,以用戶設(shè)定的時(shí)間間隔更新圖片。你將看到如何創(chuàng)建一個(gè)Widget,以及如何隨機(jī)地從一組圖片中選擇一張圖片顯示,根據(jù)用戶設(shè)定的時(shí)間間隔周期性改變顯示的圖片。創(chuàng)建一個(gè)簡單的Widget包括以下幾個(gè)步驟:1、 創(chuàng)建一個(gè)RemoteView,由它為Widget提供用戶界面;2、 將RemoteView綁定一個(gè)Activity(行為)實(shí)現(xiàn)AppWidgetProvider接口;3、 在Androidmanifest配置文件中提供Widget的關(guān)鍵配置信息。項(xiàng)目準(zhǔn)備一個(gè)Widget就是一個(gè)處理特定行為的BroadcastReceiver,AppWidgetProvider接口為開發(fā)人員提供了一個(gè)框架來簡化處理這些行為,它包括以下方法:1、 onEnabled():創(chuàng)建第一個(gè)Widget時(shí)調(diào)用,如果可以,應(yīng)在這里進(jìn)行全局初始化。2、 onDisabled():它和onEnabled()相反,創(chuàng)建最后一個(gè)Widget時(shí)才調(diào)用它,如果可以,應(yīng)在這里進(jìn)行全局清理。3、 onUpdate():當(dāng)Widget需要更新它的View時(shí)調(diào)用,用戶第一次創(chuàng)建Widget時(shí)也需要調(diào)用它。4、 onDeleted():當(dāng)Widget的一個(gè)特定實(shí)例被刪除時(shí)調(diào)用,清理特定實(shí)例應(yīng)放在這里進(jìn)行。5、onReceive():此方法默認(rèn)情況下處理BroadcastReceiver行為,并調(diào)用上面的方

法(警告:根據(jù)相關(guān)文檔記載,需要開發(fā)人員自己處理某些特殊情況,更多信息請看下面的說明)。作 者 注: 點(diǎn) 擊 此 鏈 接(http:///group/android-developers/browse_thread/thread/365dled3aac30916/e405cal9df2170e2?pli=1)檢查有關(guān)AppWidget框架的缺陷信息,討論內(nèi)容包括解決此問題的代碼(也可從本文下載示例代碼,/img/2009/08/3833306_appwidget_code.zip),如果它們并不存在,可以將Widget標(biāo)識符傳遞給onUpdate()方法。為了讓Android識別Widget,需要在manifest文件中加入一個(gè)標(biāo)準(zhǔn)的標(biāo)記,下面的代碼片段顯示了一個(gè)示例:receiverandroid:name=“ImagesWidgetProvider”intent-filteractionandroid:name=“android.appwidget.action.APPWIDGET_UPDATE”//intent-filtermeta-dataandroid:name=“vider”android:resource=“@xml/imageswidget_info”//receiver你可能已經(jīng)注意到,和常見的定義不一樣,小節(jié)引用了一個(gè)XML文件資源,這個(gè)文件為Widget定義了額外的數(shù)據(jù),與AppWidgetProviderlnfo類一致,這里定義的信息是不變的,因此這個(gè)例子不包括updatePeriodMillis的值,因?yàn)檫@個(gè)程序允許用戶修改與更新時(shí)間,如果你在這里分配updatePeriodMillis,它就不能這樣做。下面是imageswidget_info.xml文件的完整代碼:?xmlversion=“1.0”encoding=“utf-8”?appwidget-providerxmlns:android=“/apk/res/android”android:minWidth=“146dp”android:minHeight=“146dp”android:initialLayout=“@layout/widget”android:configure=“com.mamlambo.imageswidget.ImagesWidgetConfiguration”/標(biāo)記定義了Widget的大小,默認(rèn)布局和創(chuàng)建Widget實(shí)例時(shí)的啟動行為配置,為了讓W(xué)idget在主屏幕上更好地顯示,Widget必須保持一定的大小,主屏幕分為特定大小的單元格,Google提供的基本原則是用你想占用的單元格數(shù)量乘以74,再減去2。在這個(gè)例子中,

Widget應(yīng)該是一個(gè)正方形,長和寬都各占兩個(gè)單元格,因此大小就是74*2-2=146.實(shí)現(xiàn)onUpdate()不顯示內(nèi)容的Widget是沒有用的,幸好這個(gè)Widget的RemoteView對象很容易實(shí)現(xiàn),它使用一組存儲在應(yīng)用程序的 drawable資源目錄下的圖片,程序使用 R.drawable.:imagename]引用這些圖片資源,代碼需要?jiǎng)?chuàng)建一個(gè)數(shù)組容納圖片的名字,這樣從這些圖片名字中隨機(jī)選擇一個(gè)就可以了。下面的代碼片段顯示了onUpdate()的實(shí)現(xiàn),它隨機(jī)顯示一張圖片:@OverridepublicvoidonUpdate(Contextcontext,AppWidgetManagerappWidgetManager,int[]appWidgetIds) {for(intappWidgetId:appWidgetIds){intimageNum= (newjava.util.Random().nextInt(IMAGES.length));RemoteViewsremoteView=newRemoteViews(context.getPackageName(),R.layout.widget);remoteView.setImageViewResource(R.id.image,IMAGES[imageNum]);appWidgetManager.updateAppWidget(appWidgetId,remoteView);}}注意onUpdate()方法使用Widget實(shí)例列表作為最后的參數(shù),每個(gè)實(shí)例必須分開處理,由于AppWidget框架的現(xiàn)有缺陷,有些實(shí)例可能不可見或不能啟用,但在這個(gè)例子中可以忽略這些問題。請記住,你自己在實(shí)現(xiàn)時(shí)可能想跟蹤哪個(gè)Widget是真正激活的。你可以下載本文提供的代碼(http:///img/2009/08/3833306_appwidget_code.zip),查看其中的R.layout.widgetXML布局定義,它基本上只是一個(gè)ImageView,RemoteViews只能使用一組有限的View對象,包括Button,ImageButton,ImageView,TextView,AnalogClock,Chronometer和ProgressBar,并且只能在FrameLayout,LinearLayout或RelativeLayout內(nèi)使用。請保持RemoteView簡單,因?yàn)樵L問是通過setImageViewResource()和setTextViewText()方法控制的,它們的目的是在另一個(gè)進(jìn)程內(nèi)畫一個(gè)View,因此你的應(yīng)用程序比正常布局要少些控制。自此,Widget最基本的部分完成了,但為了讓用戶配置圖片更新之間的時(shí)間間隔,你

必須要實(shí)現(xiàn)配置Activity,然后處理RemoteView更新的調(diào)度問題。實(shí)現(xiàn)Widget的Activity配置和manifest文件中定義的ImagesWidgetConfiguration類似,任何Activity配置都有兩個(gè)特殊情況:1、 只要一啟動,它的目的就是返回結(jié)果,因此必須要調(diào)用setResult()方法返回一個(gè)適當(dāng)?shù)慕Y(jié)果(結(jié)果要么是RESULT_CANCELED或RESULT_0K)。2、 在設(shè)置結(jié)果時(shí),Widget標(biāo)識值必須放在額外引用的AppWidgeManager.EXTRA_APPWIDGET_ID中。下面的代碼片段顯示了如何處理這兩個(gè)例外,如果用戶中途退出 Activity,調(diào)用setResult()將默認(rèn)值設(shè)為RESULT_CANCELED。Bundleextras=launchintent.getExtras();if(extras!=null) {appWidgetId=extras.getint(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);intentcancelResultValue=newintent();cancelResultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId);setResult(RESULT_CANCELED,cancelResultValue);}除了這兩個(gè)限制外,你可能還要實(shí)現(xiàn)你喜歡的Activity配置,圖1顯示了這個(gè)例子的簡單Activity配置,如果你RESULT_CANCELED,Widget不會顯示給用戶,如果你返回RESULT_0K,用戶才看得見Widget,你可以使用任意存儲機(jī)制保存Widget實(shí)例的配置數(shù)據(jù),這個(gè)例子使用的是SharedPreferences接口,存儲Widget標(biāo)識更新之間的時(shí)間,你可以下載本文配套的代碼查看完整的實(shí)現(xiàn)(http:///img/2009/08/3833306_appwidget_code.zip)。圖1配置界面:這個(gè)簡單的配置界面讓用戶設(shè)置圖片刷新間隔時(shí)間實(shí)現(xiàn)更新調(diào)度正如前面提到的,AppWidgetProviderlnfo類中的配置值是不變的,因?yàn)閡pdateTimeMillis值就在這個(gè)類中,任何有AppWidgetProviderlnfo的Widget實(shí)例,只要設(shè)置了這個(gè)值,Widget就會根據(jù)其頻率更新,沒有辦法修改它,因?yàn)檫@個(gè)應(yīng)用程序應(yīng)該讓

用戶配置Widget中圖片刷新的頻率,因此你必須自動動手實(shí)現(xiàn)。AlarmManager類是最常用的更新機(jī)制,因?yàn)樗С种貜?fù)通知,這些通知是將被觸發(fā)的簡單的Pendingintent對象。你可能會想你可以創(chuàng)建一個(gè)具有 AppWidgetManager.ACTION_APPWIDGET_UPDATE的Intent對象,然后給特定的Widget標(biāo)識符設(shè)置額外的值,接著你就可以通過調(diào)用AlarmManager的setRepeating()方法,采用調(diào)度機(jī)制反復(fù)地更新,遺憾的是,這種做法行不通,Android系統(tǒng)反復(fù)使用Intents匹配行為和方案值,那些“額外的”值是不會拿去對比的。實(shí)際上,解決方案非常簡單:首先為你的Widget定義一個(gè)方案,然后用它定義唯一的Intent實(shí)例。下面的代碼片段顯示如何實(shí)現(xiàn)這個(gè)目標(biāo):IntentwidgetUpdate=newIntent();widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,newint[]{appWidgetId});//makethispendingintentuniquewidgetUpdate.setData(Uri.withAppendedPath(Uri.parse(ImagesWidgetProvider.URI_SCHEME+“://widget/id/”),String.valueOf(appWidgetId)));PendingIntentnewPending=PendingIntent.getBroadcast(getApplicationContext(),0,widgetUpdate,PendingIntent.FLAG_UPDATE_CURRENT);//nowscheduleitAlarmManageralarms= (AlarmManager)getApplicationContext()。getSystemService(Context.ALARM_SERVICE);alarms.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(),updateRateSeconds*1000,newPending);在ImagesWidgetConfigura

溫馨提示

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

評論

0/150

提交評論