安卓組件通信與廣播消息_第1頁
安卓組件通信與廣播消息_第2頁
安卓組件通信與廣播消息_第3頁
安卓組件通信與廣播消息_第4頁
安卓組件通信與廣播消息_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

組件通信與廣播消息本章學習內(nèi)容使用Intent進行組件通信的原理使用Intent啟動Activity的方法獲取Activity返回值的方法Intent過濾器的原理與匹配機制發(fā)送和接收廣播消息的方法什么是IntentAndroid中一種消息傳遞機制,可以通過intent消息激活activity、service和broadcastreceiver。在運行時綁定在同一應(yīng)用或不同應(yīng)用的組件。每個intent本身是一個Intent類的對象,是對一個執(zhí)行動作的抽象描述,包含了組件名(componentname)、動作(action)、數(shù)據(jù)(data)、類型(category)、附加信息(extra)和標志(flags)信息。應(yīng)用A應(yīng)用B某組件某組件發(fā)送Intent系統(tǒng)啟動發(fā)送Intent組件名(componentname)接收intent的組件的名字。是目標組件的完整且有效的類名稱(如“ject.FreneticActivity”)。組件名是可選的。如果設(shè)置,intent對象就發(fā)送給該類的實例;如果沒設(shè)置,Android會使用intent對象的其它信息去定位一個適合的目標。動作(action)

待執(zhí)行的由字符串命名的動作。Intent類中定義了許多action常量,包括這些:數(shù)據(jù)(data)URI(UniformResourceIdentifier)標識抽象和物理資源的字符串。資源標識形式多樣:URL,URNURI={URL,URN,……}

URI語法成分<scheme>:<scheme-specific-part>scheme:Justastherearemanydifferentmethodsofaccesstoresources,thereareavarietyofschemesforidentifyingsuchresources.ItdefinesthesemanticsfortheremainderoftheURIstring.Android中的URIEachpartoftheURI:scheme://host:port/pathForexample,

content://ject:200/folder/subfolder/etctheschemeis"content",thehostis"ject",theportis"200",andthepathis"folder/subfolder/etc".ThehostandporttogetherconstitutetheURI

authority;ifahostisnotspecified,theportisignored.Eachoftheseattributesisoptional,buttheyarenotindependentofeachother:Foranauthoritytobemeaningful,aschememustalsobespecified.Forapathtobemeaningful,bothaschemeandanauthoritymustbespecified.

content://ject.healthcareprovider/nurses/rn數(shù)據(jù)(data)可以明確設(shè)設(shè)置intent對象中的數(shù)數(shù)據(jù)類型。。setData()方法僅指定定數(shù)據(jù)的URI,setType()僅指定數(shù)據(jù)據(jù)的MIME類型,setDataAndType()既指其定數(shù)數(shù)據(jù)的URI,又指定MIME類型。URI通過getData()獲得,類型型通過getType()獲得。類型(category)是一個字符符串,包含含了可以處理intent的這類組件件的其它信信息。在一個intent對象中可以放置任任意多個類類型描述。Intent類定義了很很多類型常常量:addCategory()方法是在intent對象中放入入一個category,removeCategory()將前面添加加的category刪除,getCategories()獲得當前intent對象中的所所有category。附加信息(extra)由一些鍵值對組成,是發(fā)發(fā)送給處理理intent的組件的額額外信息。。Key-valuepairsthatcarryadditionalinformationrequiredtoaccomplishtherequestedaction.一些actions與特殊的extras相配。例如,ACTION_TIMEZONE_CHANGEDintent

