标签:android 任务栈 任务栈模式 activity 生命周期
Activity整个的生命周期如下所示,这张图是从Android API上扒下来了,我觉得API上关于生命周期已经讲解的很详细了,我也就不啰嗦了,就简要的说下自己的一些总结:
横竖屏切换时,默认情况下会把activity先销毁再创建,在类似手机游戏这一类的应用中,这个体验是非常差的。不让Activity在横竖屏切换时销毁,只需要在清单文件声明Activity时配置<activity>
节点的几个属性即可,其方式如下:
android:configChanges="orientation|keyboardHidden|screenSize"
为了解决任务栈产生的问题,Android为Activity设计了启动模式,那么下面的内容将介绍Android中Activity的启动模式,这也是最重要的内容之一。
启动模式(launchMode)在多个Activity跳转的过程中扮演者重要的角色,它可以解决是否生成新的Activity实例,是否重用已经存在的Activity实例,是否和其他实例共用一个任务栈。任务栈是一个具有站结构的对象,一个任务栈可以管理多个Activity,每启动一个应用,也就创建一个与之对应的任务栈。
我们可以在AndroidManifest.xml配置<activity>
的android:launchMode属性为以上四种之一即可。
为了详细讲解启动模式,我们创建一个工程,里面有两个Activity,分别是FirstActivity
和SecondActivity
,启动模式都是standard
。下面是界面截图和关键代码:
界面一
界面二
FirstActivity文件:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);
System.out.println("当前任务栈ID:" + getTaskId() + "当前是第一个界面(" + this.toString()+")");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("第一个界面("+this.toString() + ")退出任务栈");
}
SecondActivity文件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
System.out.println("当前任务栈ID:" + getTaskId() + "当前是第二个界面(" + this.toString()+")");
}
@Override
protected void onDestroy() {
super.onDestroy();
System.out.println("第二个界面("+this.toString() + ")退出任务栈");
}
①激活第二个界面 -> 激活第一个界面 -> 激活第二个界面 -> 激活第一个界面 ->激活第二个界面
②狂按返回键
栈中的情况如下所示:
每次激活都会创建新的实例,每次返回都会销毁实例并出栈
为了讲解的更清楚,我在按钮中加入了如下Log
public void first(View v) {
Intent intent = new Intent(this, FirstActivity.class);
startActivity(intent);
System.out.println("想要激活第一个页面");
}
public void second(View v) {
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
System.out.println("想要激活第二个页面");
}
①激活第二个界面 -> 激活第一个界面 -> 激活第一个界面 -> 激活第一个界面
②按三次返回键
栈中的情况如下所示:
注意当第一个页面处于栈顶,并且还想要激活第一个界面时就会因为singleTop
模式不再创建新的实例;但如果第一个界面不再栈顶,那么还是会创建新的实例的。
①激活第一个界面 -> 激活第二个界面 -> 激活第二个界面 -> 激活第一个界面
②按一次返回键
这里的栈结构没法用图画出来了,我就描述一下Log吧。
①激活第二个界面 -> 激活第二个界面 -> 激活第一个界面
②按3次返回键
栈中的情况如下所示:
正如概述中所说的,应用启动时,由于给第一个界面配置的singleInstance
模式,所以直接创建了一个新的任务栈给第一个Activity,并保证不会有其他Activity入栈,并且还保证了实例的复用。然后去激活第二个Activity,由于第二个界面是标准模式,所以直接创建了新实例、并入栈。
Android基础笔记(八)- Activity生命周期与任务栈
标签:android 任务栈 任务栈模式 activity 生命周期
原文地址:http://blog.csdn.net/biezhihua/article/details/44230603