Android中啟動Activity的兩種方式分析

Android中啟動Activity的兩種方式分析。Android中Activity的啟動方式有兩種,分為顯式調用和隱式調用。而這兩種方式卻存在很大的區別,下面將介紹他們是如何啟動和他們之間的區別在哪。

首先是顯調用,其實顯式調用很簡單,而且也是日常開發中使用得最多的。兩行代碼的事,哈哈;

btn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 Intent intent = new Intent(MainActivity.this,SecondActivity.class);
 startActivity(intent);
 }
});

這樣就成功地啟動瞭SecondActivity;是不是很簡單,不說瞭,哈哈,這不是本文的重點,那我們就來看看顯式調用和他有何不同

想要通過隱式調用的方式啟動Activity,那麼Intent必須能夠匹配目標Activity的IntentFilter中的過濾信息,如果不匹配將無法啟動目標組件,而IntentFilter中的過濾信息包括action、category和data。我們先來看個例子:

首先SecondActivity在manifests中的配置如下

<activity android:name=".SecondActivity">
 <intent-filter>
 <action android:name="secendActivity"/>
 <category android:name="android.intent.category.DEFAULT"/>
 <category android:name="sd"/>
 <!--intent-filter>
 <!--activity>

然後MainActivity中跳轉到SecondActivity中的代碼如下:

btn.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View view) {
 Intent intent = new Intent();
 intent.setAction("secendActivity");
 intent.addCategory("sd");
 startActivity(intent);
 }
});

上面的示例就通過隱式調用的方式從MainActivity啟動瞭SecondActivity,那麼他是怎麼匹配IntentFilter中的信息的呢?

接下來我們看看他的匹配規則,首先是action ,action是一個字符串,action的匹配規則是這樣的;Intent中的匹配信息必須和過濾規則中的action匹配,就是字符串的值完全相同,當IntentFilter中有多條匹配規則時,Intent中的匹配信息可以是一條也可以是多條,也就是說隻要Intent中的匹配信息有一條和IntentFilter中的匹配規則相同,那麼就可以匹配成功。當然,系統中為action默認指定瞭很多的action,我們也可以根據自己的需求自己定義;

 Category的匹配規則:category的匹配規則和action不同,他要求Intent如果Intent中出現category,那麼category中的匹配信息必須是IntentFilter規則中所定義的;
當然,不管是一條還是多條都可匹配成功。還有一點需要註意的是;當我們使用隱式調用的方式調用startActivityZ()和startActivityForResult()時,系統會默認給Intent加
android.intent.category.DEFAULT這個category,也就是是當我們通過隱式調用方式啟動Activity時必須在目標組件的IntentFilter規則中加上這條;
 Data的匹配規則和action類似,隻是data的寫法稍微復雜,data由兩部分主組成,mimeType和Uri; mimeType指媒體類型,Uri的格式包括Scheme:Uri的模式,如果不定義
Scheme,那麼這個Uri的參數將全部無效。另外還有Host:Uri的主機名;Port:Uri的端口號,Path:Uri的路徑信息;需要註意的是:如果Intent指定完整的data,必須調用
setDateAndType方法,因為不能調用setData後再調用setType,因為這兩個方法會彼此清空對方的值;

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *