1.四种启动模式:
1).standard(标准模式)
特点:1.Activity的默认启动模式
2.每启动一个Activity就会在栈顶创建一个新的实例。例如:闹钟程序
缺点:当Activity已经位于栈顶时,而再次启动Activity时还需要在创建一个新的实例,不能直接复用。
2).singleTop(栈顶复用模式)
特点:该模式会判断要启动的Activity实例是否位于栈顶,如果位于栈顶直接复用,否则创建新的实例。 例如:浏览器的书签。
缺点:如果Activity并未处于栈顶位置,则可能还会创建多个实例。
3).singleTask(栈内复用模式)
特点:使Activity在整个应用程序中只有一个实例。每次启动Activity时系统首先检查栈中是否存在当前Activity实例,如果存在则直接复用,并把当前Activity之上所有实例全部出栈。例如:浏览器主界面。
4).singleInstance(单实例模式)
特点:该模式的Activity会启动一个新的任务栈来管理Activity实例,并且该实例在整个系统中只有一个。无论从那个任务栈中 启动该Activity,都会是该Activity所在的任务栈转移到前台,从而使Activity显示。主要作用是为了在不同程序中共享一个Activity实例。
2.设置位置
为 Activity 指定启动模式:
① 通过 AndroidManifest.xml 文件指定 “launchMode”属性,eg:
<activity android:name=".SecondActivity"
android:launchMode="singleInstance">
</activity>
② 通过 java 代码在 intent 中设置标志位:
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
3.代码通用设置
Intent intent = new Intent(); intent.setClass(MainActivity.this, MainActivity2.class); //栈中存在该实例,则重新创建该实例,并清除原实例上方的所有实例--多次跳转,每个活动只返回一次 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //跳转页面时,栈中原有实例都被清空,同时开启新的活动栈--登陆成功后不再返回登陆页面。 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
四、Intent 中常用的 FLAG:
① FLAG_ACTIVITY_CLEAR_TOP:
这里分两种情况:
a. 当设置的这个 activity 在当前的 Task 中存在,并且启动模式为 standard 而且没有为这个 intent 中设置 FLAG_ACTIVITY_SINGLE_TOP 标志,此时它会清除这个栈中在它之上的(包括它自己)所有的 activity,然后重新创建这个 activity;
b. 当设置的这个 activity 在当前的 Task 中存在,并且启动模式不为 standard 或者为这个 intent 中设置了FLAG_ACTIVITY_SINGLE_TOP 标志,此时它会清除这个栈中在它之上的(不包括它自己)所有的 activity,然后将这个 activity 重新回到栈顶并调用它的 onNewIntent() 方法;
② FLAG_ACTIVITY_SINGLE_TOP:
效果和在 AndroidManifest.xml 中指定的 launchMode 为 singleTop 一样。
③ FLAG_ACTIVITY_SINGLE_TASK:
效果和在 AndroidManifest.xml 中指定的 launchMode 为 singleTask一样。
④ FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:
如果设置,新的 activity 不会在最近启动的 activity 的列表中保存。