1. 程式人生 > >Android 隱式啟動

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);

好了,就這樣!