Android基础笔记(八)- Activity生命周期与任务栈

  • Activity的生命周期
  • 横竖屏切换问题
  • 任务栈的概念
  • Activity的4种启动模式

Activity的生命周期

Activity整个的生命周期如下所示,这张图是从Android API上扒下来了,我觉得API上关于生命周期已经讲解的很详细了,我也就不啰嗦了,就简要的说下自己的一些总结:

做工作中,你可能感兴趣的三个关键环
① 完整生命周期
② 可见生命周期
③ 可交互生命周期

如图所示,图中的周期都是大的包括小的:

在实际工作中的使用
①onResume可见, 可交互.。把动态刷新的操作启动。
②onPause部分可见, 不可交互. 把动态刷新的一些操作, 给暂停了。
③onCreate 初始化一些大量的数据
④onDestroy 把数据给释放掉, 节省内存。

横竖屏切换问题

 横竖屏切换时,默认情况下会把activity先销毁再创建,在类似手机游戏这一类的应用中,这个体验是非常差的。不让Activity在横竖屏切换时销毁,只需要在清单文件声明Activity时配置<activity>节点的几个属性即可,其方式如下:

android:configChanges="orientation|keyboardHidden|screenSize"
解释
①configChange=”orientation”屏幕方向改变:不让屏幕在切换时重新创建activity
②sreensize 屏幕大小
③keyboardHidden是软键盘,如果切换屏幕,软键盘会去判断屏幕大小是否合适显示软键盘,在判断过程中会重启activity
设置横屏或者竖屏
android:screenOrientation=”portrait” 竖屏
android:screenOrientation=”landscape”横屏

任务栈的概念

任务栈是用来提升用户体验而设计的:
(1) 程序打开时就创建了一个任务栈, 用于存储当前程序的activity,所有的activity属于一个任务栈。
(2) 一个任务栈包含了一个activity的集合, 去有序的选择哪一个activity和用户进行交互:只有在任务栈栈顶的activity才可以跟用户进行交互。
(3) 任务栈可以移动到后台, 并且保留了每一个activity的状态. 并且有序的给用户列出它们的任务, 而且还不丢失它们状态信息。
(4) 退出应用程序时:当把所有的任务栈中所有的activity清除出栈时,任务栈会被销毁,程序退出。
任务栈的缺点:
(1) 每开启一次页面都会在任务栈中添加一个Activity,而只有任务栈中的Activity全部清除出栈时,任务栈被销毁,程序才会退出,这样就造成了用,户体验差, 需要点击多次返回才可以把程序退出了。
(2) 每开启一次页面都会在任务栈中添加一个Activity还会造成数据冗余, 重复数据太多, 会导致内存溢出的问题(OOM)。

为了解决任务栈产生的问题,Android为Activity设计了启动模式,那么下面的内容将介绍Android中Activity的启动模式,这也是最重要的内容之一。

Activity的4种启动模式

 启动模式(launchMode)在多个Activity跳转的过程中扮演者重要的角色,它可以解决是否生成新的Activity实例,是否重用已经存在的Activity实例,是否和其他实例共用一个任务栈。任务栈是一个具有站结构的对象,一个任务栈可以管理多个Activity,每启动一个应用,也就创建一个与之对应的任务栈。

Activity一共有以下四种launchMode模式:
① standard
② singTop
③ singTask
④ singleInstance

我们可以在AndroidManifest.xml配置<activity>的android:launchMode属性为以上四种之一即可。

为了详细讲解启动模式,我们创建一个工程,里面有两个Activity,分别是FirstActivitySecondActivity,启动模式都是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() + ")退出任务栈");
}
standard 详细讲解
概述:在本模式中,不管有没有已存在的实例,都生成新的实例。即每次调用startActivity()启动时都会创建一个新的Activity放在栈顶,可重复创建。
操作:启动程序后,执行以下操作

①激活第二个界面 -> 激活第一个界面 -> 激活第二个界面 -> 激活第一个界面 ->激活第二个界面

②狂按返回键

打印的Log如下所示


栈中的情况如下所示:


每次激活都会创建新的实例,每次返回都会销毁实例并出栈

singleTop详细讲解
概述:如果任务栈的栈顶存在这个要开启的activity,不会重新的创建activity,而是复用已经存在的activity。保证栈顶如果存在,不会重复创建。

为了讲解的更清楚,我在按钮中加入了如下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("想要激活第二个页面");
}
操作:启动后执行一下操作

①激活第二个界面 -> 激活第一个界面 -> 激活第一个界面 -> 激活第一个界面

②按三次返回键

打印的Log如下所示


栈中的情况如下所示:


注意当第一个页面处于栈顶,并且还想要激活第一个界面时就会因为singleTop模式不再创建新的实例;但如果第一个界面不再栈顶,那么还是会创建新的实例的。

singleTask详细讲解
概述:在当前任务栈里面只能有一个实例存在;当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在;
操作:启动后执行一下操作

①激活第一个界面 -> 激活第二个界面 -> 激活第二个界面 -> 激活第一个界面

②按一次返回键

打印的Log如下所示


这里的栈结构没法用图画出来了,我就描述一下Log吧。