有一一個“time-zone“extra,它標標識新的時時間區(qū),ACTION_HEADSET_PLUGintent有一個個”state“extra表示耳耳機是否現(xiàn)現(xiàn)在處于插插入狀態(tài)。。putExtra(),twoparameters:thekeynameandthevalue.YoucanalsocreateaBundleobjectwithalltheextradata,theninserttheBundleintheIntentwithputExtras().Intent類定義義了很多EXTRA_*,見見文檔標志(flags))各種各樣類類型的標志志。許多標標志指導Android系統(tǒng)怎樣啟啟動一個activity(如activity屬于哪個任任務(wù)),activity啟動后怎樣樣對待它((如,是否否它應(yīng)被放放入最近activities列表)。所所有這些標標志在Intent類中定義。。Intent的用途途啟動Activity和Service在Android系系統(tǒng)上發(fā)布布廣播消息息—可以是接收收到的特定定數(shù)據(jù)或消消息,也可可以是手機機的信號變變化或電池池的電量低低等信息給每種組件件發(fā)送intent都有不同同的機制啟動Activity在Android系系統(tǒng)中,應(yīng)應(yīng)用程序一一般都有多多個Activity,Intent可以實現(xiàn)不同Activity之之間的切換換和數(shù)據(jù)傳傳遞啟動Activity方式顯式啟動:必須在Intent中指明明啟動的Activity隱式啟動:Intent無需指指明具體啟啟動哪一個個Activity,Android系統(tǒng)根根據(jù)Intent的的action、data和category來決定啟動動哪一個Activity。。選擇權(quán)由由Android系系統(tǒng)和最終終用戶來決決定。獲得返回值值的啟動啟動Activity顯式啟動創(chuàng)建一個Intent(見API中android.content.Intent)指定當前的應(yīng)用用程序上下下文以及要啟動的Activity把創(chuàng)建好的的這個Intent作為參數(shù)數(shù)傳遞給startActivity()方法Intentintent=newIntent(MainActivity.this,NewActivity.class);startActivity(intent);顯式啟動下面用IntentDemo為例說明明如何使用用Intent啟動動新的Activity。程序默認啟啟動的Activity是MainActivity,,在用戶點點擊“啟動動Activity”按鈕后后,程序啟啟動NewActivity實現(xiàn)步驟:(1)在AndroidManifest.xml文件件中注冊這這兩個Activity;—使用<activity>標簽,嵌嵌套在<application>標標簽內(nèi)部。。(2)創(chuàng)建建兩個Activity的布布局文件;;(3)編寫寫MainActivity.java和NewActivity.java文件件。隱式啟動不需要指明明需要啟動動哪一個Activity,而由Android系統(tǒng)來來決定。Android系統(tǒng)統(tǒng)會在程序序運行時解解析Intent,,并根據(jù)一一定的規(guī)則則對Intent中中的action、data和category與Activity的intent過濾器器中的匹配。。啟動Activity匹配的組件件可以是程序本身的Activity,也可以以是Android系統(tǒng)內(nèi)置應(yīng)應(yīng)用的Activity,還可以以是第三方應(yīng)用用程序提供供的Activity。。這種方式強強調(diào)了Android組件的的可復用性性。如果果程程序序開開發(fā)發(fā)人人員員希希望望啟啟動動一一個個瀏瀏覽覽器器,,查查看看指指定定的的網(wǎng)網(wǎng)頁頁內(nèi)內(nèi)容容,,卻卻不不能能確確定定具具體體應(yīng)應(yīng)該該啟啟動動哪哪一一個個Activity??程序序開開發(fā)發(fā)人人員員可可以以將將瀏覽覽動動作作和Web地地址址作為為參參數(shù)數(shù)傳傳遞遞給給Intent,,Android系系統(tǒng)統(tǒng)則則通通過過匹匹配配動動作作和和數(shù)數(shù)據(jù)據(jù)格格式式,,找找到到最最適適合合于于此此動動作作和和數(shù)數(shù)據(jù)據(jù)格格式式的的組組件件。。隱式式啟啟動動WebViewIntentDemo示示例例說說明明了了如如何何隱隱式式啟啟動動Activity,,用用戶戶界界面面獲取取Activity返返回回值值的的啟啟動動方方式式很多多情情況況下下,,后后啟啟動動的的Activity是為為了了讓讓用用戶戶對對特特定定信信息息進進行行選選擇擇,,在后后啟啟動動的的Activity關(guān)閉閉時時,這這些些信信息息是是需要要返返回回給給先先前前啟啟動動的的Activity。后啟啟動動的的Activity稱為為““子子Activity””,先先啟啟動動的的Activity稱為為““父父Activity””。如果果需需要要將將子子Activity的的信信息息返返回回給給父父Activity,則則可可以以使用用獲獲取取Activity返返回回值值的的方方式式啟啟動動子子Activity。一般般可可以以分分為為以以下下三三個個步步驟驟::在父父Activity中中啟啟動動子子Activity在子子Activity中中設(shè)設(shè)置置返返回回值值在父父Activity中中獲獲取取返返回回值值在父父Activity中中啟啟動動子子ActivitystartActivityForResult(Intent,requestCode)::參數(shù)數(shù)Intent::決定定啟啟動動哪哪個個Activity;;參數(shù)數(shù)requestCode:請請求求碼碼;———所有有子子Activity返返回回時時,Android系統(tǒng)統(tǒng)都都調(diào)調(diào)用用父父Activity的同同一一個個處處理理方方法法,,因因此此父父Activity使用用requestCode來來確定數(shù)據(jù)據(jù)是哪一一個子Activity返回的顯式啟動子Activity的代代碼如下下隱式啟動子Activity的代代碼如下下intSUBACTIVITY1=1;Intentintent=newIntent(MainActivity.this,SubActivity1.class);startActivityForResult(intent,SUBACTIVITY1);intSUBACTIVITY2=2;Uriuri=Uri.parse("content://contacts/people");Intentintent=newIntent(Intent.ACTION_PICK,uri);startActivityForResult(intent,SUBACTIVITY2);在子Activity調(diào)用finish()關(guān)閉前前,調(diào)用setResult()設(shè)定需要要返回給給父Activity的數(shù)據(jù)據(jù)。setResult(intresultCode,Intentdata):resultCode:表示子子Activity的的返回狀狀態(tài),通通常為Activity.RESULT_OK((正常返返回數(shù)據(jù)據(jù))或者者Activity.RESULT_CANCELED(取消消返回數(shù)數(shù)據(jù)),,也可以以是自定定義的;;data:封裝返返回數(shù)據(jù)據(jù)的一個個Intent對象。。返回數(shù)數(shù)據(jù)主要要以Uri形式式返回給給父Activity,此外外還可以以附加一一些附加加信息,,這些附附加信息息用Extra的鍵值值對表示示。在子Activity中設(shè)置置返回值值以下代碼碼說明如如何在子子Activity中中設(shè)置返返回值:Uridata=Uri.parse("tel:"+tel_number);Intentresult=newIntent(null,data);result.putExtra("address","JDStreet");setResult(RESULT_OK,result);finish();在父Activity中獲取取返回值值當子Activity執(zhí)行finish()后,,父Activity的onActivityResult()方法會被被調(diào)用,,用于獲獲取子Activity的返返回值。。如果需要要在父Activity中處處理子Activity的返返回值,,則重寫此方法。。onActivityResult()方法如下下:requestCode:請請求碼,,用來判判斷結(jié)果果是哪一一個子Activity返回回的;resultCode:表示示子Activity的返回回狀態(tài);;data:子Activity用Intent返返回的數(shù)數(shù)據(jù)。根根據(jù)返回回數(shù)據(jù)的的用途不不同,Uri數(shù)數(shù)據(jù)的協(xié)協(xié)議也不不同,也也可以使使用Extra方法直直接返回回數(shù)據(jù)本本身。publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata);示例說明明ActivityCommunicationDemo說明了了如何以以獲取Activity返回回值方式式啟動子子Activity,,以及如如何使用用Intent進行組組件間通通信。當用戶點點擊“啟啟動Activity1”和和“啟動動Activity2”按鈕鈕時,程程序?qū)⒎址謩e啟動動子Activity1和Activity2。。思路?創(chuàng)建每一一個Activity的布局局文件編寫每一一個Activity的java代代碼MainActivity.java:1、為兩兩個按鈕鈕設(shè)置事事件監(jiān)聽聽器:第一個按按鈕:以以獲得返返回值方方式啟動動Activity1;第二個按按鈕:以以獲得返返回值方方式啟動動Activity2;2、重寫寫onActivityResult():收到Activity1的返返回結(jié)果果時,顯顯示“Activity1””,并將將Activity1返回的的輸入數(shù)數(shù)據(jù)也進進行顯示示,若無無則什么么也不顯顯示;收到Activity2的返返回結(jié)果果時,只只顯示““Activity2”。。Activity1.java:為為“接受受”和““撤銷””按鈕設(shè)設(shè)置事件件監(jiān)聽器器。“接受””:將編編輯文本本框輸入入的內(nèi)容容作為結(jié)結(jié)果返回回給MainActivity,返返回狀態(tài)態(tài)“OK”;“撤銷””:返回回“RESULT_CANCLED”狀態(tài)態(tài)給MainActivity。Activity2.java:為為”關(guān)閉閉“按鈕鈕設(shè)置事事件監(jiān)聽聽器?!标P(guān)閉““:返回回“RESULT_CANCLED”狀態(tài)態(tài)給MainActivity。?Intent過濾器((IntentFilter)它是Activity,service和broadcastreceiver用來告知知系統(tǒng)它它們可以以處理什什么樣的的隱式intent的一個類類。每個過濾濾器描述述這個組組件能力力的同時時,描述述了該組組件愿意接收收的intents。每個組件件都可以以有一個或多多個intent過濾器。如何給組組件定義義Intent過濾器通常在AndroidManifest.xml文件的各各個組件件下定義義<intent-filter>元素,然然后在<intent-filter>元素中用用<action>、<category>和<data>元素聲明明該組件件所支持持的action、data和category信息。也可以在在程序代代碼中動動態(tài)地為為組件設(shè)設(shè)置Intent過濾器。。元素屬性說明<action>android:name指定組件所能響應(yīng)的動作,用字符串表示,通常由Java類名和包的完全限定名構(gòu)成<category>android:name描述組件的其它特征如(Launcher,Home等)<data>android:scheme所需要的特定協(xié)議android:host指定一個有效的主機名android:port主機的有效端口號android:path有效的URI路徑名android:mimetype指定組件能處理的數(shù)據(jù)類型(多媒體數(shù)據(jù)類型)定義<data>Intent與與Intent過濾器的的匹配策策略Android將intent中的action,data和category與所有該該類組件件的intent過濾器中的比較較。只要要有一處處不同,,這個intent就不會被被發(fā)送給給那個組組件。一個組件件可以有有多個intent過濾器,,沒有匹匹配其中中一個,,卻可能能匹配另另一個。。Intent與與Intent過濾器器的匹配配策略actiontest情況1:intent對象僅指指定單一一的action,intent過過濾器列列出一個個以上的的<action>時,,只要有有一個匹匹配上,,就通過過action部分匹匹配;情況2:intent過濾濾器不包包含<action>,任何intent都不會匹匹配上;;情況3:如果intent對象沒指指定action,intent過濾濾器包含含至少一一個<action>,則匹配配通過。。Intent與與Intent過濾器器的匹配配策略categorytest情況1::intent對對象可有有多個category,每每一個category必須須匹配intent過過濾器中中的一個個category(過濾器器可以列列出多個個category)),就通通過category部分匹匹配。情況2::若intent對象未未指定category,系系統(tǒng)會默默認為它它設(shè)置一一個category:““ent.category.DEFAULT”(CATEGORY_DEFAULT常量量)。所所以,愿愿意接收收隱式intent的的activities必須在intent過過濾器中中包含““ent.category.DEFAULT”。。Intent與與Intent過濾器器的匹配配策略datatest—僅僅比較在在intent過濾器器中提到的URI部部分和數(shù)據(jù)類型型?!狪ntent過過濾器中中path部分分可以使使用通配配符,即即pathPattern。Intent與與Intent過濾器器的匹配配策略datatest規(guī)規(guī)則:無URI,無數(shù)據(jù)類類型的intent,僅當當intent過濾器器也未指指定任何何URI和數(shù)據(jù)據(jù)類型時時。通過過data部分分匹配測測試。有URI,無數(shù)據(jù)類類型的intent(且數(shù)據(jù)據(jù)類型不不能從URI提提取),,僅當其其URI與intent過濾濾器中的的URI匹配時時(過濾濾器沒指指定數(shù)據(jù)據(jù)類型)),通過過data部分分匹配測測試。如如:不引引用實際際數(shù)據(jù)的的mailto:和tel:。有數(shù)據(jù)類類型,無URI的intent,僅當當intent過濾器器也列出出相同數(shù)數(shù)據(jù)類型型且沒指指定URI時,,通過data部分匹匹配測試試。既有URI又有有數(shù)據(jù)類類型(或數(shù)據(jù)據(jù)類型可可以從URI中中提?。┑膇ntent,僅僅當它的的數(shù)據(jù)類類型匹配配過濾器器列出的的類型之之一時,,通過數(shù)數(shù)據(jù)類型型部分的的匹配檢檢測。如果intent的URI匹匹配過濾濾器中的的一個URI或intent有一一個content:或file:URI而過過濾器沒有有指定URI時,該該intent通過過URI部部分匹配測測試。換句話說,,組件默認支支持content:和file:的的數(shù)據(jù),盡盡管其intent過濾器中中僅列出了了數(shù)據(jù)類型型。IntentResolutionDemo示示例當應(yīng)用程序序安裝到Android系統(tǒng)時,AndroidManifest.xml文件中所有有的組件和和Intent過濾器都會會注冊到Android系統(tǒng)中。這樣,Android系統(tǒng)便可以以將任何一一個Intent請求通過Intent過濾器映射射到相應(yīng)的的組件上。。Intent與廣播消息息Intent的另一用途途是發(fā)送廣播消消息,應(yīng)用程序序和Android系統(tǒng)都可以以使用Intent發(fā)送廣播消消息。廣播消息的的內(nèi)容:與應(yīng)用程程序密切相相關(guān)的數(shù)據(jù)據(jù)信息,Android的系統(tǒng)信息息,如網(wǎng)絡(luò)絡(luò)連接變化化、電池電電量低、接接收到短信信或系統(tǒng)設(shè)設(shè)置變化等等。應(yīng)用程序中中注冊了BroadcastReceiver,則可以接接收到指定定的廣播消消息。注冊BroadcastReceiverYoucaneitherdynamicallyregisteraninstanceofthisclasswithregisterReceiver()orstaticallypublishanimplementationthroughthe<receiver>taginyourAndroidManifest.xml.Note:IfregisteringareceiverinyourActivity.onResume()implementation,youshouldunregisteritinActivity.onPause().(Youwon'treceiveintentswhenpaused,andthiswillcutdownonunnecessarysystemoverhead).DonotunregisterinActivity.onSaveInstanceState(),becausethi

溫馨提示

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

最新文檔

評論

0/150

提交評論