一般情況下上岗,一個(gè)應(yīng)用開啟一個(gè)進(jìn)程随橘,application會被執(zhí)行一次,如果涉及多開進(jìn)程聚假,那情況就不同了块蚌,application就會被執(zhí)行多次,下面筆者根據(jù)這問題對應(yīng)用開啟多進(jìn)程的進(jìn)行分析:
android:process
說到Android進(jìn)程膘格,我們就得了解android:process這個(gè)屬性峭范,這個(gè)屬性有什么作用?我們就來看看:
??在Android的幫助文檔中我們可以了解到瘪贱,一般情況下一個(gè)服務(wù)沒有自己獨(dú)立的進(jìn)程纱控,它一般是作為一個(gè)線程運(yùn)行于它所在的應(yīng)用的進(jìn)程中。但是也有例外菜秦,Android聲明文件中的android:process屬性卻可以為任意組件包括應(yīng)用指定進(jìn)程甜害,換句話說,通過在聲明文件中設(shè)置android:process屬性,我們可以讓組件(例如Activity, Service等)和應(yīng)用(Application)創(chuàng)建并運(yùn)行于我們指定的進(jìn)程中球昨。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soubw.prodemo" >//包名
<activity android:name=".LoginActivity"
android:process=":login"/>//為activity開啟一個(gè)進(jìn)程
上面就是為登錄的Activity開啟一個(gè)叫l(wèi)ogin進(jìn)程尔店,只不過這個(gè)進(jìn)程是在以應(yīng)用默認(rèn)的包名下開啟的進(jìn)程,叫com.soubw.prodemo:login主慰,在屬性中值為什么以冒號開頭呢嚣州,因?yàn)椤?’這個(gè)前綴將把這個(gè)名字附加到你的包所運(yùn)行的標(biāo)準(zhǔn)進(jìn)程名字的后面作為新的進(jìn)程名稱(只不過這個(gè)login進(jìn)程為該應(yīng)用私用,其他應(yīng)用不能共享)共螺,上面的例子很好的講述這點(diǎn)该肴。
還有一種是不以冒號開頭而以小寫字母開頭,我們也舉個(gè)例子來說明:
<activity android:name=".RegisterActivity"
android:process="com.wxj.register"/>//為activity開啟一個(gè)不同于應(yīng)用包名的進(jìn)程
這個(gè)進(jìn)程將以com.wxj.register這個(gè)名字命名的運(yùn)行于全局的進(jìn)程中(該進(jìn)程就可以讓不同應(yīng)用中的各種組件可以共享一個(gè)進(jìn)程)藐不。
解決多進(jìn)程次執(zhí)行多次onCreate()
如果應(yīng)用中采用多進(jìn)程方式匀哄,oncreate方法會執(zhí)行多次秦效,根據(jù)不同的進(jìn)程名字進(jìn)行不同的初始化。應(yīng)用判斷進(jìn)程名字進(jìn)行單獨(dú)初始化拱雏,這要就可以利用進(jìn)程名根據(jù)具體需求棉安,應(yīng)該加載哪些資源底扳,執(zhí)行哪些具體邏輯了铸抑。
@Override
public void onCreate() {
super.onCreate();
String processName = getProcessName(this);
if (processName!= null) {
if(processName.equals("com.soubw.prodemo")){
//初始化com.soubw.prodemo以包名為進(jìn)程名,項(xiàng)目默認(rèn)的進(jìn)程
} else if(processName.equals("com.soubw.prodemo:login")){
//初始化com.soubw.prodemo:login
}else if(processName.equals("com.wxj.register")){
//初始化com.wxj.register
}else{
}
}
}
private String getProcessName(Context context) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) {
if (proInfo.pid == android.os.Process.myPid()) {
if (proInfo.processName != null) {
return proInfo.processName;
}
}
}
return null;
}