一般情况下,一个应用开启一个进程,application会被执行一次,如果涉及多开进程,那情况就不同了,application就会被执行多次,下面笔者根据这问题对应用开启多进程的进行分析:
android:process
说到Android进程,我们就得了解android:process这个属性,这个属性有什么作用?我们就来看看:
在Android的帮助文档中我们可以了解到,一般情况下一个服务没有自己独立的进程,它一般是作为一个线程运行于它所在的应用的进程中。但是也有例外,Android声明文件中的android:process属性却可以为任意组件包括应用指定进程,换句话说,通过在声明文件中设置android:process属性,我们可以让组件(例如Activity, Service等)和应用(Application)创建并运行于我们指定的进程中。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.soubw.prodemo" >//包名
<activity android:name=".LoginActivity"
android:process=":login"/>//为activity开启一个进程
上面就是为登录的Activity开启一个叫login进程,只不过这个进程是在以应用默认的包名下开启的进程,叫com.soubw.prodemo:login,在属性中值为什么以冒号开头呢,因为’:’这个前缀将把这个名字附加到你的包所运行的标准进程名字的后面作为新的进程名称(只不过这个login进程为该应用私用,其他应用不能共享),上面的例子很好的讲述这点。
还有一种是不以冒号开头而以小写字母开头,我们也举个例子来说明:
<activity android:name=".RegisterActivity"
android:process="com.wxj.register"/>//为activity开启一个不同于应用包名的进程
这个进程将以com.wxj.register这个名字命名的运行于全局的进程中(该进程就可以让不同应用中的各种组件可以共享一个进程)。
解决多进程次执行多次onCreate()
如果应用中采用多进程方式,oncreate方法会执行多次,根据不同的进程名字进行不同的初始化。应用判断进程名字进行单独初始化,这要就可以利用进程名根据具体需求,应该加载哪些资源,执行哪些具体逻辑了。
@Override
public void onCreate() {
super.onCreate();
String processName = getProcessName(this);
if (processName!= null) {
if(processName.equals("com.soubw.prodemo")){
//初始化com.soubw.prodemo以包名为进程名,项目默认的进程
} 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;
}