進(jìn)程(Processes)和任務(wù)(tasks)
所有的對(duì)象都需要內(nèi)存和一個(gè)虛擬機(jī)來(lái)存活。一個(gè)process就是OS為了你的應(yīng)用程序存活而開辟的空間,它也是用來(lái)讓你的應(yīng)用程序運(yùn)行起來(lái)的必要條件。
進(jìn)程可能擁有資源文件,這些資源文件都由OS像管理內(nèi)存一樣來(lái)管理。也可能擁有網(wǎng)絡(luò)socket或者可以打開的文件。
進(jìn)程也必須包含至少一個(gè)運(yùn)行線程。在Android上,你的進(jìn)程肯定會(huì)包含一個(gè)在運(yùn)行的Dalvik 虛擬機(jī)
然而有一些隱藏的例外情況,一般來(lái)說(shuō)每一個(gè)應(yīng)用程序組件都會(huì)與一個(gè)進(jìn)程相連。你的應(yīng)用程序被自己的進(jìn)程創(chuàng)建,這是在應(yīng)用中所有的組件默認(rèn)的運(yùn)行方式。但你也可以安排單一某一個(gè)組件到另一個(gè)進(jìn)程中,但是我們推薦使用默認(rèn)運(yùn)行方式。如果你需要一些組件運(yùn)行在另一個(gè)進(jìn)程,你可以使用多線程來(lái)達(dá)到相同目的。這種方式比使用多進(jìn)程更簡(jiǎn)單明了。
每一個(gè)activity的實(shí)例都存活在一個(gè)確定的進(jìn)程和一個(gè)確定的任務(wù)(task)中,這是唯一的相似之處。task只包含若干個(gè)activity,經(jīng)常包含來(lái)自不同應(yīng)用程序的activity。然而,進(jìn)程包含所有應(yīng)用程序的運(yùn)行代碼和對(duì)象。
進(jìn)程和task比較容易弄混,因?yàn)樗麄儍烧咴诠δ苌嫌兄丿B的部分,它們兩個(gè)都是根據(jù)應(yīng)用程序的名字來(lái)引用。例如,在書中的例子中當(dāng)從NerdLauncher中啟動(dòng)CriminalIntent,操作系統(tǒng)會(huì)創(chuàng)建一個(gè)CriminalIntent進(jìn)程和一個(gè)新的task。在任務(wù)管理器中,這個(gè)task是被標(biāo)簽為CriminalIntent的。
一個(gè)activity存活的task可能跟它存活的進(jìn)程是不同的。當(dāng)你從CriminalIntent啟動(dòng)聯(lián)系人應(yīng)用程序來(lái)選擇一個(gè)人名。這樣便進(jìn)入了CriminalIntent的task。然而,它是運(yùn)行在聯(lián)系人應(yīng)用程序的進(jìn)程中的。
也就是說(shuō)當(dāng)你按下手機(jī)的返回鍵來(lái)在不同activity之間導(dǎo)航,切換到哪個(gè)進(jìn)程是不知道的。
可以創(chuàng)建不同的task,也可以在之間切換,但是killing tasks或者替換掉Android默認(rèn)的taks管理器是不可能的。當(dāng)你長(zhǎng)按Home鍵,會(huì)出現(xiàn)默認(rèn)的taks管理器,然而tasks是不能殺死的。相反的,進(jìn)程(process)是可以殺死的,所以那些聲明自己可以殺死任務(wù)的應(yīng)用其實(shí)是殺死了進(jìn)程而已。