概念
首先,我們知道進(jìn)程是系統(tǒng)分配資源和調(diào)度的基本單位。每個(gè)進(jìn)程都有自己獨(dú)立的資源和內(nèi)存空間,別的進(jìn)程是不能隨意訪問(wèn)的。一般情況下,一個(gè)應(yīng)用默認(rèn)有一個(gè)(主)進(jìn)程,進(jìn)程名即包名。Android多進(jìn)程即一個(gè)應(yīng)用擁有多個(gè)進(jìn)程。那么如何讓?xiě)?yīng)用擁有多進(jìn)程呢?
android:process
實(shí)現(xiàn)多線(xiàn)程需依賴(lài)android:process
屬性,四大組件在manifest中注冊(cè)時(shí)設(shè)置這個(gè)屬性,標(biāo)記所屬進(jìn)程。兩種形式:
- 以
:
開(kāi)頭,私有進(jìn)程,無(wú)法跨應(yīng)用共用,進(jìn)程名稱(chēng):
前加上包名。 - 以小寫(xiě)字母開(kāi)頭,全局進(jìn)程,可被多個(gè)應(yīng)用共用,字符串即進(jìn)程名。
<service android:name=".MyService1" android:process=":remote"/>
<service android:name=".MyService2" android:process="remote"/>`
優(yōu)缺點(diǎn)
** 優(yōu)點(diǎn):**
- ** 分擔(dān)主進(jìn)程內(nèi)存壓力**。隨著應(yīng)用越來(lái)也大,內(nèi)存占用越來(lái)越大,可以將一些獨(dú)立的組件放到不同的進(jìn)程。
- ** 增加App可用內(nèi)存**。在Android中,默認(rèn)情況下系統(tǒng)會(huì)為每個(gè)App分配一定大小的內(nèi)存,比如從最早的16M到后面的32M或者48M等,具體的內(nèi)存大小取決于硬件和系統(tǒng)版本。但是這個(gè)限制是針對(duì)進(jìn)程的,所以多進(jìn)程可增加應(yīng)用可用內(nèi)存。
- ** 獨(dú)立于主進(jìn)程及進(jìn)程守護(hù)等**。
** 缺點(diǎn):**
- ** 數(shù)據(jù)共享問(wèn)題**。不同進(jìn)程之間內(nèi)存無(wú)法共享,通訊比較麻煩。
解決方式:使用AIDL、Intent、Messenger處理。 - ** 耗電量**。多占用內(nèi)存容易導(dǎo)致應(yīng)用卡頓,耗電量增加。
- ** Application 中 onCreate多次初始化**。每個(gè)進(jìn)程在創(chuàng)建的時(shí)候,都會(huì)執(zhí)行Application的onCreate進(jìn)行初始化,如果這時(shí)候沒(méi)有針對(duì)不同進(jìn)程處理,onCreate的初始化業(yè)務(wù)會(huì)被多次執(zhí)行,這是沒(méi)有必要的而且多次初始化容易引起問(wèn)題,所以需根據(jù)不同進(jìn)程初始化相應(yīng)的業(yè)務(wù)。
獲取進(jìn)程名稱(chēng)的方法
public static String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager mActivityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
public static String getProcessName() {
try {
File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
String processName = mBufferedReader.readLine().trim();
mBufferedReader.close();
return processName;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
兩種方法都行,第一種主流方法,第二種效率較高。
以上是一些總結(jié)記錄,供參考學(xué)習(xí)。