進(jìn)行對(duì)Android應(yīng)用程序全解析
Android應(yīng)用程序里提供的Eclipse插件使得運(yùn)行我們的程序非常簡(jiǎn)單。選擇Run > Open Run Dialog菜單;你會(huì)看到一個(gè)對(duì)話框,在這個(gè)對(duì)話框中就像配置J2ME運(yùn)行環(huán)境一下,配置一個(gè)Luncher。
大功告成!點(diǎn)擊run按鈕,Androi模擬器將運(yùn)行。當(dāng)模擬器啟動(dòng)完成你將看到你的程序。到這里我們就完成了!按照正常思路,一定會(huì)想,程序入口點(diǎn)在哪里呢?為什么會(huì)從這個(gè)Activity 啟動(dòng)呢?
現(xiàn)在用我們自己的最容易理解的方式來(lái)表述:這是因?yàn)楫?dāng)啟動(dòng)這個(gè)程序的映像文件時(shí),會(huì)發(fā)送一個(gè)事件對(duì)象Intent, 帶有MAIN的行為屬性,而自動(dòng)生成的代碼及文件, 有一個(gè)AndroidManifest.xml會(huì)為HelloWorld這個(gè)Activity 配置一個(gè)事件過(guò)濾器,表明實(shí)現(xiàn)了MAIN action,LAUNCHER category的入口點(diǎn)行為。請(qǐng)注意其中的幾行:
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- TextView tv = new TextView(this);
- tv.setText("Hello, Android");
- setContentView(tv);
- }
在多數(shù)情況下, 每個(gè)Android應(yīng)用程序運(yùn)行在自己的Linux進(jìn)程中. 當(dāng)一個(gè)應(yīng)用的某段code需要運(yùn)行的時(shí)候這個(gè)進(jìn)程將會(huì)被創(chuàng)建, 直到不再需要該應(yīng)用或系統(tǒng)要為其他的應(yīng)用釋放內(nèi)存的時(shí)候才停止.
一個(gè)非常重要且少有的特性是, 應(yīng)用進(jìn)程的存活時(shí)間不是由這個(gè)應(yīng)用直接控制的. 而是由系統(tǒng)決定的, 系統(tǒng)會(huì)根據(jù)每個(gè)已知的正在運(yùn)行的應(yīng)用情況來(lái)定奪, 包括, 該應(yīng)用對(duì)用戶的重要性和系統(tǒng)全部可用內(nèi)存.
對(duì)于開(kāi)發(fā)人員來(lái)講, 了解每個(gè)應(yīng)用組件(尤其是, Activity, Service, 和IntentReceiver)對(duì)于應(yīng)用進(jìn)程存活時(shí)間的影響是非常重要的. 如果沒(méi)有正確使用, 可能會(huì)導(dǎo)致應(yīng)用進(jìn)程在處理重要工作的時(shí)候被系統(tǒng)殺掉.
在對(duì)應(yīng)用進(jìn)程生命周期的理解中, 一個(gè)典型的錯(cuò)誤就是當(dāng)一個(gè)IntentReceiver 接收到Intent 之后, 會(huì)在自己的onReceiveIntent()方法中開(kāi)起一個(gè)線程。而后return這個(gè)方法. 一旦這個(gè)方法return, 系統(tǒng)會(huì)認(rèn)為這個(gè)IntentReceiver 不在處于活躍狀態(tài), 也就認(rèn)為他的宿主進(jìn)程不再需要(除非還包有其他活躍的應(yīng)用組件)。
以至于當(dāng)系統(tǒng)需要回收內(nèi)存的時(shí)候會(huì)隨時(shí)釋kill掉這個(gè)進(jìn)程, 中止其中的子線程. 解決這個(gè)問(wèn)題的辦法是在IntentReceiver中啟動(dòng)一個(gè)Service, 這樣系統(tǒng)會(huì)知道在這個(gè)進(jìn)程中還有活躍的任務(wù)需要完成. 為了決定在內(nèi)存較低的時(shí)候殺掉哪個(gè)進(jìn)程, Android應(yīng)用程序會(huì)根據(jù)運(yùn)行在這些進(jìn)程內(nèi)的組件及他們的狀態(tài)把進(jìn)程劃分成一個(gè)"重要程度層次". 其重要的程度按以下規(guī)則排序:
前端進(jìn)程可以是一個(gè)持有運(yùn)行在屏幕最前端并與用戶交互的Activity的進(jìn)程(onResume方法被調(diào)用時(shí)),也可以是持有一個(gè)正在運(yùn)行的IntentReceiver(也就是說(shuō)他正在執(zhí)行自己的onReceiveIntent方法)的進(jìn)程。
在系統(tǒng)中, 只會(huì)有少數(shù)這樣的進(jìn)程, 并且除非內(nèi)存已經(jīng)低到不夠這些進(jìn)程運(yùn)行, 否則系統(tǒng)不會(huì)主動(dòng)殺掉這些進(jìn)程. 這時(shí), 設(shè)備通常已經(jīng)達(dá)到了需要內(nèi)存整理的狀態(tài), 所以殺掉這些進(jìn)程是為了不讓用戶界面停止響應(yīng)。