1.活动的启动模式:

活动的启动模式可以在:AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来指定如下4中模式。


[1] standard

是活动默认的启动模式,我们可以通过一个例子来辅助理解:

<span style="font-size:14px;"></span>



public class FirstActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        Log.d("FirstActivity",this.toString());
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this,FirstActivity.class);
        startActivity(intent);
    }
}

在MainActivity中我们点击按钮会执行这句:

Intent intent = new Intent(FirstActivity.this,FirstActivity.class);


代码没有写错,只是自己调用自己而已,当我连续点击3次,此时会创建3个MainActivity实例,这样我们按Back键三次才会退出应用程序。

如下图所示:

Android action启动APP页面newtask_启动模式

[2] singleTop

这个模式是对第一个模式的不足进行改进,如果返回栈顶的活动是该活动,则直接使用不会再创建新活动。

我们对第一个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTop"

则不管点击多少次,只会创建一个活动,按Back键直接退出程序。

如果我们这样来操作:FirstActivity点击按钮调用SecondActivity,SecondActivity点击按钮调用FirstActivity。

代码如下:


public class FirstActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_first);
        Log.d("FirstActivity",this.toString());
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        startActivity(intent);
    }
}


 


public class SecondActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_second);
        Log.d("SecondActivity",this.toString());
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
        startActivity(intent);
    }
}


经过测试可以知道程序会创建两个不同的FirstActivity实例,因为SecondActivity中启用FirstActivity时,此时栈顶活动是SecondActivity,因此会创建一个新的FirstActivity实例,按下Back键先返回到SecondActivity,再按Back键返回到FirstActivity,再按Back才会退出。

如图所示:

Android action启动APP页面newtask_启动模式_02

[3] singleTask

使用singleTask模式是解决了创建栈顶活动时重复问题,但是该活动不是处于栈顶位置时,还是会创建多个实例,那么是否有办法整个应用程序只有一个实例呢?

第三种模式就能解决这个问题。

第二个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTask"

在FirstActivity中实现onRestart方法:

@Override
protected void onRestart() {
    super.onRestart();
    Log.d("Fristctivity","onRestart");
}

在SecondActivity中实现onDestory方法:

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d("SecondActivity","onDestory");
}

按照第二中模式进行点击,然后按Back键,你会发现没有重新创建FirstActivity。

如图所示:

Android action启动APP页面newtask_ide_03

这个模式就解决了非栈顶的活动不会被重复创建。

[4] singleInstance

这个模式比较复杂,假设我们的程序中有一个活动是允许被其他程序调用的,如果我们想实现一个其他程序和我们的程序共享这个活动的实例,singleInstance模式可以解决这个问题。

将SecondActivity修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleInstance"


public class FirstActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_first);
        Log.d("FirstActivity","Task Id is :"+getTaskId());
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
        startActivity(intent);
    }
}


 

public class SecondActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_second);
        Log.d("SecondActivity","Task Id is:"+getTaskId());
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
        startActivity(intent);
    }
}




public class ThirdActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_third);
        Log.d("ThirdActivity","Task Id is:"+getTaskId());
    }


我们发现Task Id SecondActivity·确实不同于FirstActivity和ThirdActivity

我们按Back键发现ThirdActivity直接返回到FirstActivity,再按Back键返回到SecondActivity,再按Back才会退出程序。


这说明SecondActivity的返回栈是独立的,如图所示:


Android action启动APP页面newtask_Back_04


先即返回栈A  然后在去返回栈B里面找。