Android的活动的四种启动模式

在实际项目中,根据特定的需求需要对每个活动指定恰当的启动模式。

Android页面的启动模式分为四种:standard、singleTop、singleTask和singleInstance,可以通过AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。

四大启动模式

一、standard

    standard是活动默认的启动模式,在不进行设置的情况下,所有的活动都是自动使用这种启动模式。在这里讲启动模式之前,先说一下Android是利用返回栈来管理活动的。对于基础差的开发者还不理解Android活动(页面)是怎么进行管理的,就是用到刚刚上边说到的返回栈来管理活动的。

    我们详细来看一下,根据我自己对任务的理解来详细说一下,Andrid是使用任务(Task)来管理活动的,一个任务就是存放到栈里的活动(页面)的集合,这个栈也成为返回栈(Back Stack),栈是一种先进后出的的数据结构,在默认的情况下,每当启动一个活动,它会在返回栈中入栈,并位于栈的顶端位置,每当用户按Back键或调用finish()方法去毁掉一个活动时,处于栈顶的活动就会出栈,这时,前一个入栈的活动就会处于栈顶位置。也就是说,用户可以看到的活动(页面)就是处于栈顶的活动!(为了更好的理解我的给大家大体画了个图)


返回栈工作示意图

我新建了一个项目,代码如下,我启动三次第一个页面进行测试:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //控制台打印本页面的存标识
    Log.d("FirstActivity",this.toString());
    setContentView(R.layout.activity_first);
}
//启动本页面
public void Start_Intent(View v){
    Intent intent = new Intent(FirstActivity.this,FirstActivity.class);
    startActivity(intent);
}

控制台打印信息为:




从控制台打印信息可以看到,每点击一下按钮都会创建一个FirstActivity实例,这时,返回栈中也有三个实例,当我们按Back键退出时需要按三下才能退出程序!(如图)

返回栈

Standard模式示意图

二、singleTop

    当活动的启动模式指定为singleTop,在启动活动如果发现返回栈栈顶已经是该活动时,就直接去使用它,不会创建新的活动实例。代码如下:
    

<activity android:name=".FirstActivity"
    android:launchMode="singleTop">//启动模式singleTop
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //控制台打印本页面的存标识
        Log.d("FirstActivity",this.toString());
        setContentView(R.layout.activity_first);
    }
    //启动本页面
    public void Start_Intent(View v){
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        startActivity(intent);
    }
}
public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Log.d("SecondActivity",this.toString());
    }
    //启动本页面
    public void Start_Intent(View v){
        Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
        startActivity(intent);
    }
}

上边代码实现的由第一个页面跳转第二个页面然后点击按钮跳转到第一个页面,控制台打印的信息为:




从打印信息可以看出,创建了两个FirstActivity实例,因为我们在FirstActivity跳转到SecondActivity时,位于栈顶的是SecondActivity,因此会再创建一个新的实例FirstActivity.当用户按下Back三次才可以退出程序。下面看示意图:


                                                            singleTop模式示意图


三、singleTask

开发者使用singleTask可以解决上边singleTop模式重复创建栈顶活动的问题,为了避免活动不处于栈顶重复创建活动实例的情况,我们可以使用singleTask的模式。这个模式的特点是什么呢?当每次用户启动一个活动时,系统先检查返回栈的是否存在该活动,如果不存在就创建一个新的实例,如果存在该活动,位于该活动顶部的活动全部出栈,使该活动处于栈顶!代码改一下上方的android:launchMode="singleTask"可以自己试一下!示意图如下:


                                                               singleTask模式示意图

                                                         

四、singleInstance

singleInstance模式比前边的三种模式要复杂一些,与前边的三个模式不同的是指定为singleIntance模式的活动会启动一个新的返回栈来管理这个活动,什么时候可以用到这个模式呢?当我们这个程序的活动允许其他程序调用时,要实现这个程序和其他程序共享这个活动的话,前边的三种模式都实现不了,因为每个程序都有自己的返回栈,同一个活动在不同的返回栈中入栈的时候会创建一个新的实例。而singleIntance模式可以解决这个问题,以为这个模式有一个独立的返回栈来管理这个活动,无论有多少程序来调用这个活动,都共用同一个返回栈。

举个例子:我们建立三个页面,分别为FirstActivity、SecondActivity、ThirdActivity每个页面都要分别用Log.d("FirstActivity","getTaskId()");Log.d("SecondActivity","getTaskId()");Log.d("ThirdActivity","getTaskId()");来查看创建返回栈的id,我们将singleIntance模式指定为SecondActivity页面,我们实现三个页面的连续跳转,控制台打印出信息为:121、122、121。可以很明白的看出SecondActivity单独位于一个返回栈中。

    当我们按三下Back时,分别从ThirdActivity页面跳转到FirstActivity页面,从FirstActivity页面跳转到SecondActivity页面,我来解释一下,因为FirstActivity和ThirdActivity位于同一个返回栈中,所以ThirdActivity位于栈顶出栈,FirstActivity页面位于栈顶,所以ThirdActivity页面直接跳转到FirstActivity页面,再按Back键时,FirstActivity和ThirdActivity的返回栈为空,就会显示另一个返回栈的活动,当另一个返回栈的活动出栈时,程序才会退出!示意图如下:


singleIntance模式示意图

有什么错误或需要改正的地方,请在下方评论!谢谢!如果对你有帮助,您的赞是对我最大的支持!得意



猜你喜欢

转载自blog.csdn.net/qq_36903042/article/details/80184926