初学 Android
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核心)
Android像是一种 software stack