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 的列表中保存。
 

android studio 分析android app 的启动过程 android studio启动activity_android