LaunchMode
- standard
标准模式,默认模式
每次启动一个Activity都会新建一个实例,不管新建的是否是其自身,需要保证,驱动的Context不是ApplicationContext等 - singleTop
栈顶复用模式
如果新的Activity已经位于栈顶,那么这个Activity不会呗创建,同时他的onNewIntent方法会被回调,而不会调用onCreate、onStart。 - singleTask
栈内复用模式
栈内单例,只要Activity在一个栈内存在,那么这个Activity不会被重建,同时他的onNewIntent会被调用。
singleTask模式的Activity不管是位于栈顶还是栈底,再次运行这个Activity时,都会destory掉它上面的Activity来保证整个栈中只有一个自己
,切记切记”这点是毋庸置疑的。 - singleInstance
单实例模式
单独的存在于一个栈中。
TaskAffinity(任务相关性)。这个参数标志了一个应用所需要的任务栈的名字。一般情况下为应用的包名。我们也可以单独指定TaskAffinity属性,主要和singleTask和allowTastReparenting属性配对使用,在其他情况下没有意义。另外分为前台任务栈和后台任务栈,可以切换。
如何给Activity指定启动模式呢
- 在androidMeinifest中配置launchmod
- 或者通过intent中设置标志位来为Acitivty来指定启动模式。
比如:
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
第二种的方式的优先级高于第一种,同时存在时,以第二种为主。
第一种不可以直接设定FLAG_ACTIVITY_CLEAR_TOP;
第二种无法为Activity指定singleInstance模式;
Activity的Flags
大部分情况下不要提要手动设置标记位
- FLAG_ACTIVITY_NEW_TASK:指定singleTask’
- FLAG_ACTIVITY_SINGELE_TOP
- FLAG_ACTIVITY_CLEAR_TOP:在同一个任务栈中 位于它上面的包括它本省都会被出栈,和singleTask 一起出现的时候,不包括它本身
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENETS:这个标记使得这个Activity不会出现在历史列表中
IntentFilter的匹配规则
启动Activity分为隐式和显式。原则一个Intent不能及时显式又是隐式,冲突时候显式为主。
隐式的调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配是无法启动目标的。
一个Activity中可以有多了intent-filter,但是匹配的只要有一组就可以启动
匹配规则
Intent intent = new Intent("com.example.ACTION_START");
//再添加一个category
intent.addCategory("com.example.activitytest.MY_CATEGORY");
intent.setDataAndType(Uri.parse("file//abc"),"image/png");
<activity
android:name=".SecondActivity">
<intent-filter >
<action android:name="com.example.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
action的匹配规则
Intent中至少有一个,和规则中的一个匹配,区分大小写
category的匹配规则
Intent中的所有category都和规则中的一个匹配,如果没有category依然可以匹配规则,但是在规则中要加上 <category android:name="android.intent.category.DEFAULT"/>
data的匹配规则
类似与action data由两部分mimeType和URI
匹配欠要用下面检查一下:不能则返回null
public abstract List queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent , int flags);
第二个参数用MATCH_DEFAULT_ONLY,作用是,只匹配声明了<category android:name="android.intent.category.DEFAULT"/>
的activity。