進(jìn)程
默認(rèn)情況下,同一個(gè)APP的所有組件應(yīng)該運(yùn)行在同一個(gè)進(jìn)程下晨缴。然而稚晚,如果我們有特殊需求的話可以在manifest文件中修改組件運(yùn)行的進(jìn)程。
- manifest為四大組件都提供了android:process屬性近尚,這個(gè)屬性指定了某個(gè)組件應(yīng)該在哪個(gè)進(jìn)程上運(yùn)行。通過設(shè)置這個(gè)屬性我們可以讓所有進(jìn)程運(yùn)行在同一個(gè)進(jìn)程中或者某些組件在一個(gè)進(jìn)程而其他的在另外一個(gè)進(jìn)程场勤。也可以讓不同APP運(yùn)行在同一個(gè)進(jìn)程中戈锻。
- manifest文件的application節(jié)點(diǎn)也提供了android:process屬性,此時(shí)設(shè)置的是這個(gè)APP的所有組件運(yùn)行的進(jìn)程和媳。
- Android會在某些特殊情況下殺死進(jìn)程格遭,譬如說內(nèi)存不足的情況下其他直接服務(wù)于用戶的進(jìn)程請求內(nèi)存時(shí)。進(jìn)程被殺死時(shí)進(jìn)程中所有運(yùn)行的組件也被銷毀留瞳。當(dāng)用戶再次回到這些組件時(shí)會重新啟動(dòng)一個(gè)進(jìn)程拒迅。
線程
當(dāng)一個(gè)APP啟動(dòng)時(shí),系統(tǒng)會為APP創(chuàng)建一個(gè)執(zhí)行線程(稱為主線程)。這個(gè)線程被用來為UI分發(fā)事件坪它,包括繪制事件骤竹。因此主線程也叫做UI線程。然而往毡,在某些特殊情況下蒙揣,主線程可能不是UI線程。
系統(tǒng)不會為每一個(gè)組件都創(chuàng)建一個(gè)單獨(dú)的線程开瞭。所有運(yùn)行在同一個(gè)進(jìn)程中的組件都在UI線程中實(shí)例化懒震,所有的UI操作都在主線程中進(jìn)行。所以在主線程中不能執(zhí)行類似網(wǎng)絡(luò)請求和數(shù)據(jù)庫操作等長時(shí)間的操作嗤详,否則系統(tǒng)會卡住并且如果卡住超過5秒便會彈出ANR對話框个扰。
因此有兩條十分重要的原則:
- 永遠(yuǎn)不要阻塞UI線程。
- 必須在UI線程中操作View葱色。