Android应用程序的Life Cycle

2008-04-06 00:24

一般情况下,每个Android程序运行在各自的linux进程中。当这个应用的某些代码需要执行时,进程就会被创建并且保持运行,直到该进程不再需要,而系统需要释放它所占用的内存给其他应用时,该进程才会停止。
      Android的一个重要特性就是应用程序进程的生命周期不是程序自己直接控制的,而是由系统,根据运行中的应用的一些特征来决定的,包括:这些应用对用户的重要性、系统的全部可用内存等。
对于开发者来说,理解程序的不同组件(特别是Activity、Service、Intent Receiver)如何影响程序进程是非常重要的。没有正确的使用那些组件会导致系统杀死正在执行重要工作的应用程序。
对一个进程生命周期的一个普遍存在的误区是当一个IntentReceiver在它的onReceiveIntent() 方法中接收到一个Intent时便启动一个子线程进行处理,然后onReceiveIntent() 方法便返回了。一旦这个方法返回,系统就会认为该IntentReceiver不再处于Active状态,因此它的宿主进程(除非宿主进程中还存在其它的应用组件)。这时系统有可能在需要内存的时候杀死这个进程和运行在其中的子线程。解决这个问题的办法是在IntentReceiver中开启一个Service,这样会使系统知道在这个进程中还有工作在执行。
为了决定哪些进程可以被停止,Android根据这些进程中的组件及其组件状态,把这些进程划分出一个“重要性层次”,顺序如下:
前端进程:一个指示用户正在做什么的进程。多数的程序会因为各种不同的原因使系统认为该进程处于“前端”的状态:
       1、它正在运行一个处在屏幕最上层的正在与用户交互的Activity(它的onResume()已被调用);
       2、它有一个IntentReceiver正在运行(它的IntentReceiver.onReceiveIntent()方法正在被执行);
       3、它有一个Service,该Service正在其回调方法中(Service.onCreate(), Service.onStart(), or Service.onDestroy())执行代码。
系统中类似的进程是很少的,只有当内存低到不足于支持这些进程的继续运行,才会将这些进程消毁。通常这时候,设备已经达到了需要进行内存整理的状态,为了保障用户界面不停止响应,只能消毁这些进程;
可视进程:该类进程拥有一个在屏幕上可以被用户见到的但不是显示在最前端的Activity(它的onPause()方法已被调用)。可能的情况是:一个以对话框形式显示在前端的Activity,而它后面的Activity依然可见。系统会认为这样的进程是非常重要的,除非为了保证前端进程能够正常运行,否则是不会被销毁的。
服务进程:持有一个通过startService()方法启动的Service的进程。尽管用户不会直接看到这样的进程,但是一般它们所做的是使用者所关注的事情(比如在后台播放MP3或者在后台网络上传下载数据等),所以除非是没有足够的内存保证前端及可视进程的运行系统才会销毁它们。
后台进程:持有一个用户当前状态下无法看到的Activity的进程(它的onStop()方法已被调用)。这些进程不会对用户体验产生直接影响。如果这些进程正确地完成了自己的生命周期(详细参考Activity类),系统会为了保证以上三种类型进程能正常运行,会随时消毁这种进程以释放内存。
空进程:不拥有任何活动的应用组件的进程。保留这些进程的唯一理由是,做为一个缓存,在它所属的应用的组件下一次需要时,缩短启动的时间。同样的,为了在这些缓存的空进程和底层的核心缓存之间平衡系统资源,系统会经常消毁这些空进程。

一个进程的重要级别可能会因它所依赖的进程而提高。举个例子,当进程A使用Context.BIND_AUTO_CREATE标记绑定了一个Service或者在B进程中使用一个ContentProvider时,那么B进程的重要级别不会低于A进程的级别。

更多相关文章

  1. 一看就会Android之分组列表组件ExpandableListView的使用
  2. Android架构组件-Navigation的使用(二)
  3. android 笔记 --- Android自动判断输入是电话,网址或者Email的方
  4. Android内存管理的原理--进程管理
  5. 学习Android自己的第一个应用
  6. Android、iPhone和Java三个平台一致的加密工具
  7. android 笔记 --- Android自动判断输入是电话,网址或者Email的方
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android帮助文档翻译——开发指南(十五)获
  2. 【android开发】解析xml文件①
  3. 桌面云的三种模式 VDI IDV VOI (笔记)
  4. Android imageview图片缩放实现
  5. 如何使用自己的makefile编译android ndk
  6. android Dependencies ,Private Libraries
  7. Android Layout的layout_height等属性为
  8. Android对Linux内核的改动你知道多少?
  9. 使用Android NDK中的独立toolchain来开发
  10. Android 网络请求详解