startActivity()的方式有显示和隐式方式,今天记录一下隐式启动。
一:代码案例:
被启动端Activity中:
AndroidManifest.xml
<activity
android:name=".ui.activity.ActionActivity"
>
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="dh.android.action.TEST_ACTIVITY"/>
<category android:name="dh.android.intent.category_TEST"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>
其中<category android:name="android.intent.category.DEFAULT"/>这个过滤器是固定必须添加的,系统要求。其余可自定义,原因是因素启动Activity时系统回默认为intent添加 addCategory("android.intent.category.DEFAULT"),虽然写程序时未手动写intnet.addCategory("android.intent.category.DEFAULT"); 但运行时系统会为其默认添加上,如果被启动方Activity注册时不添加<category android:name="android.intent.category.DEFAULT"/>程序会crash。
启动端Activity:
Intent intent = new Intent();
intent.setAction("dh.android.action.TEST_ACTIVITY");
intent.addCategory("dh.android.intent.category_TEST");
intent.addCategory("android.intent.category.BROWSABLE");
startActivity(intent);
二:匹配规则:
1.Action的匹配规则,Intent中必现携带有Action,intente中携带几个action,被启动的Activity注册时就要添加几个action.
2.Category的匹配规则,Intent中可以有携带category,也可以没有携带category,由于系统会默认为隐式Intent携带上android.intent.category.DEFAULT,所以注册端至少要添加这个category。
该方式即可用在同一程序之间,也可用在不同程序之间,即可跨进程启动,跨进程启动场景有个有趣的特点,任务栈中只有一个进程,即当前获取焦点的Activity,如果当前Activity销毁,任务栈中会加载启动方的进程,使启动方的Activity获取焦点。