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核心 )

 

源地址:http://peng4602.iteye.com/blog/650160

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章