Android学习笔记(六)——活动的启动模式

  //此系列博文是《第一行Android代码》的学习笔记,如有错漏,欢迎指正!

  活动的启动模式共有四种: standard、singleTop、singleTask 和 singleInstance。可以在Manifest文件中通过给<activity>标签指定android:launchMode属性来选择启动模式。下面我们逐个看看:
一、standard模式

  standard 是活动默认的启动模式。在 standard 模式(即没有显示指定其他的启动方式)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用
standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

  所以,假如我们在主活动中加入下面代码,我们每按一次button 1,就会创建一个新的MainActivity,即使原来的MainActivity已经在栈顶:

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("MainActivity", this.toString());
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new OnClickListener() {
    @Override
        public void onClick(View v) {
        Intent intent = new Intent(MainActivity.this, MainActivity.class);
        startActivity(intent);
        }
    });
}    

二、 singleTop模式

  相比standard模式,在 singleTop模式下, 假若在启动活动时如果系统发现返回栈的栈顶已经是该活动, 则认为可以直接使用它,不会再创建新的活动实例。当要指定一个活动的启动模式为singleTop时,我们只需在manifest文件添加 android:launchMode="singleTop" 语句即可:

1 <activity
2     android:name=".MainActivity"
3     android:launchMode="singleTop"
4     android:label="This is MainActivity" >
5     <intent-filter>
6         <action android:name="android.intent.action.MAIN" />
7         <category android:name="android.intent.category.LAUNCHER" />
8     </intent-filter>
9 </activity>

   不过此时假如我们在MainActivity中通过一个按钮启动了second_activity,然后又在second_activity中按下了一个按钮再启动MainActivity的话,那么此时的返回栈中是有两个MainActivity实例的。

三、singleTask模式

  当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。这样能保证该活动在整个返回栈只有一个实例。

四、singleInstance模式

  与以上三种启动模式不同, 当一个活动指定为 singleInstance 模式,系统会启用一个新的返回栈来管理这个活动,假如我们注册了三个活动:A,B,C,其中A和C为standard模式,B为singleInstance模式。然后我们通过A来启动B,再通过B来启动C。此时A和C在同一个返回栈stack1,且A在栈底,C在栈顶,而B则字另一个栈stack2。当我们按下back键时,C首先出栈,再按一次back,A出栈,这时当前的返回栈已经空了,于是就显示了另一个返回栈的栈顶活动,在按第三次back键时,才是B出栈。

  //End.

原文地址:https://www.cnblogs.com/Vincent-Bryan/p/5372322.html