深入學習Android中的Intent
Intent提供了一種通用的消息系統(tǒng),它允許在你的應用程序見傳遞Intent來執(zhí)行動作和產(chǎn)生事件,使用Intent可以激活Android應用的三種類型的核心組件:活動Activity、服務Service、廣播接受者Broadcast。
Intent又分為隱士意圖和顯示意圖。
顯示意圖:調(diào)用intent.setComponent()、intent.setClassName()或者intent.setClass()方法明確的制定組件名的Intent為顯示意圖,顯示意圖明確的制定要激活哪一個組件。
隱士意圖:沒有明確的制定組件的名稱;下邊是一個隱士意圖的案例
首先應該在清單文件中添加相應的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){ /** * (沒設數(shù)據(jù)參數(shù)的情況下)只要Intent中的Action和Category都出現(xiàn)在Intent-Filter中,就能與之匹配,否則匹配失敗 */ Intent intent = new Intent();//隱式意圖激活Activity 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)). //也就是說如果設置了setData方法在設置setType方法的話,那么setType方法就會clers掉setData方法 //解決方案如下: intent.setDataAndType(Uri.parse("itcast://www.itcast.cn/liming"), "image/jpeg"); startActivity(intent);//方法內(nèi)部為Intent添加了android.intent.category.DEFAULT類別 }
如下是隱士意圖的匹配規(guī)則:
Intent Filter(意圖過濾器)其實就是用來匹配隱式Intent的,當一個意圖對象被一個意圖過濾器進行匹配測試時,只有三個方面會被參考到:動作、數(shù)據(jù)(URI以及數(shù)據(jù)類型)和類別。
動作測試(Action test)
一個意圖對象只能指定一個動作名稱,而一個過濾器可能列舉多個動作名稱。如果意圖對象或過濾器沒有指定任何動作,結果將如下:
- • 如果過濾器沒有指定任何動作,那么將阻塞所有的意圖,因此所有的意圖都會測試失敗。沒有意圖能夠通過這個過濾器。
- • 另一方面,只要過濾器包含至少一個動作,一個沒有指定動作的意圖對象自動通過這個測試
類別測試(Category test)
對于一個能夠通過類別匹配測試的意圖,意圖對象中的類別必須匹配過濾器中的類別。這個過濾器可以列舉另外的類別,但它不能遺漏在這個意圖中的任何類別。
原則上一個沒有類別的意圖對象應該總能夠通過匹配測試,而不管過濾器里有什么。大部分情況下這個是對的。但有一個例外,Android把所有傳給startActivity()的隱式意圖當作他們包含至少一個類別:”android.intent.category.DEFAULT” (CATEGORY_DEFAULT常量)。因此,想要接收隱式意圖的活動必須在它們的意圖過濾器中包含”android.intent.category.DEFAULT”。(帶”android.intent.action.MAIN”和”android.intent.category.LAUNCHER”設置的過濾器是例外)
數(shù)據(jù)測試(Data test)
當一個意圖對象中的URI被用來和一個過濾器中的URI比較時,比較的是URI的各個組成部分。例如,如果過濾器僅指定了一個scheme,所有該scheme的URIs都能夠和這個過濾器相匹配;如果過濾器指定了一個scheme、主機名但沒有路經(jīng)部分,所有具有相同scheme和主機名的URIs都可以和這個過濾器相匹配,而不管它們的路經(jīng);如果過濾器指定了一個scheme、主機名和路經(jīng),只有具有相同scheme、主機名和路經(jīng)的URIs才可以和這個過濾器相匹配。當然,一個過濾器中的路徑規(guī)格可以包含通配符,這樣只需要部分匹配即可。
數(shù)據(jù)測試同時比較意圖對象和過濾器中指定的URI和數(shù)據(jù)類型。
規(guī)則如下:
a. 一個既不包含URI也不包含數(shù)據(jù)類型的意圖對象僅在過濾器也同樣沒有指定任何URIs和數(shù)據(jù)類型的情況下才能通過測試。
b. 一個包含URI但沒有數(shù)據(jù)類型的意圖對象僅在它的URI和一個同樣沒有指定數(shù)據(jù)類型的過濾器里的URI匹配時才能通過測試。這通常發(fā)生在類似于mailto:和tel:這樣的URIs上:它們并不引用實際數(shù)據(jù)。
c. 一個包含數(shù)據(jù)類型但不包含URI的意圖對象僅在這個過濾器列舉了同樣的數(shù)據(jù)類型而且也沒有指定一個URI的情況下才能通過測試。
d. 一個同時包含URI和數(shù)據(jù)類型(或者可從URI推斷出數(shù)據(jù)類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。如果它的URI和這個過濾器中的一個URI相匹配或者它有一個內(nèi)容content:或者文件file: URI而且這個過濾器沒有指定一個URI,那么它也能通過測試。換句話說,一個組件被假定為支持content:和file: 數(shù)據(jù)如果它的過濾器僅列舉了一個數(shù)據(jù)類型。
以上就是針對Android中的Intent詳細介紹,特別適合初學者學習,希望對大家的學習有所幫助。
- Android開發(fā)筆記之Intent初級學習教程
- Android開發(fā)中Intent傳遞對象的方法分析
- Android中Intent傳遞對象的兩種方法Serializable,Parcelable
- Android中使用Intent在Activity之間傳遞對象(使用Serializable或者Parcelable)的方法
- Android編程使用Intent傳遞對象的方法分析
- Android使用Intent啟動其他非系統(tǒng)應用程序的方法
- 詳解Android中Intent對象與Intent Filter過濾匹配過程
- 詳解Android中Intent的使用方法
- Android中Intent習慣用法
- 詳解Android中IntentService的使用方法
- Android 廣播大全 Intent Action 事件詳解
- Android編程開發(fā)之打開文件的Intent及使用方法
- Android之Intent附加數(shù)據(jù)的兩種實現(xiàn)方法
- 從源碼剖析Android中的Intent組件
相關文章
android 微信 sdk api調(diào)用不成功解決方案
最近一直在調(diào)用微信的API,卻發(fā)現(xiàn)一直調(diào)用不成功,糾結了好久,各方面找教程,現(xiàn)在曬出來和大家分享一下2012-11-11Android開發(fā)之多媒體文件獲取工具類實例【音頻,視頻,圖片等】
這篇文章主要介紹了Android開發(fā)之多媒體文件獲取工具類,結合實例形式分析了Android獲取音頻,視頻及圖片等多媒體資源的相關操作技巧,需要的朋友可以參考下2017-10-10Android studio2.3.3升級到3.1.2坑(小記)
這篇文章主要介紹了Android studio2.3.3升級3.1.2坑(小記),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析
這篇文章主要為大家介紹了ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03vscode通過wifi調(diào)試真機的Flutter應用的教程
這篇文章主要介紹了vscode通過wifi調(diào)試真機的Flutter應用的教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04Android編程基于重力傳感器實現(xiàn)橫豎屏放向切換功能
這篇文章主要介紹了Android編程基于重力傳感器實現(xiàn)橫豎屏放向切換功能,結合具體實例形式分析了Android基于重力傳感器實現(xiàn)橫豎屏切換的相關操作技巧,需要的朋友可以參考下2018-01-01