Android 隱式啟動
關於顯示啟動不用多做介紹比較簡單,今天主要整理下隱式啟動注意的地方,方便以後自己查閱。
隱式啟動不需要指定包名和類名,隱式啟動的呼叫需要Intent能夠匹配目標元件的IntentFilter中的資訊。
1.首先在Application中配置
隱式啟動的資訊,主要有action,category和data,
如下圖所示:
<activity android:name=".yinshi.IntentTestActivity">
<intent-filter>
<action android:name ="com.action.1"/>
<action android:name="com.action.2"/>
<category android:name="com.cate.1"/>
<category android:name="com.cate.2"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" android:scheme="file" />
</intent-filter>
<intent-filter>
........
</intent-filter>
</activity>
可以看到,在一組intent-filter中有action,category和data三種類型的標籤,我們必須同時匹配action,category和data的資訊才能跳轉,action,category和data可以有多個,一個activity可以有多個intent-filter,我們只需要匹配一組intent-filter即可成功跳轉。
2.action,category和data匹配規則
action可以設定多組,但是隻要有一組匹配上即可(至少一組),如上面所示我們可以設定Intent的action為com.action.1或com.action.2都可以匹配成功。
如果只寫一條可以直接在Intent的建構函式寫:
Intent intent1=new Intent("com.action.1");
多條也可以繼續新增
intent1.setAction("com.action.2");
category不太一樣,我們可以不為intent設定category,但是intent-filter需要設定”android.intent.category.DEFAULT”這一條category,因為在系統呼叫startActivity或者startActivityForResult的時候會預設為Intent指定這一條category。
<category android:name="android.intent.category.DEFAULT"/>
為Intent新增category:
intent1.addCategory("com.cate.1");
data的匹配規則和action類似,如果規則中定義了data,那麼Intent中也必須進行設定。
data由兩部分組成mimeType和URI,mimeType指媒體型別,比如:image/png、music/mp3,你也可以隨便寫如 hehe/abc,但是非常不推薦,URI的結構如下:
Scheme: URI的模式,比如file、http等
Host:URI的主機名,比如www.baidu.com
Port:URI的埠號,比如80,一般在Host之後
Path:表示路徑資訊
用於指定可以處理的資料型別,允許使用萬用字元的方式進行指定。只有標籤中指定的內容和 Intent 中攜帶的 Data 完全一致時,當前活動才能夠響應該 Intent。不過一般在標籤中都不會指定過多的內容,常見的是mimeType和scheme。
如我們在過濾資訊中寫如下資訊
<data android:scheme="http" />
我們可以在Intent中可以這樣,即可匹配成功
intent1.setData(Uri.parse("http://abc"));
我們在過濾資訊中這樣寫
<data android:mimeType="text/pain" />
我們可以在Intent中可以這樣,也可匹配成功
intent1.setType("text/pain");
但是當我們在過濾資訊中這樣寫
<data android:mimeType="text/pain" android:scheme="http" />
如果在Intent中這樣,就會報錯
intent1.setData(Uri.parse("http://abc"));
intent1.setType("text/pain");
我們必須呼叫setDataAndType方法將兩個方法合起來才可以
intent1.setDataAndType(Uri.parse("http://abc"),"text/pain");
這是因為setData和setType會清除掉彼此的值,看原始碼就知道如下:(setType類似)
public Intent setData(Uri data) {
mData = data;
mType = null;
return this;
}
會把彼此置為null,這也是不少人掉坑的地方。
完整的例子如下
過濾資訊:
<activity android:name=".yinshi.IntentTestActivity">
<intent-filter>
<action android:name="com.action.1"/>
<action android:name="com.action.2"/>
<category android:name="com.cate.1"/>
<category android:name="com.cate.2"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/pain" android:scheme="http" />
</intent-filter>
</activity>
Intent 資訊如下:
Intent intent1=new Intent("com.action.1");
intent1.setAction("com.action.2");
intent1.addCategory("com.cate.1"); intent1.setDataAndType(Uri.parse("http://abc"),"text/pain");
startActivity(intent1);