Android中Activty的生命周期和栈

转载 2012年03月22日 20:53:04

一个Activty的生命周期



Activty的生命周期的也就是它地点过程的生命周期。

image


每一个活动( Activity )都处于某一个状态,对于开发者来说,是无法控制其应用程序处于某一个状态的,这些均由系统来完成。
但是当一个活动的状态发生改变的时候,开发者可以通过调用 onXX() 的方法获取到相关的通知信息。

 

在实现 Activity 类的时候,通过覆盖( override )这些方法即可在你需要处理的时候来调用。

  • onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。
    onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调用 onSaveInstanceState ()方法保存的状态信息。
  • onStart :该方法的触发表示所属活动将被展现给用户。
  • onResume :当一个活动和用户发生交互的时候,触发该方法。
  • onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
  • onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发 onStop 方法。 所以保存状态信息是应该在onPause时做,而不是onStop时做。活动如果没有在前台运行,都将被停止或者Linux管理进程为了给新的活动预留足 够的存储空间而随时结束这些活动。因此对于开发者来说,在设计应用程序的时候,必须时刻牢记这一原则。在一些情况下,onPause方法或许是活动触发的 最后的方法,因此开发者需要在这个时候保存需要保存的信息。
  • onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
  • onDestroy :当活动销毁的时候,触发该方法。和 onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
  • onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。
    通常情况下,开发者不需要重写覆盖该方法,在默认的实现中,已经提供了自动保存活动所涉及到的用户界面组件的所有状态信息。

Activity栈

上面提到开发者是无法控制Activity的状态的,那Activity的状态又是按照何种逻辑来运作的呢?这就要知道 Activity 栈。

 

每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。

当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。

如果用户使用后退按钮返回的话,或者前台的Activity结束,在栈上的Activity将会移上来并变为活动状态。如下图所示:

image


一个应用程序的优先级是受最高优先级的Activity影响的。当决定某个应用程序是否要终结去释放资源,Android内存管理使用栈来决定基于Activity的应用程序的优先级。

Activity状态
一般认为Activity有以下四种状态:

活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。
暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。
当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。
停止: 当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它 将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变 为待用状态。
待用: 在一个Activity被杀死后和被装在前,它是待用状态的。待用Acitivity被移除Activity栈,并且需要在显示和可用之前重新启动它。

转载于:http://www.byywee.com/page/M0/S608/608009.html





既然堆已经可以管理变量的生命周期,那么栈的作用个是什么?

有了栈为什么还要堆?
  • GuiCiTianXie
  • GuiCiTianXie
  • 2017年08月09日 15:15
  • 208

View的生命周期方法和Activity生命周期方法关系

View 是在Activity 中使用到的,所以在自定义View的时候,我们需要了解Activity 生命周期方法和View的生命周期方法调用先后顺序。 见如下图 (1) 在Activit...
  • lue2009
  • lue2009
  • 2015年05月13日 13:26
  • 8307

Service的生命周期与Activity生命周期区别

Service的生命周期与Activity生命周期区别        组件的生命周期         应用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销...
  • sunjn_jz
  • sunjn_jz
  • 2015年09月24日 17:44
  • 536

堆和栈的全面总结

操作系统中的栈:         由编译器自动分配和自动释放,一个函数对应一个栈,用于存放函数的参数值、函数调用完成后的返回值和函数体内的局部变量等。栈占用连续的一段内存空间,其操作和组织方式与...
  • Goluck98
  • Goluck98
  • 2014年09月01日 23:25
  • 536

Activity生命周期的回调,你应该知道得更多!--Android源码剖析(上)

学习Android近一年,最近几天总算把Activity启动的生命周期回调流程走通了,因为所涉及的知识点太多,赶快做了笔记,不然过几天就忘了。 需要了解的几点概念和知识点: Instrumentati...
  • yalinfendou
  • yalinfendou
  • 2015年07月16日 11:31
  • 2729

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

虽然如此,但即使你没有实现onSaveInstanceState()方法,也还是有一些Activity的状态通过Activity类默认实现的onSaveInstanceState()方法恢复。特别是,...
  • liyuanjinglyj
  • liyuanjinglyj
  • 2015年07月25日 19:37
  • 3025

Activity任务栈的管理 -----销毁前一个相同的activity(还有一种简单的方法实现)

需求:界面A跳转到界面B,之后再跳转到界面A,此时需要销毁第一次创建的界面A,以此类推….思路:(在每次创建当前Activity的时候销毁前部的activity即可,然后在添加当前activity的引...
  • tongzhengtong
  • tongzhengtong
  • 2016年08月09日 11:30
  • 2430

Android线程的生命周期

1. 线程的生命周期开始于start()方法,终止于run()函数运行结束。 2. 守护线程的生命周期还和JVM有关系,当别的线程都dead时,JVM会kill掉所有守护线程然后退出。 3...
  • ffmpeg4976
  • ffmpeg4976
  • 2015年01月02日 12:00
  • 1627

Activity 生命周期、、dialog Activity

在Activity  A中startActivity 启动一个透明的对话框样式的Activity D A的生命周期 onPause ,然后D onCreate onStart onResume  ...
  • ID19870510
  • ID19870510
  • 2016年10月21日 18:49
  • 1217

Android:Activity统一堆栈管理(实现随时finish特定或是所有Activty)

在我们App运行时,可能在某个界面需要退出App,如果你没有把之前的Activity都finish掉的话(每次跳转都把前一个Activity finish掉,虽然可以实现,但本人不建议这种写法,因为有...
  • u010635353
  • u010635353
  • 2015年11月06日 13:07
  • 6161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Activty的生命周期和栈
举报原因:
原因补充:

(最多只允许输入30个字)