Android學(xué)習(xí)之Intent中顯示意圖和隱式意圖的用法實(shí)例分析
本文實(shí)例講述了Android學(xué)習(xí)之Intent中顯示意圖和隱式意圖的用法。分享給大家供大家參考,具體如下:
Intent(意圖)主要是解決Android應(yīng)用的各項(xiàng)組件之間的通訊。
Intent負(fù)責(zé)對應(yīng)用中一次操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對應(yīng)的組件,將 Intent傳遞給調(diào)用的組件,并完成組件的調(diào)用。
因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。
例如,在一個聯(lián)系人維護(hù)的應(yīng)用中,當(dāng)我們在一個聯(lián)系人列表屏幕(假設(shè)對應(yīng)的Activity為listActivity)上,點(diǎn)擊某個聯(lián)系人后,希望能夠跳出此聯(lián)系人的詳細(xì)信息屏幕(假設(shè)對應(yīng)的Activity為detailActivity)
為了實(shí)現(xiàn)這個目的,listActivity需要構(gòu)造一個 Intent,這個Intent用于告訴系統(tǒng),我們要做“查看”動作,此動作對應(yīng)的查看對象是“某聯(lián)系人”,然后調(diào)用startActivity (Intent intent),將構(gòu)造的Intent傳入,系統(tǒng)會根據(jù)此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系統(tǒng)會調(diào)用找到的 Activity,即為detailActivity,最終傳入Intent,detailActivity則會根據(jù)此Intent中的描述,執(zhí)行相應(yīng)的操作。
對于intent主要的分類主要包括隱式意圖和顯式意圖。顯式意圖通常主要是啟動本應(yīng)用中的Activity之間的數(shù)據(jù),而隱式意圖則常見于啟動系統(tǒng)中的某些特定的動作,比如打電話,或者是跨應(yīng)用的Activity啟動。
通常來說:
顯式意圖:調(diào)用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應(yīng)該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent為隱式意圖。 Android系統(tǒng)會根據(jù)隱式意圖中設(shè)置的動作(action)、類別(category)、數(shù)據(jù)(URI和數(shù)據(jù)類型)找到最合適的組件來處理這個意圖。
顯示意圖非常常用也非常簡單一般用于應(yīng)用程序內(nèi)之間Activity的相互調(diào)用轉(zhuǎn)換,就不多說了,這里我介紹一下隱式意圖:
簡單概括就是: 意圖包括:Action(動作),Category(附加信息),Data(數(shù)據(jù),具體內(nèi)容),Tpye(類型)等等,舉個例子,說白了意圖就是啟動一個組件的的完整的動作信息,就像打人,打就是Action動作,人就是Data內(nèi)容,而Type就是類型,打什么人呢?打壞人,type就是壞指的類型,只有這些信息全了才能執(zhí)行一個完整的意圖,當(dāng)然還有一些信息,比如scheme就是URI類型的數(shù)據(jù)的前綴,就像這個例子當(dāng)中的sms:,還有host主機(jī)名,path路徑等。
這里我給大家舉一個調(diào)用系統(tǒng)短信的例子,使用隱式意圖啟動系統(tǒng)短信,并給10086發(fā)送信息的例子。代碼如下:
/** * 隱式意圖的方法啟動系統(tǒng)短信 * * 簡單概括就是: 意圖包括:Action(動作),Category(附加信息),Data(數(shù)據(jù),具體內(nèi)容),Tpye(類型)等等,舉個例子, * 說白了意圖就是啟動一個組件的的完整的動作信息 * ,就像打人,打就是Action動作,人就是Data內(nèi)容,而Type就是類型,打什么人呢?打壞人,type就是壞指的類型 * ,只有這些信息全了才能執(zhí)行一個完整的意圖 * ,當(dāng)然還有一些信息,比如scheme就是URI類型的數(shù)據(jù)的前綴,就像這個例子當(dāng)中的sms:,還有host主機(jī)名,path路徑等 * * @param view */ public void startOne(View view) { Intent intent = new Intent(); intent.setAction("android.intent.action.SENDTO");// 發(fā)送信息的動作 intent.addCategory("android.intent.category.DEFAULT");// 附加信息 intent.setData(Uri.parse("sms:10086"));// 具體的數(shù)據(jù),發(fā)送給10086 startActivity(intent); }
上邊的這個例子是調(diào)用系統(tǒng)的東西,下邊我們來看看自定義的隱式意圖是怎么調(diào)用的。
首先是先在清單文件中進(jìn)行注冊,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="net.loonggg.intent" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="net.loonggg.intent.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="net.loonggg.intent.SecondActivity" > <intent-filter> <!-- 自定義的動作 --> <action android:name="net.loonggg.xxx" /> <!-- 自定義的scheme和host --> <data android:host="www.baidu.com" android:path="/person" android:scheme="loonggg" /> <!-- 自定義的類型 --> <data android:mimeType="person/people" /> <!-- 附加信息 --> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest>
第二個Activity里的東西就是我們自定義設(shè)置的,就是下邊的這段代碼:
<activity android:name="net.loonggg.intent.SecondActivity" > <intent-filter> <!-- 自定義的動作 --> <action android:name="net.loonggg.xxx" /> <!-- 自定義的scheme和host --> <data android:host="www.baidu.com" android:path="/person" android:scheme="loonggg" /> <!-- 自定義的類型 --> <data android:mimeType="person/people" /> <!-- 附加信息 --> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
那在代碼中怎么調(diào)用自定義的呢?其實(shí)跟調(diào)用系統(tǒng)短信一樣,只不過調(diào)用系統(tǒng)短信里的那些動作和數(shù)據(jù),系統(tǒng)已經(jīng)給我們配置好了,我們直接用就行,而自定義的就是我們自己寫的,調(diào)用方法和系統(tǒng)其實(shí)是一樣的。方法如下:
/** * 通過自定義的隱式意圖啟動 * * @param view */ public void startTwo(View view) { Intent intent = new Intent(); intent.setAction("net.loonggg.xxx"); intent.addCategory("android.intent.category.DEFAULT"); intent.setDataAndType(Uri.parse("loonggg://www.baidu.com/person"), "person/people"); startActivity(intent); }
特別注意的一點(diǎn)是:intent.setData(data)和intent.setType(type)注意這兩個方法會互相清除,意思就是:如果先設(shè)置setData(data)后設(shè)置setType(type),那么后設(shè)置的setType(type)會把前面setData(data)設(shè)置的內(nèi)容清除掉,而且會報(bào)錯,反之一樣,所以如果既要設(shè)置類型與數(shù)據(jù),那么使用setDataAndType(data,type)這個方法。
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android 圖片添加水印的實(shí)現(xiàn)方法
這篇文章主要介紹了Android 圖片添加水印的實(shí)現(xiàn)方法的相關(guān)資料,添加水印的原理就是在畫布Canvas上繪制圖形、圖片、文字等等, 得到你想要的效果圖片,需要的朋友可以參考下2017-07-07如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能
這篇文章主要介紹了如何用HMS Nearby Service給自己的App添加近距離數(shù)據(jù)傳輸功能,本文通過圖文示例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Flutter輸入框TextField屬性及監(jiān)聽事件介紹
這篇文章主要介紹了Flutter輸入框TextField屬性及監(jiān)聽事件介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-11-11Android Studio使用Kotlin時(shí),修改代碼后運(yùn)行不生效的解決方法
這篇文章主要介紹了Android Studio使用Kotlin時(shí),修改代碼后運(yùn)行不生效的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android使用自定義ImageView實(shí)現(xiàn)圓形圖片效果
本篇文章主要介紹了Android使用自定義ImageView實(shí)現(xiàn)圓形圖片效果,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05android?studio?項(xiàng)目?:UI設(shè)計(jì)高精度實(shí)現(xiàn)簡單計(jì)算器
這篇文章主要介紹了android?studio?項(xiàng)目?:UI設(shè)計(jì)高精度實(shí)現(xiàn)簡單計(jì)算器,自主完成一個簡單APP的設(shè)計(jì)工作,綜合應(yīng)用已經(jīng)學(xué)到的Android?UI設(shè)計(jì)技巧,下面來看看實(shí)驗(yàn)實(shí)現(xiàn)過程2021-12-12Android openGl 繪制簡單圖形的實(shí)現(xiàn)示例
這篇文章主要介紹了Android openGl 繪制簡單圖形的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03