Android Process Lifecycle
Android系统内存不足时 , 就需要把旧的或不需要用的应用 程序 移除. 如同之前的 Activity 生命 周期 所介绍, 这个移除的决定是由应用 程序 所处的状态来判断. 一般来说,当需要移除应用 程序 时, 系统将会做排序 , 然后从最不重要的开始移除 , 以下是移除时的考量顺序 :
1. 最早被移除的是 Empty Process( 空行程 ):
Empty process 是指那些没有跟 Activity 绑定 , 也没有跟任何的应用 程序组件 (比如 Service 或 IntentReceiver) 绑定在一起的 process, 这些空行程一定是最早被系统考虑移除的 .
2. 第 2 顺位考虑被移除的是 Background Activity.
Background Activity指这个 activity 是无法被使用者看到的的情况 , 表示 Activity 已处于 stop 的状态 , 系统移除这些 Activity 是安全的 . 通常有多个 Background Activity 同时运行 , 这些 Activity 被存放在一个 LRU (least recent used) list 中 , 系统可以根据 LRU list 判断哪些 Activity 可以被移除 , 哪一个应该是最先被移除的 .
3. 第 3 顺位被移除的是 Service Process.
在 Android 应用 程序 裡, 有一种没有 UI 的类别 (android.app.Service), 称之为 Service. Service Process 通常是由 startService() 方式启动 . 简单来说, Service 属于 background( 背景 ) 程序 , 透过背景程序 , 我们可以製作一些不需要 UI 的功能 , 例如 : 在背景拨放音乐 , 上传或下载文件等 . 系统通常会保护它 , 除非真的没有 内存 可用.
4. 接着轮到 Visible Activity / Visible Process:
Visible Process是一个可被 Visible 的 , 但是没有显示在最上端 (onPause 被使用时 ). 举例来说 , 当一个新的对话框 Activity 出现时 , 原来的 Activity 仍然 visible, 仍然被系统认为是重要的 , 通常不会被移除 . 但若不得不移除时 , 由于属于 Paused 状态 , 相对来说 , 它已经处于一个比较安全的位置 .
5. 最后被移除的是 Foreground Activity:
Foreground是一个在 屏幕 最上端与使用者做互动的Activity, 它的优先权最高 . 原则上会是最后一个被移除的 程序 , 除非这个 Activity 所需要的 内存 大小已经超出系统所能给的. 系统之所以会移除这些程序 , 是为了不让使用者 页面 停止回应.
由于Android 应用 程序 的lifecycle 并不是由 程序 本身直接控制的, 而是由系统平台进行管理 . 所以对于开发者而言 , 许要了解不同 组件 Activity, Serivce 和 IntentReceiveer 的 Lifecycle. 要切记 : 如果 组件 使用不当, 虽然正在进行重要的 Process, 仍有可能被系统主动移除 .
Android Activity生命 周期 简介
前面有提到何谓Activity: 最简单的就是把 Activity 看成一个 User Interface Program. 它会提供使用者一个互动式的 页面 功能. 当然一个 activity 通常不只一个 UI, 所有的 Activity 在系统里由 Activity stack 所管理 , 当一个新的 Activity 被执行后,它将会被放置到 stack 的最顶端,并且变成 "running activity", 而之前的 Activity 原则上还是存在 stack 中,但不会是在 foreground( 前景 ) 的情况 .
一个Activity 基本上有四个状态 Active, Paused, Stopped, Dead:
Active (活动 ):
Active状态是使用者启动 Application 或 Activity 后, Activity 在运行中的状态 .
在 Android 平台上 , 一个时刻只会有一个 Activity 处于 Active 或 Running 状态。其他的 Activity 都处于未 Dead, Stopped 或是 Paused 的状态 .
Paused (暂停 )
Paused状态是当 Activity 暂时暗下来 , 退到背景画面的状态 . 例如当电话来时 , 原本运行的 Activity 退到背景画面 . 新出现的 页面组件 盖住了原来的 Activity 画面 .
Activity 处在 Paused 状态时 , 使用者无法与原来的 Activity 互动 .
Stopped (停止 )
Stopped状态是有其他 Activity 正在执行 , 而这个 Activity 已经离开 屏幕 , 不再动作的状态 .
透过长按Home 键 , 可以叫出所有处于 Stopped 状态的 Application List( 应用 程序 列表).
在Stopped 状态的 Activity ,还可以透过 Notification 来唤醒。以后再说明 Notification.
Dead/Inactive (已回收或未启动 )
Dead状态是 Activity 尚未被启动 , 已经被手动终止 , 或已经被系统回收的状态 .
要手动终止 Activity, 可以在 程序 中呼叫 finish 函式 .
如果是被系统回收, 可能是因为 内存 不足, 系统根据 内存 不足时的回收规则, 将处于 Stopped 状态的 Activity 所佔用的 内存 回收.
有三个主要 lifetime :
1. Entire lifetime: 一个 Activity 的 Entire lifetime 是由 onCreate() 开始 , 一直到 onDestroy() 结束 .
一个Activity 可以把所有的资源设定写在 onCreate 中 , 一直到 onDestroy() 时再释放出来 .
2. Visible lifetime: 一个 Activity 的 Visible lifetime 是指在 onStart() 到 onStop() 之间 .
在这段时间内,使用者可以在 屏幕 上看见Activity, 要注意这个 "Visible" 是个形容 , Activity 不见得一定在 foreground( 前景 ) 跟使用者直接互动 .
3. Foreground lifetime: 一个 Foreground lifetime 指 onResume() 到 onPause() 之间 . 这个时期的 Activity 是在其他的 Activity 的前面 , 且可以直接跟使用者进行互动 . 所以这段时期指的就是图中的 Activity is running.
简单的总结几个动作:
onCreate()用来做 程序 的初使化动作;
onDestory()通常都拿来把 onCreate() 时的资料做释放的动作 ;
onPause()时把需要保存的资料保存 ;
onResume()把保存的资料拿回来使用 .
再归纳一般 Android Application 遵循的动作流程:
一般启动:
onCreate -> onStart -> onResume
启动一个 Activity 的基本流程是 : 分配资源给这个 Activity(onCreate), 然后将 Activity 内容显示到 屏幕 上(onStart), 在一切就绪后 , 取得 屏幕 的控制权(onResume), 使用者可以开始使用这个 程序 。
呼叫另一个 Activity:
onPause(1) -> onCreate(2) -> onStart(2) - onResume(2) -> onStop(1)
先冻结原本的 Activity, 再交出直接存取 屏幕 能力(onPause ) 的过程 . 直到 Activity 2 完成一般启动流程后 , Activity 1 才会被停止 .
回复原 Activity
onPause(2) -> onRestart(1) -> onStart(1) -> onResume(1) -> onStop(2) -> onDestroy(2)
按 Back 键可以回到原本的 Activity 。
退出/ 结束
onPause -> onStop -> onDestroy
如果 程序 中有直接呼叫 finish 函式来关闭 Activity 的话 , 系统会暂停 (Pause), 停止 (Stop) 然后销毁 (Destroy) 。
回收后再启动
onCreate -> onStart -> onResume
被回收掉的 Activity 一旦又重新被呼叫时,会像一般启动一样再次呼叫 Activity 的 onCreate 函式 .
几个 Android 的名词观念
在真正进入 Android 程序 设计前,必须先了解以下几个名词观念。
1. Android Package (.apk):
包含应用 程序 本身,以及相关的资源档桉。将 apk 套件下载到 Android 手机后,即可安装至手机上。 Android Development Kit 可自动将 apk 套件下载至模拟器或实体手机。
记得前面我们在 Eclipse 中若要检视 HelloWorld 程序 时, 是利用 Package Explorer 来查看整个 程序 的结构的.
2. Task
Task 为 " 工作 " 的意思 , 可以看成 Application ( 应用 程序 )本身 . 也就是手机上的应用 程序 的图示,使用者可点击图示启动 task 。从开发者的角度来看
3. Process
Process 的定义上,指的是 " 执行中的 程序 ",在 Android 的 Application 环境中,代表低阶的执行 程序 ,属于 Kernel 部份。一个 package 的所有 程序 ,都是在一个 process 中执行。
在一般情况下, Android 应用 程序 都有一个自已的 Process. 在 Android 系统裡 , Process 的生命 周期 (life cycle) 并不是直接由 Android 应用 程序 本身来决定, 而是由系统来决定 .
Android 的 process 有五种类型: foreground process 、 visible process 、 service process 、 background process 与 empty process 。
4. Activity
Activity是 Android 开发中非常重要的一个基础类。就字面上来说 , Activity 就是 " 活动 " 的意思 . 可以简单的解释为 , Activity 是一个与使用者互动的物件 (object) 。
举例来说:一个EMail 程序 ,就可能包含三个activity: 有列出邮件的 Activity 1, 显示邮件内容的 activity 2, 及 撰写邮件 activity3.
Activity 大概可以分成四种生命状态 :
一个Activity 在 屏幕 的最上层时( 堆叠的最顶端 ) ,它就是属于 active 或 running 的状态
如果一个Activity 失去 focus( 焦点 ) 但还看得到它的画面 ( 例如 : 一个 Activity 画面是被盖掉部份画面或一个半透明的情况 ), 这个 Activity 则处在 paused 的状态。这个失去焦点的 Activity 它还是完全活着的 , 并没有消失。 ( 活着的意思是指, Activity 本身所有的状态及资料都还是存在,与管理 程序 保持连繫). 但这种 paused 的 activity, 会在某些情况下消失 , 例如当系统的 内存 不够用时, 系统会自动判断 , 把不重要的 activity 移除 .
如果一个Activity 被其它的 Activity 完全的遮住时 , 这个被遮的 Activity 处于 stop 的状态 , 但它仍然保有全部的状态及资料 . 由于它已不被使用者看见,所以它的画面是被隐藏起来的 , 当系统 内存 不足时,这种stop 状态的 activity 是最先被系统考虑移除以释放 内存 .
当一个Activity 处于 pause 或 stop 的状态时 , 系统可以要求 Activity 结束 (finish) 或移除 (kill) 它 . 当它需要再度呈现在使用者面前时 , 它必需要能完整的重新启动 (restart) 及回复 (resume) 先前的状态。
5. View
简单来说,android.app.View 类别就是手机的 User Interface. View 负责绘製 UI 与 event ( 处理事件 ). Android 利用 View 建立所谓的 Widgets( 组件 ), 利用 Widget 就可以製作互动式的使用者介 页面 interactive GUI).
认识 Android 程序 架构 (2)
在进入 程序 内容分析之前, 先了解一下 Android 软件 架构
在Android 架构,总共是由 5 个部份来组成。分别是:
(1)Applications (应用 程序 )
(2)Application Framework (应用 程序 架构)
(3)Libraries (函式库 )
(4)Android Runtime (Android执行环境 )
(5)Linux Kernel (Linux核心 )
源地址:http://peng4602.iteye.com/blog/650160