`
kalogen
  • 浏览: 880185 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 生命周期研究资料

 
阅读更多

引言

应用程序组件有一个生命周期——一开始Android实例化他们响应意图,直到结束实例被销毁。在这期间,他们有时候处于激活状态,有时候处于非激活状态;对于活动,对用户有时候可见,有时候不可见。组件生命周期将讨论活动、服务、广播接收者的生命周期——包括在生命周期中他们可能的状态、通知状态改变的方法、及这些状态的组件寄宿的进程被终结和实例被销毁的可能性。

本文主要讨论活动的生命周期及他们可能的状态、通知状态改变的方法。分为以下三部分:

  • 1、活动生命周期
  • 2、保存活动状态
  • 3、协调活动

1、活动生命周期

一个活动有三个基本状态:

  • 激活状态运行状态,这时它运行在屏幕的前台(处于当前任务活动栈的最上面)。这个活动有用户的操作的焦点。
  • 暂停状态,这时活动失去焦点但是它对用户仍可见。也就是说,另一个活动在它的上面且那个活动是透明的或者没有覆盖整个屏幕,因此通过它可以看见暂停状态的活动。一个暂停的活动完全是活着的(它维护着所有的状态和成员信息,且仍然依附在窗口管理器),但是当内存极小时可以被系统杀掉。
  • 停止状态,这时活动完全被其他活动掩盖。它仍然保留所有状态和成员信息,但是对用户它不可见,因此它的窗口时隐藏的且当其他地方需要内存时它往往被系统杀掉。

如果一个活动被暂停或停止,系统可以将它从内存移除,通过要求它结束(通过调用它的finish()方法),或简单地杀掉它的进程。当它再次显示给用户时,必须要完全重新启动和恢复到之前的状态。随着活动从一个状态转为另一个状态,通过调用下面的受保护的方法通知该改变:

  • void onCreate(Bundle saveInstanceState)
  • void onStart()
  • void onRestart()
  • void onResume()
  • void onPause()
  • void onStop()
  • void onDestroy()

所有这些方法都是钩子,你可以重写当状态改变时做适当的工作。所有的活动必须要实现onCreate()去做一些初始化的设置,当对象第一次实例化的时候。很多活动也会实现onPause()去提交数据修改或准备停止与用户交互。

将他们合并在一起,这七个方法定义了活动的整个生命周期。有三个嵌套的循环,你可以通过这七个方法监视:

  • 活动的整个生命时间,从第一次调用onCreate()开始直到调用onDestroy()结束。一个活动在onCreate()中做所有的“全局”状态的初始设置,在onDestroy()中释放所有保留的资源。举例来说,有一个线程运行在后台从网络上下载数据,它可能会在onCreate()中创建线程,在onDestroy()中结束线程。
  • 活动的可视生命时间,从调用onStart()到相应的调用onStop() 。在这期间,用户可以在屏幕上看见活动,虽然它可能不是运行在前台且与用户交互。在这两个方法之间,你可以保持显示活动所需要的资源。举例来说,你可以在onStart()中注册一个广播接收者监视影响你的UI的改变,在onStop() 中注销。因为活动在可视和隐藏之间来回切换,onStart()onStop()  可以调用多次。
  • 活动的前台生命时间,从调用onResume()到相应的调用onPause()。在这期间,频繁地在重用和暂停状态转换——例如,当设备进入睡眠状态或一个新的活动启动时调用onPause(),当一个活动返回或一个新的意图被传输时调用onResume()。因此,这两个方法的代码应当是相当轻量级的。

下面这个图解释了这三个循环和状态之间状态的可能路径。着色的椭圆表示活动的主要状态,矩形表示当活动在状态之间转换时你可以执行的回调方法。

activity_lifecycle

 

 

 

 

 

 

 

 

图1、活动生命周期(来源:Android SDK)

下面的表格对每个方法更详细的描述和在活动的整个生命周期中的定位。

t1t2

注意上面表格的Killable列,它表示当方法返回时没有执行活动的其它代码,系统是否能杀死活动寄宿的进程。三个方法(onPause()onStop()onDestroy())标记为Yes。因为onPause()是唯一一个保证在进程被杀之前会调用的,因此你应该使用onPause()来写任何持久化存储数据。

被标记为No的方法保护活动寄宿的进程在他们调用的时候不会被杀掉。因此活动是可杀掉状态,例如onPause()返回到onResume()调用期间。直到onPause()再次返回,活动是不可杀掉的。其实,没有标记为Killable的活动也是可以系统被杀掉的,不过这仅仅发生在极端困难的情况下,没有有任何其他资源可用。

2、保存活动状态

当系统而不是用户关闭一个活动来节省内存时,用户可能希望返回到活动且是它之前的状态。为了获得活动被杀之前的状态,你可以执行活动的onSaveInstanceState()方法。Android在活动容易被销毁前调用这个方法,也就是调用onPause()之前。该方法的参数是一个Bundle对象,在这个对象你可以以名值对记录活动的动态状态。当活动再次启动时,Bundle同时被传递到onCreate()和调用onCreate()之后的方法,onRestoreInstanceState(),因此使用一个或两个可以重新创建捕获的状态。

因为onSaveInstanceState()方法不总是被调用,你应该仅使用onSaveInstanceState()它来记录活动的临时状态,而不是持久的数据。应该使用onPause()来存储持久数据。

3、协调活动

当一个活动启动另一个活动,他们都经历生命周期转换。一个暂停或许是停止,然而另一个启动。有时,你可能需要协调这些活动。生命周期的回调顺序是明确界定的,特别是当这两个活动在同一个进程中:

  1. 当前活动的onPause()方法被调用。
  2. 接下来,启动活动的onCreate()onStart()onResume()方法按序被调用。
  3. 然后,如果获得不再在屏幕上可见,它的onStop()方法被调用。

修正:第一节——活动生命周期中的表格第一、二行中的第二列(description)中的onRestart()应该为onStart()。
1000多的点击,居然没有人发现这个错误,看了大家根本就没认真看或者说根本没有静心看园子里的任何博文,心痛!还是水帖比较受欢迎。

 

 

 

作者:吴秦
出处:http://www.cnblogs.com/skynet/

 

 

=========================================================================

 

对手机有所研究的朋友们,应该对于Android这一手机操作系统并不陌生。它是一款基于Linux平台的开源手机操作系统。我们在这里会通过对Android Activity生命周期的介绍来充分的了解一下这一系统的基本原理。

注意到在Activity的API中有大量的onXXXX形式的函数定义,除了我们前面用到的onCreate以外,还有onStart,onStop以及onPause等等。从字面上看,它们是一些事件回调,那么次序又是如何的呢?其实这种事情,自己做个实验最明白不过了。在做这个实验之前,我们先得找到在Android中的Log是如何输出的。

显然,我们要用的是android.util.log类,这个类相当的简单易用,因为它提供的全是一些静态方法:

  1. Log.v(String tag, String msg); //VERBOSE  
  2. Log.d(String tag, String msg); //DEBUG   
  3. Log.i(String tag, String msg); //INFO  
  4. Log.w(String tag, String msg); //WARN  
  5. Log.e(String tag, String msg); //ERROR 

前面的tag是由我们定义的一个标识,一般可以用“类名_方法名“来定义。

输出的LOG信息,如果用Eclipse+ADT开发,在LogCat中就可以看到,否则用adb logcat也行,不过我是从来都依赖于IDE环境的。

好了,现在我们修改前面的HelloThree代码:

  1. public void onStart()  
  2. ...{  
  3. super.onStart();  
  4. Log.v(TAG,"onStart");  
  5. }  
  6. public void onStop()  
  7. ...{  
  8. super.onStop();  
  9. Log.v(TAG,"onStop");  
  10. }  
  11. public void onResume()  
  12. ...{  
  13. super.onResume();  
  14. Log.v(TAG,"onResume");  
  15. }  
  16. public void onRestart()  
  17. ...{  
  18. super.onRestart();  
  19. Log.v(TAG,"onReStart");  
  20. }  
  21. public void onPause()  
  22. ...{  
  23. super.onPause();  
  24. Log.v(TAG,"onPause");  
  25. }  
  26. public void onDestroy()  
  27. ...{  
  28. super.onDestroy();  
  29. Log.v(TAG,"onDestroy");  
  30. }  
  31. public void onFreeze(Bundle outState)  
  32. ...{  
  33. super.onFreeze(outState);  
  34. Log.v(TAG,"onFreeze");  

在HelloThreeB中也同样增加这样的代码,编译,运行一下,从logcat中分析输出的日志。

在启动第一个界面Activity One时,它的次序是:

  1. onCreate (ONE) - onStart (ONE) - onResume(ONE)  


虽然是第一次启动,也要走一遍这个resume事件。然后,我们点goto跳到第二个Activity Two中(前一个没有关闭),这时走的次序是:

  1. onFreeze(ONE) - onPause(ONE) - onCreate(TWO) -  onStart(TWO) - onResume(TWO) - onStop(ONE) 

说明,第二个Activity Two在启动前,One会经历一个:冻结、暂停的过程,在启动Two后,One才会被停止?

然后,我们再点back回到第一个界面,这时走的次序是:

  1. onPause(TWO) - onActivityResult(ONE) - onStart(ONE) -  onRestart(ONE) - onResume(ONE) - onStop(TWO) - onDestroy(TWO) 

说明,返回时,Two没有经历冻结就直接暂停了,在One接收参数,重启后,Two就停止并被销毁了。最后,我们点一下Exit退出应用,它的次序是:

  1. onPause(ONE) - onStop(ONE) - onDestroy(ONE) 

说明如果我们用了finish的话,不会有freeze,但是仍会经历pause - stop才被销毁。

这里有点疑问的是:为什么回来时先是Start才是Restart?可是文档中的图上画的却是先restart再start的啊?不过,后面的表格中的描述好象是正确的,start后面总是跟着resume(如果是第一次)或者restart(如果原来被stop掉了,这种情况会在start与resume 中插一个restart)。

 

下面不跑例子了,看看Android Activity生命周期的文档吧。

1.Android用Activity Stack来管理多个Activity,所以呢,同一时刻只会有最顶上的那个Activity是处于active或者running状态。其它的Activity都被压在下面了。

2. 如果非活动的Activity仍是可见的(即如果上面压着的是一个非全屏的Activity或透明的Activity),它是处于paused状态的。在系统内存不足的情况下,paused状态的Activity是有可被系统杀掉的。只是不明白,如果它被干掉了,界面上的显示又会变成什么模样?看来下回有必要研究一下这种情况了。

3.几个事件的配对可以比较清楚地理解它们的关系。Create与Destroy配成一对,叫entrie lifetime,在创建时分配资源,则在销毁时释放资源;往上一点还有Start与Stop一对,叫visible lifetime,表达的是可见与非可见这么一个过程;最顶上的就是Resume和Pause这一对了,叫foreground lifetime,表达的了是否处于激活状态的过程。

4.因此,我们实现的Activity派生类,要重载两个重要的方法:onCreate()进行初始化操作,onPause()保存当前操作的结果。

除了Activity Lifecycle以外,Android还有一个Process Lifecycle的说明:

在内存不足的时候,Android是会主动清理门户的,那它又是如何判断哪个process是可以清掉的呢?文档中也提到了它的重要性排序:

1. 最容易被清掉的是empty process,空进程是指那些没有Activity与之绑定,也没有任何应用程序组件(如Services或者IntentReceiver)与之绑定的进程,也就是说在这个process中没有任何activity或者service之类的东西,它们仅仅是作为一个cache,在启动新的 Activity时可以提高速度。它们是会被优先清掉的。因此建议,我们的后台操作,最好是作成Service的形式,也就是说应该在Activity中启动一个Service去执行这些操作。

2.接下来就是background activity了,也就是被stop掉了那些activity所处的process,那些不可见的Activity被清掉的确是安全的,系统维持着一个 LRU列表,多个处于background的activity都在这里面,系统可以根据LRU列表判断哪些activity是可以被清掉的,以及其中哪一个应该是最先被清掉。不过,文档中提到在这个已被清掉的Activity又被重新创建的时候,它的onCreate会被调用,参数就是onFreeze时的那个Bundle。不过这里有一点不明白的是,难道这个Activity被killed时,Android会帮它保留着这个Bundle吗?

3.然后就轮到service process了,这是一个与Service绑定的进程,由startService方法启动。虽然它们不为用户所见,但一般是在处理一些长时间的操作(例如MP3的播放),系统会保护它,除非真的没有内存可用了。

4.接着又轮到那些visible activity了,或者说visible process。前面也谈到这个情况,被Paused的Activity也是有可能会被系统清掉,不过相对来说,它已经是处于一个比较安全的位置了。

5.最安全应该就是那个foreground activity了,不到迫不得已它是不会被清掉的。这种process不仅包括resume之后的activity,也包括那些onReceiveIntent之后的IntentReceiver实例。

在Android Activity生命周期的讨论中,文档也提到了一些需要注意的事项:因为Android应用程序的生存期并不是由应用本身直接控制的,而是由 Android系统平台进行管理的,所以,对于我们开发者而言,需要了解不同的组件Activity、Service和IntentReceiver的生命,切记的是:如果组件的选择不当,很有可能系统会杀掉一个正在进行重要工作的进程。

分享到:
评论

相关推荐

    android生命周期研究

    本文将深入探讨“android生命周期研究”,并基于提供的标签“源码”和“工具”进行详细阐述。 首先,Android应用的主要组件有四大类:Activity、Service、BroadcastReceiver和ContentProvider。每个组件都有其独特...

    Android生命周期详细案例

    在Android应用开发中,理解并熟练掌握Activity的生命周期至关重要,因为它是构成应用程序核心功能的基石。本案例将深入探讨Android Activity的生命周期,并通过具体的图片示例进行解释。 首先,Activity生命周期是...

    Activity和Fragment生命周期研究

    在Android应用开发中,Activity和Fragment是两个至关重要的组件,它们构成了用户界面的主要部分,并各自拥有独特的生命周期。本文将深入探讨Activity和Fragment的生命周期,帮助开发者更好地理解和掌握这两个组件的...

    Android Activity 生命周期(lifecycle)的研究

    本文将详细探讨Android Activity的生命周期,以及如何通过源码分析和使用工具进行深入研究。 Activity的生命周期由一系列回调方法构成,这些方法在特定时刻被系统调用,指示Activity的状态变化。主要的生命周期回调...

    disposer,使用android的生命周期轻松处理rxjava流.zip

    通过研究该项目,你可以深入理解如何有效地在Android应用中集成RxJava并处理其生命周期。项目的源码会包含详细的注释和示例,帮助开发者更好地理解和应用这一最佳实践。通过这种方式,开发者可以编写更健壮、更易于...

    android-lifecycle, Android Activity/fragment 生命周期的图表.zip

    android-lifecycle, Android Activity/fragment 生命周期的图表 完整的Android fragment & Activity 生命周期尝试了解各种各样的片段之后,我做了一些研究并将完整的Android Activity/fragment 生命周期结合起来。...

    Android中人为改变程序生命周期的研究.pdf

    在Android应用开发中,程序生命周期的管理是至关重要的。Android系统的特性决定了程序的生命周期并非完全由应用程序自身控制,而是由操作系统根据用户交互和系统资源管理来决定。这可能导致在某些情况下,用户关闭...

    Activity生命周期源代码

    了解Activity的生命周期是每个Android开发者必备的知识。Activity的生命周期由一系列的方法组成,这些方法会在特定时刻被系统调用,例如当Activity创建、启动、暂停、恢复或销毁时。通过分析Activity的源代码,我们...

    一行代码解决RxJava 内存泄漏,一款轻量级别的RxJava生命周期管理库

    在这种情况下,RxLife库可能还提供了其他高级功能,如支持组合多个生命周期源,或者与其他流行的生命周期库(如Android Architecture Components的Lifecycle)集成。 总之,理解并正确使用如RxLife这样的生命周期...

    Android底层架构研究

    AndroidApplication是应用程序的入口点,它定义了应用程序的全局状态和生命周期。通过分析AndroidApplication,可以了解应用程序如何初始化、如何响应系统事件以及如何与其他组件交互。 ### **21. Android应用框架...

    Fragment的生命周期以及使用技巧源码

    总结,Fragment是Android开发中的重要工具,理解其生命周期和使用技巧对于创建高效、可维护的应用至关重要。通过对源码的深入学习,开发者可以解决实际问题,提升应用性能。在实际项目中,灵活运用Fragment,可以...

    Android操作系统安全机制研究.doc

    系统运行时类库层包括多个子系统和Android运行时,其中Dalvik虚拟机负责对象生命周期、线程和安全管理。 Android的安全机制主要包括以下几个方面: 1. 权限管理:Android采用基于权限的访问控制模型,每个应用在...

    android之Junit 深入研究代码

    Android的测试与普通的Java测试有所不同,因为它们涉及到Android组件的生命周期。我们可以使用`@UiThreadTest`和`@UiThreadTest`注解来分别在主线程和工作线程中执行测试。 六、AndroidTestCase与Espresso 虽然...

    android 相关研究文档

    理解View的生命周期、绘制流程、测量与布局过程至关重要。开发者需要了解onMeasure()、onLayout()和onDraw()方法,以及如何通过自定义View来实现复杂的UI效果。 2. **ImageView研究文档**:ImageView用于显示图片,...

    Android应用源码之(Activity生命周期).zip项目安卓应用源码下载

    Android应用源码之(Activity生命周期).zip项目安卓应用源码下载Android应用源码之(Activity生命周期).zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    Android应用源码之8.Activity生命周期.zip项目安卓应用源码下载

    Android应用源码之8.Activity生命周期.zip项目安卓应用源码下载Android应用源码之8.Activity生命周期.zip项目安卓应用源码下载 1.适合学生毕业设计研究参考 2.适合个人学习研究参考 3.适合公司开发项目技术参考

    android基于gecko引擎的浏览器示例

    这通常涉及到添加依赖,配置权限,以及初始化和管理Gecko的生命周期。例如,可能需要在AndroidManifest.xml中声明必要的权限,如互联网访问权限。 2. **创建WebView替代方案**:基于Gecko的浏览器需要创建一个新的...

    基于Android平台软件开发方法的研究与应用

    用组件和Activity生命周期,对Android平台底层组件软件开发和应 用层软件开发方法进行了深入研究。在此基础上,运用这两种开发方 法分别设计实现了Android音视频编解码软件和Android录音机软 件。

    Android的Fragment演示程序

    总结来说,"Android的Fragment演示程序"涵盖了Fragment的基本概念、生命周期、与Activity的交互、数据传递以及用户事件处理等多个方面。通过详细研究FragmentDemo,开发者可以深化对Fragment的理解,提高构建高效、...

    Android静态变量的生命周期 简单介绍

    不过Android不太突出的进程概念,所以对静态变量的生命周期就会感觉模糊,这种模糊对于值类型是无所谓的,如果是静态的对象引用,则与内存回收、内存泄漏这些问题有关,有必要加深研究和理解。 一、静态变量在类被...

Global site tag (gtag.js) - Google Analytics