应用开启,第一条Log打出,然后点击“激活第一个界面”,由于栈中已经有实例了,所以没有创建新的实例,直接复用。然后点击“激活第二个界面”,转到第二个界面,并创建出实例对象,然后在点击一次“激活第二个界面”,有创建了一个实例对象;此时,点击“激活第一个界面”,这时会去检查任务栈是否有第一个界面的实例,发现存在实例,直接复用,并把第一个界面栈上面的两个第二个界面的实例直接出栈。
最后点击返回键,由于此时栈中只剩下第一个界面的实例了,所以就只打印了一次Log。
singleInstance详细讲解
概述:这种启动模式比较特殊,因为它会启用一个新的栈结构,将Activity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
操作:启动后执行一下操作

①激活第二个界面 -> 激活第二个界面 -> 激活第一个界面

②按3次返回键

打印的Log如下所示


栈中的情况如下所示:


正如概述中所说的,应用启动时,由于给第一个界面配置的singleInstance模式,所以直接创建了一个新的任务栈给第一个Activity,并保证不会有其他Activity入栈,并且还保证了实例的复用。然后去激活第二个Activity,由于第二个界面是标准模式,所以直接创建了新实例、并入栈。

时间: 2024-08-28 23:55:41

Android基础笔记(八)- Activity生命周期与任务栈的相关文章

android学习笔记28——Activity生命周期

Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非活动状态,从非活动状态转入活动状态. Activity归纳大致会经过4个状态: 1.活动状态:当前Activity位于前台,用户可见,可获得焦点: 2.暂停状态:其他Activity位于前台,该Activity可见,不可获得焦点: 3.停止状态:该Activity不可见,失去焦点: 4.销毁状态:该

android学习笔记(5)Activity生命周期学习

对应若水老师视频教程第8课 一定要看这个视频 每个activity都有它的生命周期,开启它,关闭它,跳转到其它activity等等,都会自动调用以下某种方法.对这些个方法覆写后观察学习. protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(

Android学习笔记:Activity生命周期详解

进行android的开发,必须深入了解Activity的生命周期.而对这个讲述最权威.最好的莫过于google的开发文档了. 本文的讲述主要是对 http://developer.android.com/training/basics/activity-lifecycle/index.html 的翻译,加上了个人的一些细节和补充. 一.总体介绍

Android技术3:Activity生命周期

“关于Android Activity的生命周期”这个是android中一个重要的知识点,也是Android面试中出现最多的面试题.下面将介绍android中Activity的生命周期. 1.Activity几种状态 1.1Active(活动):当Activity位于栈顶时,它是可见,有焦点的前台Activity,可以用来响应用户的输入. 1.2Paused(暂停):一般情况,你的Activity可见但不具有焦点,例如 当前面的Activity是全透明或非透明的Activity时,下面的Acti

Android学习笔记一:Android基本组件和Activity生命周期

View   View是创建UI的基础控件, Activity  一个应用程序可能包含多个Activity,用来在屏幕中展示用户数据或者编辑用户数据. Fragement  类似于Activity的子控件,一个Activity可以包含一个或多个Fragement. Intent   通常使用Intent来完成以下工作 1.广播消息(Broadcast);2.启动服务(Service):3.启动Activity(Launch Activity):4.显示网页或者联系人列表:5.拨号或者接听电话.

深入剖析Android四大组件(一)——Activity生命周期详解

1.管理Activity的生命周期 无论是正在运行的Activity还是没有运行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的3种状态 通过回调方法来管理Activity的生命周期对于开发一个健壮并且灵活的应用程序是非常关键的.Activity的生命周期直接影响到它与其他Activity,任务以及栈的关系. Activity存在3种状态,分别是resumed,paused和stopped. resumed:指Activi

深入剖析Android四大组件(一)——Activity生命周期具体解释

1.管理Activity的生命周期 不管是正在执行的Activity还是没有执行的Activity,它们都接受Android的框架管理,这使得Activity处于不同的生命周期. ①Activity的3种状态 通过回调方法来管理Activity的生命周期对于开发一个健壮而且灵活的应用程序是很关键的. Activity的生命周期直接影响到它与其它Activity,任务以及栈的关系. Activity存在3种状态.各自是resumed,paused和stopped. ?resumed:指Activi

Android 第六课——Activity生命周期

声明:本文转载自 http://blog.csdn.net/liuhe688/article/details/6733407 , 感觉读了这篇文章之后,对Activity又是一个更深层次的理解,所以果断手贱转载了!希望自己以后能多看看这篇文章,提升自己! 熟悉javaEE的朋友们都了解servlet技术,我们想要实现一个自己的servlet,需要继承相应的基类,重写它的方法,这些方法会在合适的时间被servlet容器调用.其实android中的Activity运行机制跟servlet有些相似之处

安卓开发笔记——关于Activity生命周期的一些事情

温故而知新很重要,对于先前学过的东西,每一次回过头来看都有不一样的体会,要么理解更深了,要么理解更透彻了. 近来回顾了关于Activity的生命周期,参看了相关书籍和官方文档,有了不小的收获,在以前的认知上有了很大程度上的改善,在这里记录点东西. 先来看下经典生命周期图: 简单概要下: 1.当第一次调用一个Activity就会执行onCreate方法 2.当Activity处于可见状态的时候就会调用onStart方法 3.当Activity可以得到用户焦点的时候就会调用onResume方法 4.

Android 四大组件之Activity生命周期

写这篇博文之前,已经对android有一定的了解和认识.这篇博文主要讲述android的Activity的生命周期,这是android开发者必须掌握的知识.android的Activity组件拥有7个生命周期:onCreate().onStart().onResume().onPause().onStop().onDestory().onReStart(). 这7个生命周期分别在4个特定阶段进行调用. 开始Activity:当Activity开始运行的时候依次执行3个生命周期:onCreate.