生命周期的代表产品

如题所述

第1个回答  2016-05-12

Android应用程序的生命周期
Android应用程序由Activity,Service,BroadCast Receiver,Content Provider这四个组件构成。
大部分情况下,每个Android应用程序都将运行在自己的Linux进程当中。当这个应用的某些代码需要执行时,进程就会被创建,并且将保持运行,直到该进程不再需要,而系统需要释放它所占用的内存,为其他应用所用时才停止。
Android一个重要并且特殊的特性就是,一个应用的进程的生命周期不是由应用程序自身直接控制的,而是由系统,根据运行中的应用的一些特征来决定的,包括:这些应用程序对用户的重要性、系统的全部可用内存。
对于应用开发者来说,理解不同的应用组件(特别是Activity、Service、Intent Receiver)对应用进程的生命周期的影响,这是非常重要的。如果没有正确地使用这些组件,将会导致当应用正在处理重要的工作时,进程却被系统销毁的后果。
对于进程的生命周期,一个普遍的错误就是:当一个Intent Receiver在它的onReceiveIntent()方法中,接收到一个Intent后,就会从这个方法中返回。而一旦从这个方法返回后,系统将会认为这个Intent Receiver不再处于活动状态了,也就会认为它的宿主进程不需要了(除非宿主进程中还存在其它的应用组件)。从而,系统随时都会销毁这个进程,收回内存,并中止其中还在运行的子线程。问题的解决办法就是,在Intent Receiver中,启动一个Service,这样系统就会知道在这个进程中,还有活动的工作正在执行。
为了决定在内存不足情况下销毁哪个进程,Android会根据这些进程内运行的组件及这些组件的状态,把这些进程划分出一个“重要性层次”(如右图)。
1、前台进程是拥有一个显示在屏幕最前端并与使用者做交互的Activity(它的onResume()方法已被调用)的进程,也可能是一个拥有正在运行的 Intent Receiver(它的onReceiveIntent()方法正在运行)的进程。在系统中,这种进程是很少的,只有当内存低到不足于支持这些进程的继续运行,才会将这些进程销毁,通常这时候,设备已经达到了需要进行内存整理的状态,为了保障用户界面不停止响应,只能销毁这些进程;
2、可见进程是拥有一个用户在屏幕上可见的,但并没有在前台显示的Activity(它的onPause()已被调用)进程。例如:一个以对话框显示的前台Activity在屏幕上显示,而它后面的上一级Activity仍然是可见的。这样的进程是非常重要的,一般不会被销毁,除非为了保障所有的前台进程正常运行,才会被销毁。Android进程一般存在少量的可见进程,只有在特殊情况下,Android系统才会为保证前台进程的资源而清除可见进程。
3、服务进程是拥有一个由startService()方法启动的Service的进程。尽管这些进程对于使用者是不可见的,但他们做的通常是使用者关注的事情(如后台音乐播放器正在播放音乐或后台上传下载数据的网络服务)。因此,除非为了保障前台进程和可见进程的正常运行,系统才会销毁这种进程。
4、后台进程是拥有一个用户不可见的Activity(onStop()方法已经被调用)进程。这些进程不直接影响用户的体验。如果这些进程正确地完成了自己的生命周期,系统会为了以上三种类型进程,而随时销毁这种进程以释放内存。通常会有很多这样的进程在运行着,因此这些进程会被保存在一个LRU列表中,以保证在内存不足时,用户最后看到的进程将在最后才被销毁。
5、空进程是那些不拥有任何活动的应用组件的进程。保留这些进程的唯一理由是,作为一个缓存,在它所属的应用组件下一次需要时,缩短启动的时间。同样的,为了在这些缓存的空进程和底层的核心缓存之间平衡系统资源,系统会经常销毁这些空进程。
当要对一个进程进行分类时,系统会选择在这个进程中所有活动的组件中重要等级最高者作为依据。
一个Activity通常是一个单独的屏幕,Activity生命周期是指Activity从启动到销毁的过程。系统中的Activity被一个Activity栈所管理。当一个新的Activity启动时,将被放置到栈顶,成为运行中的Activity,前一个Activity保留在栈中,不再放到前台,直到运行中的Activity退出为止。
Activity表现为四种状态:
⒈活动状态(Active or Running):也称为运行状态,处于Activity栈顶,在用户界面中最上层,完全能被用户看到,能够与用户进行交互;
⒉ 暂停状态(Paused):Activity失去焦点,Activity界面被部分遮挡,该Activity不再处于用户界面的最上层,且不能够与用户进行交互。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,与窗口管理器保持连接),但是在系统内存不够用的时候将被杀掉;
⒊停止状态(Stopped):Activity在界面上完全不能被用户看到,也就是说这个Activity被其他Activity全部遮挡,但它依然保持所有状态和成员信息,只是它不再可见,它的窗口被隐藏;
⒋非活动状态(Killed):当系统内存需要被用在其他地方的时候,一个停止状态的Activity被杀掉。
如果一个Activity是Paused或者Stopped状态时可以被恢复,也可以被删除。一个被删除(杀掉)的Activity如果需要重新恢复就需要重启。
右图显示了Activity的重要状态转换,矩形框表明Activity在状态转换之间的回调接口,带有颜色的椭圆形表明Activity所处的状态。在右图中,Activity有三个关键的循环:
整个生命周期,从onCreate()开始到onDestroy()结束。Activity在onCreate()设置所有的“全局”状态,在onDestory()释放所有的资源。例如:某个Activity有一个在后台运行的线程,用于从网络下载数据,则该Activity可以在onCreate()中创建线程,在onDestory()中停止线程。
可见的生命周期,从onStart()开始到onStop()结束。在这段时间,可以看到Activity在屏幕上,尽管有可能不在前台,不能和用户交互。在这两个接口之间,需要保持显示给用户的UI数据和资源等,例如:可以在onStart中注册一个Intent Receiver来监听数据变化导致UI的变动,当不再需要显示时候,可以在onStop()中注销它。onStart(),onStop()都可以被多次调用,因为Activity随时可以在可见和隐藏之间转换。
前台的生命周期,从onResume()开始到onPause()结束。在这段时间里,该Activity处于所有 Activity的最前面,和用户进行交互。Activity可以经常在resumed和paused状态之间切换,例如:当设备准备休眠时,当一个Activity处理结果被分发时,当一个新的Intent被分发时。
Activity的整个生命周期都定义在下面的接口方法中,所有方法都可以被重载。所有的Activity都需要实现 onCreate()去初始化设置,大部分Activity需要实现onPause()去提交更改过的数据,当前大部分的Activity也需要实现onFreeze()接口,以便恢复在onCreate()里面设置的状态。