一、要弄清楚這個問題,首先須要弄明白什麼是implicit(隱藏) intent什麼是explicit(明確) intent。html
Explicit Intent明確的指定了要啓動的Acitivity ,好比如下Java代碼:java
[java] view plaincopyprint?android
Intent intent= new Intent(this, B.class); app
Implicit Intent沒有明確的指定要啓動哪一個Activity ,而是經過設置一些Intent Filter來讓系統去篩選合適的Acitivity去啓動。函數
二、intent到底發給哪一個activity,須要進行三個匹配,一個是action,一個是category,一個是data。測試
理論上來講,若是intent不指定category,那麼不管intent filter的內容是什麼都應該是匹配的。可是,若是是implicit intent,android默認給加上一個CATEGORY_DEFAULT,這樣的話若是intent filter中沒有android.intent.category.DEFAULT這個category的話,匹配測試就會失敗。因此,若是你的 activity支持接收implicit intent的話就必定要在intent filter中加入android.intent.category.DEFAULT。this
例外狀況是:spa
[java] view plaincopyprint?.net
<intent-filter> orm
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
中沒有必要加入android.intent.category.DEFAULT,固然加入也沒有問題。這個是應用啓動默認的第一個啓動的activity(每一個應用有那麼多activity,總得有一個是第一個啓動的吧)
若是本身定義的某個Activity要經過隱式啓動,在AndroidManifast.xm那麼必須加上android.intent.category.DEFAULT,不然不起做用
除此以外,category的用途還有不少
好比作個桌面,按home鍵時啓動本身作的應用
[html] view plaincopyprint?
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
<category android:name="android.intent.category.HOME" />
</intent-filter>
</activity>
在intent中是如何配置那三個匹配數據的呢,也簡單一說
也就是說,在不直接指定要跳轉的Activity的時候,爲Intent提供一些相關的參數,讓其自動去和AndroidManifest.xml中已有的Activity去匹配
IntentFilter在xml中的三個主要的參數:action,categary,data。
咱們經過Intent的構造函數或者Intent提供的方法能夠指定這個三個參數:
[java] view plaincopyprint?
intent.setAction(action);
intent.setData(data);
intent.addCategory(category);