《Android移動(dòng)應(yīng)用開發(fā)》Intent與應(yīng)用間的通信_(tái)第1頁
《Android移動(dòng)應(yīng)用開發(fā)》Intent與應(yīng)用間的通信_(tái)第2頁
《Android移動(dòng)應(yīng)用開發(fā)》Intent與應(yīng)用間的通信_(tái)第3頁
《Android移動(dòng)應(yīng)用開發(fā)》Intent與應(yīng)用間的通信_(tái)第4頁
《Android移動(dòng)應(yīng)用開發(fā)》Intent與應(yīng)用間的通信_(tái)第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Intent2023/9/28082023/9/28認(rèn)識(shí)Intent構(gòu)建Intent目錄CONTENT12解析Intent3參考教材:《Android應(yīng)用開發(fā)項(xiàng)目化教程》認(rèn)識(shí)Intent作用Intent是一個(gè)消息傳遞對(duì)象,可以使用它協(xié)助應(yīng)用之間的交互與通訊。Intent負(fù)責(zé)對(duì)應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。Intent不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的Activity/Service之間的交互。1認(rèn)識(shí)Intent啟動(dòng)組件ActivitystartActivity()

startActivityForResult()ServicestartService()

bindService()BroadcastReceiversendBroadcast()sendOrderedBroadcast()sendStickyBroadcast()1認(rèn)識(shí)Intent兩種Intent顯式Intent按名稱(完全限定類名)指定要啟動(dòng)的組件。通常用于自己的應(yīng)用中。IntentdownloadIntent=newIntent(this,DownloadService.class);downloadIntent.setData(Uri.parse(fileUrl));startService(downloadIntent);1認(rèn)識(shí)Intent兩種Intent隱式Intent不會(huì)指定特定的組件,而是聲明要執(zhí)行的常規(guī)操作,從而允許其他應(yīng)用中的組件來處理它。Uriuri=Uri.parse("");Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);1Intent在通信過程中需要檢查相應(yīng)的權(quán)限,如果AndroidManifext.xml中沒有相應(yīng)的權(quán)限說明,則無法激活組件。認(rèn)識(shí)Intent兩種Intent驗(yàn)證Activity用戶可能沒有任何應(yīng)用處理發(fā)送到startActivity()的隱式Intent。如果出現(xiàn)這種情況,則調(diào)用將會(huì)失敗,且應(yīng)用會(huì)崩潰。要驗(yàn)證Activity是否會(huì)接收Intent,需要對(duì)Intent對(duì)象調(diào)用resolveActivity()。如果結(jié)果為非空,則至少有一個(gè)應(yīng)用能夠處理該Intent,且可以安全調(diào)用startActivity()。如果結(jié)果為空,則不應(yīng)使用該Intent。如有可能,您應(yīng)禁用發(fā)出該Intent的功能。1認(rèn)識(shí)Intent兩種Intent使用應(yīng)用選擇器如果有多個(gè)應(yīng)用響應(yīng)隱式Intent,且用戶可能希望每次使用不同的應(yīng)用,則應(yīng)采用顯式方式顯示選擇器對(duì)話框。1認(rèn)識(shí)Intent兩種Intent特別說明為了確保應(yīng)用的安全性,啟動(dòng)Service時(shí),請(qǐng)始終使用顯式Intent,且不要為服務(wù)聲明Intent過濾器。使用隱式Intent啟動(dòng)服務(wù)存在安全隱患,因?yàn)槟鸁o法確定哪些服務(wù)將響應(yīng)Intent,且用戶無法看到哪些服務(wù)已啟動(dòng)。從Android5.0(API級(jí)別21)開始,如果使用隱式Intent調(diào)用bindService(),系統(tǒng)會(huì)拋出異常。1構(gòu)建Intent組件名稱ComponentNameIntent對(duì)象通過組件來顯式設(shè)置Intent的訪問對(duì)象。指定的方法 setComponent(ComponentName)setClass(Context,Class)setClassName()通過getComponent()讀取組件。ComponentName對(duì)象是目標(biāo)組件的完全限定類名(如"com.android.mms.ui.ConversationList")和應(yīng)用程序所在的包在清單文件中的名字(如"com.android.mms")的組合。其中組件名字中的包部分不必一定和清單文件中的包名一樣。2構(gòu)建Intent操作ActionAction是一個(gè)字符串,是對(duì)Intent執(zhí)行動(dòng)作的描述Action可以是系統(tǒng)預(yù)定義的,如:ACTION_CALLACTION_EDITACTION_MAINAction也可以是自己定義的字符串。自定義動(dòng)作字符串應(yīng)該包含應(yīng)用程序包名前綴。通過setAction()方法設(shè)置,通過getAction()方法讀取。Action很大程度上決定了剩下的Intent如何構(gòu)建,特別是數(shù)據(jù)和附加字段。因此,應(yīng)該盡可能明確指定動(dòng)作,并緊密關(guān)聯(lián)到其他Intent字段。2構(gòu)建Intent數(shù)據(jù)DataData是作用于Intent上的數(shù)據(jù)的Uri和數(shù)據(jù)的MIME類型。在Android中,傳給Intent的數(shù)據(jù)用Uri格式表示,因此需要使用Uri.parse()方法將字符串格式化。不同的動(dòng)作有不同的數(shù)據(jù)規(guī)格。例如:ACTION_EDIT使用編輯文檔的UriACTION_CALL使用tel:URI和將撥打的號(hào)碼ACTION_VIEW使用http:Uri主要方法:setData()方法指定數(shù)據(jù)的UrisetType()指定MIME類型setDataAndType()指定數(shù)據(jù)的Uri和MIME類型(提倡使用本方法)getData()讀取UrigetType()讀取類型。2構(gòu)建Intent類別CategoryCategory是一個(gè)字符串,描述了應(yīng)該處理Intent的組件類型信息??梢栽谝粋€(gè)Intent對(duì)象中指定任意數(shù)量的類別描述。Intent類定義了許多Category常數(shù)。在AndroidManifest.xml中,ent.action.MAIN和ent

