#### Activity調用方式
* 顯示調用: 明確指定被啟動對象的組件信息,包括包名和類名
* 隱式調用: 不需要明確指定組件信息,需要Intent能夠匹配目標組件中的IntentFilter中所設置的過濾信息。
二者共存,以顯示調用為主。顯示調用很簡單,這里簡述一下隱式調用,隱式調用
需要intent能夠匹配目標組件的IntentFilter 中所設置的過濾信息, 如果不匹配將無法啟動目標Activity。IntentFilter中的過濾信息有action、category、data。
關于intent和IntentFilter的詳細描述,可參考這里[意圖(Intent)](http://www.hmoore.net/alex_wsc/android/432707)
#### 匹配規則
IntentFilter中的過濾信息有action、category、data。
只有一個Intent同時匹配action類別、category類別、data類別才能成功啟動目標Activity。
一個Activity可以有多個intent-filter,一個Intent只要能匹配任何一組intent-filter即可成功啟動對應的Activity。
1. **action**
action是一個字符串,匹配是指與action的字符串完全一樣,區分大小寫,大小寫不同字符串相同的action會匹配失敗。
一個intent-filter可以有多個aciton,只要Intent中的action能夠和任何一個action相同即可成功匹配。
Intent中如果沒有指定action,那么匹配失敗。
action的匹配要求Intent中的action存在且必須和過濾規則中的其中一個action相同
2. **category**
category是一個字符串。
Intent可以沒有category,但是如果你一旦有category,不管有幾個,每個都必須與intent-filter中的其中一個category相同。
系統在 startActivity 和 startActivityForResult 的時候,會默認為Intent加上 android.intent.category.DEFAULT 這個category,所以為了我們的activity能夠接收隱式調用,就必須在intent-filter中加上 android.intent.category.DEFAULT 這個category。
3. data
data的匹配規則與action一樣,如果intent-filter中定義了data,那么Intent中必須要定義可匹配的data。
intent-filter中data的語法:
```
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string"/>
```
Intent中的data有兩部分組成:mimeType和URI。mimeType是指媒體類型,比如
image/jpeg、audio/mpeg4-generic和video/等,可以表示圖片、文本、視頻等不同的媒
體格式。
URI的結構:
`<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]`
示例:
```
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
```
**scheme**:URI的模式,比如http、file、content等,默認值是 file 。
**host**:URI的主機名
**port**:URI的端口號
**path、pathPattern和pathPrefix**:這三個參數描述路徑信息。
path、pathPattern可以表示完整的路徑信息,其中pathPattern可以包含通配符 * ,表示0個或者多個任意字符。
pathPrefix只表示路徑的前綴信息。
過濾規則的uri為空時,有默認值content和file,因此intent設置uri的scheme部分必須為content或file。
Intent指定data時,必須調用 setDataAndType 方法, setData 和 setType 會清除另一方的值。
對于service和BroadcastReceiver也是同樣的匹配規則,不過對于service最好使用顯式調用。
**隱式調用需注意**
* 當通過隱式調用啟動Activity時,沒找到對應的Activity系統就會拋出 android.content.ActivityNotFoundException 異常,所以需要判斷是否有Activity能夠匹配我們的隱式Intent。
* 判斷方法有2種
* 采用 PackageManager 的 resloveActivity 方法或Intent 的 resloveActivity 方法
,如果它們找不到匹配的Activity就會返回null,通過判斷返回值可以避免上述錯誤
* PackageManager還提供了queryIntentActivityies方法,來返回所有成功匹配的Activity信息
```
public abstract List<ResolveInfo> queryIntentActivityies(Intent intent,int flags);
public abstract ResolveInfo resloveActivity(Intent intent,int flags);
```
以上的第二個參數使用 MATCH_DEFAULT_ONLY ,這個標志位的含義是僅僅匹配那些在
intent-filter中聲明了 android.intent.category.DEFAULT 這個category的Activity。如果不用這個標記位,就會把不含這個category的Activity匹配出來了,從而導致startActivity失敗,因為不含DEFAULT這個category的Activity是無法接受隱式Intent的。
* 下面的action和category比較重要,它們用來表明這是一個入口Activity,并且會出現在系統的應用列表中,二者缺一不可。
```
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
```
- 前言
- 第一章Activity的生命周期和啟動模式
- 1.1 Activity生命周期全面分析
- 1.2 Activity的啟動模式
- 1.3 IntentFilter的匹配規則
- 第二章IPC
- 轉 chapter IPC
- 轉IPC1
- 轉IPC2
- Binder講解
- binder
- Messenger
- 一、Android IPC簡介
- 二、Android中的多進程模式
- 三、IPC基礎概念介紹
- 四、Android中的IPC方式
- 五、Binder連接池
- 第三章
- 第九章四大組件的工作過程
- 第十章
- 第13章 綜合技術
- 使用CrashHandler 來獲取應用的crash 信息
- 使用Multidex來解決方法數越界
- Android的動態加載技術