启动模式一共有4种,standard,singleTop,singleTask,singleInstance。可以在Manifest.xml为 来指定启动模式

    

    1、standard

        默认不设置activity的启动模式时,系统自动指定为standard。在activity_main.xml里加入一个button,并把onclick设置为click方法,我们在MainActivity的onCreate()方法里这样写

    

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        
        Log.d("MainActivity",this.toString());
        setContentView(R.layout.activity_main);
        
    }
    
    public void click(View view){
        Intent intent=new Intent(this,MainActivity.class);
        startActivity(intent);
    }

    运行APP后,在手机上一直点按钮,每次都显示这个页面。

    这个时候点击回退键,发现一直都是这个界面,直到点击N次后,才关闭。

    

    standard模式,默认在每次创建一个新的activity,从oncreate()方法里打印的日志可以看出,activity的实例每次都不同


    2、 singleTop 

        设置为singleTop,当启动该活动时,发现已经处于栈顶,那么就用直接使用该活动,而不再创建新的activity。

        不过当该活动不在栈顶,而重新启动该活动时,还是会创建新的activity。


    3、singleTask

        有没有一种模式,可以使上下文中只存在一个该活动呢,那就是singleTask.

        每次启动该活动时,系统会首先去返回栈中查找是否存在该活动,如果发现有,那么就使用该实例,如果没有,则新创建活动实例。


    4、singleInstance

        这个模式是4种模式中最复杂的模式了。指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动。

        假设我们的活动允许其他程序调用,如果我们想实现其他程序共享这个活动,那么我们就创建一个公用的返回栈来管理这个活动,解决了程序之间的调用。

    现在让我们创建三个activity,第二个activity的launchMode="singleInstance"。第一个activity对应的布局文件中,有一个按钮,点击后,通过intent跳转到第二个activity。第二个activity的布局中有2个按钮,第一个点击后,跳转到第一个activity,第二个点击后跳转到第三个activity。

    在每个activity的onCreate()方法中都打印当前返回栈的ID,通过Log.d("XXXActivity","Task id is"+getTaskId());


    运行后,可以看到第一个和第三个activity的返回栈都是97,而第二个返回栈是98.