.category.LAUNCHER分別標(biāo)記Activity開始新的任務(wù)和轉(zhuǎn)到啟動(dòng)列表界面。向Intent對(duì)象添加一個(gè)類別使用addCategory()方法,刪除一個(gè)之前添加的類別使用removeCategory()方法,獲取Intent對(duì)象中的所有類別使用getCategories()方法。2構(gòu)建Intent附加信息Extra攜帶完成請(qǐng)求操作所需的附加信息的鍵值對(duì)??梢允褂酶鞣NputExtra()方法添加附加數(shù)據(jù),每種方法均接受兩個(gè)參數(shù):鍵名和值??梢詣?chuàng)建一個(gè)包含所有附加數(shù)據(jù)的Bundle對(duì)象,然后使用putExtras()將Bundle插入Intent中。Intentit=newIntent(Activity.this,Activity2.class);Bundlebundle=newBundle();bundle.putString(“msg","ThisisfromMainActivity!");it.putExtras(bundle);startActivity(it);2構(gòu)建Intent標(biāo)志Flags在Intent類中定義的、充當(dāng)Intent元數(shù)據(jù)的標(biāo)志。標(biāo)志可以指示Android系統(tǒng)如何啟動(dòng)Activity(例如,Activity應(yīng)屬于哪個(gè)任務(wù)),以及啟動(dòng)之后如何處理(例如,它是否屬于最近的Activity列表)。Intentintent=newIntent(this,xxx.class);intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);2解析Intent隱式Intent的執(zhí)行流程創(chuàng)建隱式Intent時(shí),Android系統(tǒng)通過將Intent的內(nèi)容與在設(shè)備上其他應(yīng)用的清單文件中聲明的Intent過濾器進(jìn)行比較,從而找到要啟動(dòng)的相應(yīng)組件。如果與Intent過濾器匹配,則系統(tǒng)將啟動(dòng)該組件,并將其傳遞給對(duì)象。如果多個(gè)Intent過濾器兼容,則系統(tǒng)會(huì)顯示一個(gè)對(duì)話框,支持用戶選取要使用的應(yīng)用。3解析IntentIntent過濾器每個(gè)Intent過濾器均根據(jù)Intent的操作、數(shù)據(jù)和類別指定自身接受的Intent類型。定義Intent過濾器在AndroidManifest中,使用<intent-filter>元素為每個(gè)應(yīng)用組件聲明一個(gè)或多個(gè)Intent過濾器僅當(dāng)隱式Intent可以通過Intent過濾器之一傳遞時(shí),系統(tǒng)才會(huì)將該Intent傳遞給應(yīng)用組件。3注意:顯式Intent始終會(huì)傳遞給其目標(biāo),無論組件聲明的Intent過濾器如何均是如此。解析IntentIntent過濾器包含元素action在name屬性中,聲明接受的Intent操作。該值必須是操作的文本字符串值,而不是類常量。data使用一個(gè)或多個(gè)指定數(shù)據(jù)URI(scheme、host、port、path等)各個(gè)方面和MIME類型的屬性,聲明接受的數(shù)據(jù)類型。category在name屬性中,聲明接受的Intent類別。該值必須是操作的文本字符串值,而不是類常量。3解析IntentIntent過濾器示例

3解析IntentIntent過濾器特別說明為了接收隱式Intent,必須將CATEGORY_DEFAULT類別包括在Intent過濾器中。方法startActivity()和startActivityForResult()將按照已申明CATEGORY_DEFAULT類別的方式處理所有Intent。如果未在Intent過濾器中聲明此類別,則隱式Intent不會(huì)解析為您的Activity??梢詣?chuàng)建一個(gè)包括多個(gè)action、data或category實(shí)例的過濾器。創(chuàng)建時(shí),僅需確定組件能夠處理這些過濾器元素的任何及所有組合即可。使用Intent過濾器時(shí),無法安全地防止其他應(yīng)用啟動(dòng)組件。盡管Intent過濾器將組件限制為僅響應(yīng)特定類型的隱式Intent,但如果開發(fā)者確定您的組件名稱,則其他應(yīng)用有可能通過使用顯式Intent啟動(dòng)您的應(yīng)用組件。如果必須確保只有您自己的應(yīng)用才能啟動(dòng)您的某一組件,需要將該組件exported屬性設(shè)置為"false"。3解析IntentAction過濾規(guī)則Intent對(duì)象中指定的動(dòng)作必須匹配Intent過濾器動(dòng)作列表中的一個(gè)。如果Intent或Intent過濾器沒有指定一個(gè)動(dòng)作,則:如果Intent過濾器沒有指定動(dòng)作,沒有一個(gè)Intent被匹配,所有的Intent都檢測失敗,即沒有Intent能夠通過Intent過濾器;如果Intent對(duì)象沒有指定動(dòng)作(但必須指定其他屬性),將自動(dòng)通過檢查(前提是Intent過濾器的動(dòng)作列表不為空)。3解析IntentCategory過濾規(guī)則Intent對(duì)象中的每個(gè)類別必須匹配Intent過濾器中的一個(gè)。即Intent過濾器能夠列出額外的類別,但是Intent對(duì)象中的類別都必須能夠在Intent過濾器中找到,只要有一個(gè)類別在Intent過濾器列表中沒有,就算類別檢測失敗。因此,原則上如果一個(gè)Intent對(duì)象中沒有類別(即類別字段為空),那么應(yīng)該總是通過類別測試,而不管Intent過濾器中有什么類別。但是有個(gè)例外,Android對(duì)待所有傳遞給Context.startActivity()的隱式Intent至少包含“ent.category.DEFAULT”類別。3解析IntentData過濾規(guī)則一個(gè)Intent對(duì)象既不包含Uri,也不包含數(shù)據(jù)類型:僅當(dāng)Intent過濾器也不指定任何Uri和數(shù)據(jù)類型時(shí),才能通過檢測,否則不能通過。一個(gè)Intent對(duì)象包含Uri,但不包含數(shù)據(jù)類型:僅當(dāng)Intent過濾器也不

溫馨提示

  • 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. 人人文庫網(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)論