深入學(xué)習(xí)Android中的Intent
Intent提供了一種通用的消息系統(tǒng),它允許在你的應(yīng)用程序見(jiàn)傳遞Intent來(lái)執(zhí)行動(dòng)作和產(chǎn)生事件,使用Intent可以激活A(yù)ndroid應(yīng)用的三種類(lèi)型的核心組件:活動(dòng)Activity、服務(wù)Service、廣播接受者Broadcast。
Intent又分為隱士意圖和顯示意圖。
顯示意圖:調(diào)用intent.setComponent()、intent.setClassName()或者intent.setClass()方法明確的制定組件名的Intent為顯示意圖,顯示意圖明確的制定要激活哪一個(gè)組件。
隱士意圖:沒(méi)有明確的制定組件的名稱(chēng);下邊是一個(gè)隱士意圖的案例
首先應(yīng)該在清單文件中添加相應(yīng)的intent-filter
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".IntentActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OtherActivity" android:label="@string/windowtitle">
<intent-filter >
<action android:name="cn.itcast.zhangxx"/>
<action android:name="cn.itcast.laoli"/>
<category android:name="cn.itcast.category.java"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="cn.itcast.category.php"/>
<data android:scheme="itcast" android:host="www.itcast.cn" android:path="/liming"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>
</application>
在MainActivity.java中
public void openActivity(View v){
/**
* (沒(méi)設(shè)數(shù)據(jù)參數(shù)的情況下)只要Intent中的Action和Category都出現(xiàn)在Intent-Filter中,就能與之匹配,否則匹配失敗
*/
Intent intent = new Intent();//隱式意圖激活A(yù)ctivity
intent.setAction("cn.itcast.zhangxx");
intent.addCategory("cn.itcast.category.java");
// intent.setData(Uri.parse("itcast://www.itcast.cn/liming"));
// intent.setType("image/jpeg");
//根據(jù)Android的API可以知道
//This method automatically clears any data that was previously set (for example by setData(Uri)).
//也就是說(shuō)如果設(shè)置了setData方法在設(shè)置setType方法的話(huà),那么setType方法就會(huì)clers掉setData方法
//解決方案如下:
intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/liming"), "image/jpeg");
startActivity(intent);//方法內(nèi)部為Intent添加了android.intent.category.DEFAULT類(lèi)別
}
如下是隱士意圖的匹配規(guī)則:
Intent Filter(意圖過(guò)濾器)其實(shí)就是用來(lái)匹配隱式Intent的,當(dāng)一個(gè)意圖對(duì)象被一個(gè)意圖過(guò)濾器進(jìn)行匹配測(cè)試時(shí),只有三個(gè)方面會(huì)被參考到:動(dòng)作、數(shù)據(jù)(URI以及數(shù)據(jù)類(lèi)型)和類(lèi)別。
動(dòng)作測(cè)試(Action test)
一個(gè)意圖對(duì)象只能指定一個(gè)動(dòng)作名稱(chēng),而一個(gè)過(guò)濾器可能列舉多個(gè)動(dòng)作名稱(chēng)。如果意圖對(duì)象或過(guò)濾器沒(méi)有指定任何動(dòng)作,結(jié)果將如下:
- • 如果過(guò)濾器沒(méi)有指定任何動(dòng)作,那么將阻塞所有的意圖,因此所有的意圖都會(huì)測(cè)試失敗。沒(méi)有意圖能夠通過(guò)這個(gè)過(guò)濾器。
- • 另一方面,只要過(guò)濾器包含至少一個(gè)動(dòng)作,一個(gè)沒(méi)有指定動(dòng)作的意圖對(duì)象自動(dòng)通過(guò)這個(gè)測(cè)試
類(lèi)別測(cè)試(Category test)
對(duì)于一個(gè)能夠通過(guò)類(lèi)別匹配測(cè)試的意圖,意圖對(duì)象中的類(lèi)別必須匹配過(guò)濾器中的類(lèi)別。這個(gè)過(guò)濾器可以列舉另外的類(lèi)別,但它不能遺漏在這個(gè)意圖中的任何類(lèi)別。
原則上一個(gè)沒(méi)有類(lèi)別的意圖對(duì)象應(yīng)該總能夠通過(guò)匹配測(cè)試,而不管過(guò)濾器里有什么。大部分情況下這個(gè)是對(duì)的。但有一個(gè)例外,Android把所有傳給startActivity()的隱式意圖當(dāng)作他們包含至少一個(gè)類(lèi)別:”android.intent.category.DEFAULT” (CATEGORY_DEFAULT常量)。因此,想要接收隱式意圖的活動(dòng)必須在它們的意圖過(guò)濾器中包含”android.intent.category.DEFAULT”。(帶”android.intent.action.MAIN”和”android.intent.category.LAUNCHER”設(shè)置的過(guò)濾器是例外)
數(shù)據(jù)測(cè)試(Data test)
當(dāng)一個(gè)意圖對(duì)象中的URI被用來(lái)和一個(gè)過(guò)濾器中的URI比較時(shí),比較的是URI的各個(gè)組成部分。例如,如果過(guò)濾器僅指定了一個(gè)scheme,所有該scheme的URIs都能夠和這個(gè)過(guò)濾器相匹配;如果過(guò)濾器指定了一個(gè)scheme、主機(jī)名但沒(méi)有路經(jīng)部分,所有具有相同scheme和主機(jī)名的URIs都可以和這個(gè)過(guò)濾器相匹配,而不管它們的路經(jīng);如果過(guò)濾器指定了一個(gè)scheme、主機(jī)名和路經(jīng),只有具有相同scheme、主機(jī)名和路經(jīng)的URIs才可以和這個(gè)過(guò)濾器相匹配。當(dāng)然,一個(gè)過(guò)濾器中的路徑規(guī)格可以包含通配符,這樣只需要部分匹配即可。
數(shù)據(jù)測(cè)試同時(shí)比較意圖對(duì)象和過(guò)濾器中指定的URI和數(shù)據(jù)類(lèi)型。
規(guī)則如下:
a. 一個(gè)既不包含URI也不包含數(shù)據(jù)類(lèi)型的意圖對(duì)象僅在過(guò)濾器也同樣沒(méi)有指定任何URIs和數(shù)據(jù)類(lèi)型的情況下才能通過(guò)測(cè)試。
b. 一個(gè)包含URI但沒(méi)有數(shù)據(jù)類(lèi)型的意圖對(duì)象僅在它的URI和一個(gè)同樣沒(méi)有指定數(shù)據(jù)類(lèi)型的過(guò)濾器里的URI匹配時(shí)才能通過(guò)測(cè)試。這通常發(fā)生在類(lèi)似于mailto:和tel:這樣的URIs上:它們并不引用實(shí)際數(shù)據(jù)。
c. 一個(gè)包含數(shù)據(jù)類(lèi)型但不包含URI的意圖對(duì)象僅在這個(gè)過(guò)濾器列舉了同樣的數(shù)據(jù)類(lèi)型而且也沒(méi)有指定一個(gè)URI的情況下才能通過(guò)測(cè)試。
d. 一個(gè)同時(shí)包含URI和數(shù)據(jù)類(lèi)型(或者可從URI推斷出數(shù)據(jù)類(lèi)型)的意圖對(duì)象可以通過(guò)測(cè)試,如果它的類(lèi)型和過(guò)濾器中列舉的類(lèi)型相匹配的話(huà)。如果它的URI和這個(gè)過(guò)濾器中的一個(gè)URI相匹配或者它有一個(gè)內(nèi)容content:或者文件file: URI而且這個(gè)過(guò)濾器沒(méi)有指定一個(gè)URI,那么它也能通過(guò)測(cè)試。換句話(huà)說(shuō),一個(gè)組件被假定為支持content:和file: 數(shù)據(jù)如果它的過(guò)濾器僅列舉了一個(gè)數(shù)據(jù)類(lèi)型。
以上就是針對(duì)Android中的Intent詳細(xì)介紹,特別適合初學(xué)者學(xué)習(xí),希望對(duì)大家的學(xué)習(xí)有所幫助。
- Android開(kāi)發(fā)筆記之Intent初級(jí)學(xué)習(xí)教程
- Android開(kāi)發(fā)中Intent傳遞對(duì)象的方法分析
- Android中Intent傳遞對(duì)象的兩種方法Serializable,Parcelable
- Android中使用Intent在Activity之間傳遞對(duì)象(使用Serializable或者Parcelable)的方法
- Android編程使用Intent傳遞對(duì)象的方法分析
- Android使用Intent啟動(dòng)其他非系統(tǒng)應(yīng)用程序的方法
- 詳解Android中Intent對(duì)象與Intent Filter過(guò)濾匹配過(guò)程
- 詳解Android中Intent的使用方法
- Android中Intent習(xí)慣用法
- 詳解Android中IntentService的使用方法
- Android 廣播大全 Intent Action 事件詳解
- Android編程開(kāi)發(fā)之打開(kāi)文件的Intent及使用方法
- Android之Intent附加數(shù)據(jù)的兩種實(shí)現(xiàn)方法
- 從源碼剖析Android中的Intent組件
相關(guān)文章
Android如何獲取QQ與微信的聊天記錄并保存到數(shù)據(jù)庫(kù)詳解
這篇文章主要給大家介紹了關(guān)于Android如何獲取QQ與微信的聊天記錄并保存到數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2018-04-04
詳解BadTokenException報(bào)錯(cuò)解決方法
這篇文章主要介紹了BadTokenException報(bào)錯(cuò)的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Android下2d物理引擎Box2d用法簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android下2d物理引擎Box2d用法,實(shí)例分析了在Android平臺(tái)上使用Box2d的基本技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
Android使用SwipeListView實(shí)現(xiàn)類(lèi)似QQ的滑動(dòng)刪除效果
這篇文章主要介紹了Android使用SwipeListView實(shí)現(xiàn)類(lèi)似QQ的滑動(dòng)刪除效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
制作獨(dú)立的Android模擬器實(shí)現(xiàn)方法
本文主要介紹如何制作獨(dú)立的Android模擬器,這里給大家提供詳細(xì)的制作流程,有需要的小伙伴可以參考下2016-08-08
Android WebView 常見(jiàn)問(wèn)題及處理方案
這篇文章主要介紹了Android WebView 常見(jiàn)問(wèn)題及處理方案,需要的朋友可以參考下2015-08-08

