四种模式
1.Standard
默认的启动模式,设置该模式的Activity每次被启动都会重复创建该Activity的实例。
应用于大部分场景。
2.SingleTop
栈顶复用模式,设置为该模式的Activity 如果位于任务栈的栈顶则直接调用此Activity 的OnNewIntent方法,如果不位于栈顶则会重新创建该Activity的实例。
应用场景:点击通知栏的多条通知消息进入同一个页面,或者说我当前停留的页面和点击状态栏消息进入的是同一个页面,那就需要设置该页面的启动模式设置为singleTop,防止创建多个相同实例。
3.SingleTask
栈内复用模式,设置为该启动模式的Activity,在启动时会判断当前任务栈中是否有此Activity,有的话则将其置为栈顶(上面如果有其他Activity则全部移除掉),没有就创建该Activity入栈。
应用场景:经常用于一个App的主页,因为在本应用中无论从主页跳转了多少个其他的页面,只要最后回到主页就会移除掉主页上面所有的页面使主页位于栈顶,这样在退出应用时可以确保关闭所有的Activity。
但还需考虑这个页面被其他的App(以QQ为例)应用调用的情况,此时就需要考虑这个页面是否位于栈底,不在栈底的话就无法回退所有Activity,这样一来在QQ调起该页面后就没有办法再返回到QQ。
解决:利用taskAffinity控制Activity的所属任务栈,即设置android:taskAffinity=”QQ的包名”。
4.SingleInstance
单例模式,将一个Activity设置为该模式表示在整个安卓操作系统中只可以存在唯一的这样一个Activity实例,即它运行在自己独立的任务栈中且独占的任务栈中只会存在它一个实例。无论这个Activity被哪个应用调用,都会将这个页面所在的任务栈移到前台显示。
应用场景:比如拨号界面就是用的这样一个方式。
如何设置
1.静态设置
在manifest.xml中找到要设置的activity,在android:launchMode=“singleTask 或其他的模式”。
2.动态设置
在代码中,跳转时给intent设置flag:
Intent intent=new Intent(this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
这样写效果就和android:launchMode="singleTask 是差不多的,同样的额FLAG_ACTIVITY_SINGLE_TOP和singleTop是一样的。