Intent(顯式意圖,隱式意圖)

Intent(意圖)主要是解決Android應用的各項組件之間的通訊。
Intent負責對應用中一次操作的動作、動作涉及數據、附加數據進行描述,Android則根據此Intent的描述,負責找到對應的組件,將 Intent傳遞給調用的組件,並完成組件的調用。
因此,Intent在這裏起着一個媒體中介的作用,專門提供組件互相調用的相關信息,實現調用者與被調用者之間的解耦。
例如,在一個聯繫人維護的應用中,當我們在一個聯繫人列表屏幕(假設對應的Activity爲listActivity)上,點擊某個聯繫人後,希望能夠跳出此聯繫人的詳細信息屏幕(假設對應的Activity爲detailActivity)
爲了實現這個目的,listActivity需要構造一個 Intent,這個Intent用於告訴系統,我們要做“查看”動作,此動作對應的查看對象是“某聯繫人”,然後調用startActivity (Intent intent),將構造的Intent傳入,系統會根據此Intent中的描述,到ManiFest中找到滿足此Intent要求的Activity,系統會調用找到的 Activity,即爲detailActivity,最終傳入Intent,detailActivity則會根據此Intent中的描述,執行相應的操作。
對於intent主要的分類主要包括隱式意圖和顯式意圖。顯式意圖通常主要是啓動本應用中的Activity之間的數據,而隱式意圖則常見於啓動系統中的某些特定的動作,比如打電話,或者是跨應用的Activity啓動。
通常來說:
顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent爲顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent爲隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。
顯示意圖非常常用也非常簡單一般用於應用程序內之間Activity的相互調用轉換,就不多說了,這裏我介紹一下隱式意圖:
簡單概括就是: 意圖包括:Action(動作),Category(附加信息),Data(數據,具體內容),Tpye(類型)等等,舉個例子,說白了意圖就是啓動一個組件的的完整的動作信息,就像打人,打就是Action動作,人就是Data內容,而Type就是類型,打什麼人呢?打壞人,type就是壞指的類型,只有這些信息全了才能執行一個完整的意圖,當然還有一些信息,比如scheme就是URI類型的數據的前綴,就像這個例子當中的sms:,還有host主機名,path路徑等。
這裏我給大家舉一個調用系統短信的例子,使用隱式意圖啓動系統短信,並給10086發送信息的例子。代碼如下:

[java] view plain copy
  1. /** 
  2.      * 隱式意圖的方法啓動系統短信 
  3.      *  
  4.      * 簡單概括就是: 意圖包括:Action(動作),Category(附加信息),Data(數據,具體內容),Tpye(類型)等等,舉個例子, 
  5.      * 說白了意圖就是啓動一個組件的的完整的動作信息 
  6.      * ,就像打人,打就是Action動作,人就是Data內容,而Type就是類型,打什麼人呢?打壞人,type就是壞指的類型 
  7.      * ,只有這些信息全了才能執行一個完整的意圖 
  8.      * ,當然還有一些信息,比如scheme就是URI類型的數據的前綴,就像這個例子當中的sms:,還有host主機名,path路徑等 
  9.      *  
  10.      * @param view 
  11.      */  
  12.     public void startOne(View view) {  
  13.         Intent intent = new Intent();  
  14.         intent.setAction("android.intent.action.SENDTO");// 發送信息的動作  
  15.         intent.addCategory("android.intent.category.DEFAULT");// 附加信息  
  16.         intent.setData(Uri.parse("sms:10086"));// 具體的數據,發送給10086  
  17.         startActivity(intent);  
  18.     }  
上邊的這個例子是調用系統的東西,下邊我們來看看自定義的隱式意圖是怎麼調用的。
首先是先在清單文件中進行註冊,代碼如下:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="net.loonggg.intent"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="17" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name="net.loonggg.intent.MainActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.         <activity android:name="net.loonggg.intent.SecondActivity" >  
  26.             <intent-filter>  
  27.   
  28.                 <!-- 自定義的動作 -->  
  29.                 <action android:name="net.loonggg.xxx" />  
  30.                 <!-- 自定義的scheme和host -->  
  31.                 <data  
  32.                     android:host="www.baidu.com"  
  33.                     android:path="/person"  
  34.                     android:scheme="loonggg" />  
  35.                 <!-- 自定義的類型 -->  
  36.                 <data android:mimeType="person/people" />  
  37.                 <!-- 附加信息 -->  
  38.                 <category android:name="android.intent.category.DEFAULT" />  
  39.             </intent-filter>  
  40.         </activity>  
  41.     </application>  
  42.   
  43. </manifest>  
第二個Activity裏的東西就是我們自定義設置的,就是下邊的這段代碼:

[html] view plain copy
  1. <activity android:name="net.loonggg.intent.SecondActivity" >  
  2.            <intent-filter>  
  3.   
  4.                <!-- 自定義的動作 -->  
  5.                <action android:name="net.loonggg.xxx" />  
  6.                <!-- 自定義的scheme和host -->  
  7.                <data  
  8.                    android:host="www.baidu.com"  
  9.                    android:path="/person"  
  10.                    android:scheme="loonggg" />  
  11.                <!-- 自定義的類型 -->  
  12.                <data android:mimeType="person/people" />  
  13.                <!-- 附加信息 -->  
  14.                <category android:name="android.intent.category.DEFAULT" />  
  15.            </intent-filter>  
  16.        </activity>  

那在代碼中怎麼調用自定義的呢?其實跟調用系統短信一樣,只不過調用系統短信裏的那些動作和數據,系統已經給我們配置好了,我們直接用就行,而自定義的就是我們自己寫的,調用方法和系統其實是一樣的。方法如下:

[java] view plain copy
  1. /** 
  2.      * 通過自定義的隱式意圖啓動 
  3.      *  
  4.      * @param view 
  5.      */  
  6.     public void startTwo(View view) {  
  7.         Intent intent = new Intent();  
  8.         intent.setAction("net.loonggg.xxx");  
  9.         intent.addCategory("android.intent.category.DEFAULT");  
  10.         intent.setDataAndType(Uri.parse("loonggg://www.baidu.com/person"),  
  11.                 "person/people");  
  12.         startActivity(intent);  
  13.     }  
特別注意的一點是:intent.setData(data)和intent.setType(type)注意這兩個方法會互相清除,意思就是:如果先設置setData(data)後設置setType(type),那麼後設置的setType(type)會把前面setData(data)設置的內容清除掉,而且會報錯,反之一樣,所以如果既要設置類型與數據,那麼使用setDataAndType(data,type)這個方法。
轉載註明出處:http://blog.csdn.net/loongggdroid/article/details/17887975
版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章