Android启动模式

Android的启动模式一共有4种,分别是:

  • standard 默认
  • singleTop 栈顶唯一
  • singleTask 栈内唯一
  • singleInstance 实例唯一

启动模式可以在AndroidManifest.xml文件中< activity >标签下配置
android:launchMode,如下代码所示:

<activity android:name=".MainActivity"
   android:launchMode="standard">
   <intent-filter>
     <action android:name="android.intent.action.MAIN" />

     <category android:name="android.intent.category.LAUNCHER" />
    intent-filter>
 activity>

还可以在启动一个Activity的时候,设置一个启动标识,代码如下:

Intent i = new Intent(MainActivity.this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

说完怎么设置launchMode,再来说下这4个启动模式分别有什么作用:

  • standard

    standard是默认的启动模式,比如不在AndroidManifest.xml文件< activity >标签下配置launchMode,那么默认就是这种启动模式,默认的启动模式会将启动的Activity依次入栈,按back键,后进先出的出栈,我们通过一个例子实际看下,在布局文件中有一个button,然后为这个按钮设置点击事件,点击的时候以standard启动模式启动自己

findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, MainActivity.class);
        startActivity(i);
        }
});

连续点击5次按钮,在adb shell中查看Activity栈,dumpsys activity 可以找到对应我们的包名的Activity栈可以看到:
Android启动模式_第1张图片
栈里面有6个MainActivity,启动时的一个,按5次按钮时启动了5个MainActivity,可以得出和刚才一样的结论:
默认的启动模式会将启动的Activity依次入栈,按back键,后进先出的出栈

  • singleTop

    singleTop 栈顶唯一,当配置launchMode="singleTop"时
    1.启动模式是singleTop的Activity为栈顶时,再去启动这个Activity,并不会产生新的Activity入栈,而是复用栈顶Activity
    2.启动模式是SingleTop的Actiyity不为栈顶时,再去启动这个Activity,会产生新的Activity入栈

<activity android:name=".MainActivity"
       android:launchMode="singleTop">
       <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
        intent-filter>
activity>

将MainActivity的launchMode属性配置为singleTop,布局文件还是一个按钮,当点击按钮时启动自己,这时点击5次按钮,观察Activity栈如下:
Android启动模式_第2张图片
可以看到栈中还是一个MainActivity,当前Activity也是栈顶。这里可能有疑问的是:当反复启动栈顶Activity时生命周期方法会重新调用吗?答案是onResume和onPause方法会成对调用,其它生命周期不会调用,有兴趣的同学可以试下。

现在看第二种情况,当MainActivity不是栈顶Activity时,再去启动MainActivity时,Activity栈会是什么情况了?如下图
Android启动模式_第3张图片
可以看到当配置了singleTop属性的MainActivity不是栈顶的时候,再去启动MainActivity会创建新的Activity入栈。

  • singleTask

    singleTask 是栈内唯一,和singleTop不同的时,当配置了singleTask的Activity不在栈顶时也会复用,如果不在栈顶,会强制其它Activity出栈,只到它位于栈顶
    Android启动模式_第4张图片
    当多次启动singleTask的Activity可见栈中还是一个Activity

  • singleInstance
    singleInstance模式是实例唯一,以这种模式启动的Activity会新建一个Activity栈,单独入栈这个Activity
    以launchMode=singleInstance启动TwoActivity,如下
    Android启动模式_第5张图片
    可以看到启动TwoActivity时,是新建了一个Activity栈来存放TwoActivity的。

到这里4种启动模式就说完了,有兴趣的同学可以通过配置不同的launchMode属性来观察Activity栈的情况,深入分析下。

你可能感兴趣的:(Android入门)