天天看點

Intent簡介-Android開發

一.Intent介紹:

      Intent的中文意思是“意圖,意向”,在Android中提供了Intent機制來協助應用間的互動與通訊,Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的元件,将 Intent傳遞給調用的元件,并完成元件的調用。Intent不僅可用于應用程式之間,也可用于應用程式内部的Activity/Service之間的互動。是以,可以将Intent了解為不同元件之間通信的“媒介”專門提供元件互相調用的相關資訊。

二、Intent作用:

      Intent 是一個将要執行的動作的抽象的描述,一般來說是作為參數來使用,由Intent來協助完成android各個元件之間的通訊。比如說調用startActivity()來啟動一個activity,或者由broadcaseIntent()來傳遞給所有感興趣的BroadcaseReceiver, 再或者由startService()/bindservice()來啟動一個背景的service.是以可以看出來,intent主要是用來啟動其他的activity 或者service,是以可以将intent了解成activity之間的粘合劑。

三.Inten啟動元件的方法:

     Intent可以啟動一個Activity,也可以啟動一個Service,還可以發起一個廣播Broadcasts。具體方法如下:

元件名稱 方法名稱
Activity

startActvity( )

startActivity( )

Service

startService( )

bindService( )

Broadcasts

sendBroadcasts( )

sendOrderedBroadcasts( )

sendStickyBroadcasts( )

四.Intent的幾個重要屬性:

      動作(Action),資料(Data),分類(Category),類型(Type),元件(Compent)以及擴充信(Extra)。其中最常用的是Action屬性和Data屬性。

1.Action屬性:

        自定義的Activity:

1 <activity android:name=".TargetActivity">  
2     <intent-filter>            
3         <action android:name="com.scott.intent.action.TARGET"/>  
4         <category android:name="android.intent.category.DEFAULT"/>  
5     </intent-filter>  
6 </activity>        

       除了自定義的action之外,Intent也内含了很多預設的action,随便列舉幾個:

1 public static final String ACTION_MAIN = "android.intent.action.MAIN";  
2 public static final String ACTION_VIEW = "android.intent.action.VIEW";  
3 public static final String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";  
4 public static final String ACTION_CALL = "android.intent.action.CALL";      

2.data和extras,即執行動作要操作的資料和傳遞到目标的附加資訊

     在目标<data/>标簽中包含了以下幾種子元素,他們定義了url的比對規則:

android:scheme 比對url中的字首,除了“http”、“https”、“tel”...之外,我們可以定義自己的字首

android:host 比對url中的主機名部分,如“google.com”,如果定義為“*”則表示任意主機名

android:port 比對url中的端口

android:path 比對url中的路徑

這個時候如果隻指定action就不夠了,我們需要為其設定data值,此時,url中的每個部分和TargetActivity配置資訊中全部一緻才能跳轉成功,否則就被系統拒絕。

不過有時候對path限定死了也不太好,比如我們有這樣的url:(scott://com.scott.intent.data:7788/target/hello)(scott://com.scott.intent.data:7788/target/hi)

       這個時候該怎麼辦呢?我們需要使用另外一個元素:android:pathPrefix,表示路徑字首。

       我們把android:path="/target"修改為android:pathPrefix="/target",然後就可以滿足以上的要求了。

       而在進行搜尋時,我們使用了一個putExtra方法,将關鍵字做為參數放置在Intent中,我們成為extras(附加資訊),這裡面涉及到了一個Bundle對象。

       Bundle和Intent有着密不可分的關系,主要負責為Intent儲存附加參數資訊,它實作了android.os.Paracelable接口,内部維護一個Map類型的屬性,用于以鍵值對的形式存放附加參數資訊。

3.category,要執行動作的目标所具有的特質或行為歸類

    幾個常見的category如下:

常量 解釋
CATEGORY_DEFAULT 預設的category
CATEGORY_BROWSABLE 指定了此category後,在網頁上點選圖檔或連結時,系統會考慮将此目标Activity列入可選清單,供使用者選擇以打開圖檔或連結。
CATEGORY_GADGET The activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOME The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.
CATEGORY_LAUNCHER The activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCE 表示該目标Activity是一個首選項界面;

4.type:要執行動作的目标Activity所能處理的MIME資料類型

      例如:一個可以處理圖檔的目标Activity在其聲明中包含這樣的mimeType:

1 <data android:mimeType="image/*" />        

      在使用Intent進行比對時,我們可以使用setType(String type)或者setDataAndType(Uri data, String type)來設定mimeType。

5.component,目标元件的包或類名稱

      在使用component進行比對時,一般采用以下幾種形式:

1 intent.setComponent(new ComponentName(getApplicationContext(), TargetActivity.class));  
2 intent.setComponent(new ComponentName(getApplicationContext(), "com.scott.intent.TargetActivity"));  
3 intent.setComponent(new ComponentName("com.scott.other", "com.scott.other.TargetActivity"));       

     其中,前兩種是用于比對同一包内的目标,第三種是用于比對其他包内的目标。

    【注意】:如果我們在Intent中指定了component屬性,系統将不會再對action、data/type、category進行比對。

繼續閱讀