活动启动模式分四种:standard**、singletop、singleInstance、singleTask。可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式。
1.standard启动模式
standard是默认的启动模式,在不显示指定的情况下,所有活动默认选择这种启动模式。 在standard模式下,每启动一个新的活动,它就会在返回中入栈,并处于栈顶。在standard模式中,系统不会在乎这个活动是否在返回栈中已经存在,每次启动都会创建一个新的实例。举个例子:
在主活动添加如下代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("MainActivity",this.toString());
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
//standard 模式启动活动
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,MainActivity.class);
startActivity(intent);
}
}
);
启动程序,点击两次BUtton1键,可以看到logcat中打印如下(需要使用logcat过滤器才能这样直观看到三个连续的信息)
如代码所示,在 MainActivity 的基础上启动 MainActivity,启动之后,你需要点击3次Back键才能退出程序。原理示意图(这里引用了《第一行代码Android》书中的图片):
题外话:点击Back键的时候让我想起了哔哩哔哩,当你看了很多个视频之后,需要点很多下返回键才能回到 “首页”,就在想哔哩哔哩是不是就用的这种模式?先在这留个疑问,以后实力强了再回来解答。
2.singeltop
在此模式下,启动一个新的活动,如果发现返回栈的栈顶已存在该活动,则直接使用它,不会创建新的实例。
看清楚是栈顶,也就是说,我在MainActivity进入另一个不同的活动SecondActivity,此时栈顶变为SecondActivity,如果我再次启动一个MainActivity活动,系统又会创建一个新的实例出来。还是用图来理解一下吧:
实例,要修改启动模式,需在AndroidManifest.xml 中注入以下代码(注意看注释):
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>
题外话:好像哔哩哔哩和这个更像,在一个视频A中的推荐视频B中看不到自己当前看的视频,当你进入推荐视频B时,在推荐视频B中的推荐中看到A,又可以点击A视频看了,然后再点返回就是先看到B然后是A。哦哦哦,恍然大悟啊,就是这个原理没错了。
3.singleTask
每次启动会在返回栈中检查是否存在该活动的实例,如果存在,则直接使用,如果没有就会新创建一个活动。需要修改任然是 改AndroidManifest.xml 中的代码:
<activity android:name=".MainActivity"
android:launchMode="singleTask">//依照前面修改这一行就可以了
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
原理的话就是这样的:
4.singleInstance
singleInstace启动模式是四个模式中最复杂的一个模式,不同于其他三种模式,指定为singleInstanceqidong 模式的活动,会启用一个新的单独的栈来管理这个活动。(注意这个”单独的”和“这个活动”,因为后面ondActivity进入ThirdActivity活动,竟然会跳回到刚开始的返回栈,我就很疑惑,这里解疑了)
它这么做的意义是什么?如果两个程序想共享一个活动怎么办,使用前面三种j模式肯定没法办到,因为在每一个程序中都有自己的返回栈,同一个活动在不同的栈中必然会创建新的实例。singleInstace就很好的解决了这个问题。
以下是实践案例主要代码:
/*MainActivity活动*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("MainActivity","Task id is"+getTaskId());
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
}
);
/*SecondActivity*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("ScondActivity","Task id is"+getTaskId());
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
}
大致过程就是:
1.AndroidManifest.xml文件中修改MainActivity和SecondActivit的android:launchMode的属性值
android:launchMode="singleInstance"
2.在MainActivity界面点击按钮启动SecondActivity活动,此时singleInstance发生作用,启用一个新的返回栈B。在SecondActivity界面中点击按钮进入ThirdActivity。
图中FirstActivity即我代码中的MainActivity
写在后面:
本人只是Android刚入门的小白一名,妄想通过技术改变自己的命运。但最近发现自己学习效率太低了,而且特别容易忘,就想通过写csdn博客笔记的方式来逼自己学习以及加深记忆。这篇笔记我花了一上午和一晚上的时间来学习整理,如有错误之处,还请多多包涵并加以指正,欢迎大家来互相交流,共同成长。
希望大家都能成长的道路上越走越远,越走越强。