Android概念篇(四)Intent

Intent 在Android中,不只是扮演著地址而已
而是實際上的"意圖"
因為它除了常被用來導向Activity外
還可以啟動Service、送出廣播、"發出要求"

Activity、Service、Boadcast
1.
在activity中,intent會帶有context + 下一個目的地activity
而進一步透過startActivity( )、startActivityForResult( )方法
啟動到達新的activity
當需要夾帶資料時,透過bundle來傳遞
而參考概念篇(二)Activity中的activity stack描述
我們可以在intent上加入flag,設定activity的開啟模式

-FLAG_ACTIVITY_NEW_TASK
-FLAG_ACTIVITY_SINGLE_TOP
-FLAG_ACTIVITY_CLEAR_TOP

2.
同樣道理,可以透過startService( )、bindService( )
來啟動service
只要告訴intent ,你要啟動的service是什麼
利用context透過方法就能啟動
同理,透過sendBroadcast( )、sendOrderdBroadcast( )、sendStickyBroadCast( )
可用來發出廣播


Implicit Intent
隱含的Intent,就是對整個Android系統
發出一種請求意圖,例如開網頁、開影片、打電話....
當系統拿到此Intent請求的"行為"跟"屬性"、"資料型態"時
會進行過濾跟匹配,叫出相關App中的Activity來處理
而我們要在哪裡設定Activity的匹配條件呢?
就在manifest檔案中
每當宣告一個activity時
可以加上intent-filter(這個filter就是用來過濾intent的)
例如:

<intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LUNCHER"/>
</intent-filter>

以上這段你一定看過,因為它就是每個APP中main activity
所預設的,意思是main activity是第一個載入的活動
並且要在桌面顯示
而我們當然可以在一個activity中
設定多個action跟category的過濾條件

1.Action
Action就是行為的過濾
我們可以設定Intent中的Action Type
而有設定要過濾這個Action Type的activity
就會呼應啟動
常見的Action Type有:

Intent.ACTION_VIEW
Intent.ACTION_DIAL
Intent.ACTION_SENDTO
Intent.ACTION_SEND
Intent.ACTION_WEB_SEARCH

限制是,intent-filter中一定要有一個action條件
而只要activity中有一條action符合
就能回應該intent

2.Category
類似Action的匹配模式
但限制是要全部條件都符合
才能回應該intent

3.Data
在intent-filter中
可以設定資料型態
代表我們這個activity,可以處理該資料(文件、圖片、影片...)
使用上與action跟category相似,如(取自官方範例):

<activity android:name="ShareActivity">
    <intent-filter>
        <action android:name="android.intent.action.SEND"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="text/plain"/>
    </intent-filter>
</activity>

名叫"ShareActivity",可以處理別人SEND型態的Action下
且格式是文件的檔案
限制是,intent-filter中不一定要有
而只要有一條匹配符合,就能回應該intent


小結
intent可以做的事遠比想像中多
除了能主動要求開啟activity、service、broadcast外
更能請系統去找到相關App來回應自己
所以這就手機操作上,時常出現的"請選擇開啟方式"
然後跳出相關、對應的App應用程式
了解intent後,更對手機的系統運作
有更深一層的認識囉

最後附上官方說明
跟民間高手整理的intent開啟用法