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键三次才会退出应用程序。
如下图所示:
[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才会退出。
如图所示:
[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。
如图所示:
这个模式就解决了非栈顶的活动不会被重复创建。
[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的返回栈是独立的,如图所示:
先即返回栈A 然后在去返回栈B里面找。