我們知道,實現android的Activity之間相互跳轉需要用到Intent,
Intent又分為顯式Intent和隱式Intent,
顯式Intent很簡單,比如我在FirstActivity中想跳轉到SecondActivity,只需要直接聲明就行了:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
而在使用隱式Intent實現Activity之間跳轉的時候,並沒有明確指定要打開哪個activity,
而是通過指定3個參數:action,category,data,
然后讓系統去尋找能夠匹配得上這三個參數的Acativity,如果有多個符合條件的Activity,就會讓用戶選擇其中一個打開。
例如我選擇手機相冊中的一張照片,點擊“發送”按鈕:
然后就可以讓我選擇是發送給QQ好友,微信好友還是發送到朋友圈。這實際上就是一個隱式Intent啟動Activity的實例。
而決定一個Activity能夠響應哪些Intent,就需要在AndroidManifest.xml的<activity>標簽下配置<intent-filter>的內容,可以指定當前活動能夠響應的action,category和data,比如說我在SecondActivity下設置如下代碼:
<activity
android:name=".SecondActivity" android:label="@string/title_activity_second" android:theme="@style/AppTheme.NoActionBar" >
<intent-filter>
<action android:name="android.intent.action.MYACTION" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MYCATEGORY" />
</intent-filter>
</activity>
再在MainActivity中通過隱式Intent:
Intent intent=new Intent("android.intent.action.MYACTION"); startActivity(intent);
然后就啟動了SecondActivity。
在這里,看似我們在Intent中只指定了要打開的活動只需要響應一個Action為“android.intent.action.MYACTION”就行,但是實際上,系統在使用隱式Intent的時候,會自動幫我們添加上“android.intent.category.default”,所以——實際上所有需要被隱式Intent啟動的activity,都要加上<category android:name="android.intent.category.DEFAULT" />這一段聲明,否則就會啟動不了並提示無法匹配該Intent的錯誤:
如果你要隱式啟動的那個活動是程序最先啟動的那個activity,
即聲明了<category android:name="android.intent.category.LAUNCHER" />,
就可以不用寫<category android:name="android.intent.category.DEFAULT" />的聲明了,
(在這里LAUNCHER,就是你打開程序,最先啟動的那一個Activity。)另外,LAUNCHER一定要配合action MAIN一起使用,否則不會啟動,即:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>