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