【Android】多进程访问数据库SQLite问题

标签:
android多进程共享数据oncreate多次执行 |
分类: Android |
一般来说,一个APP默认只有一个进程,进程名称就是它的包名,我们可以通过DDMS里面的Devices视图中看到手机运行的进程,如下图所示:
http://s8/mw690/001ICmKvzy732ghbhK727&690
当然,在一些项目中,可能存在着一个APP有多个进程的情况。如上面的“com.instagram.android”和“com.instragram.android.mqtt”其实就是Instragram的两个不同的进程。两者之间的通讯就属于跨进程通讯了。
多进程的有很多好处,
1)可以获得更多内存。进程是系统分配资源和调度的基本单位,进程越多得到的资源就越多。
2)一个Service如果处于一个独立的进程中,那么即使这个Service崩溃掉,主进程都不受影响。如果主进程崩溃掉,Service进程也不受影响。http://stackoverflow.com/questions/4658511/android-how-to-decide-whether-to-run-a-service-in-a-separate-process
多进程的实现方式,一般是在AndroidManefest.xml中声明组件的时候,通过“android:process”标签来指定组件在哪个进程中运行,如下:
<service
android:name="com.facebook.rti.push.service.FbnsService"
android:label="@string/app_name"
android:process=":mqtt">
</service>
如果“android:process”的值不是“:”开头,则系统里有同样名字的进程的话,会放到已存在的同名进程里运行,这样能减小消耗。如果“android:process”的值是以“:”开头,则启动一个指定名字的进程。
public static String getProcessName(Context context, int pid){
ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List runningApps = am.getRunningAppProcesses();
if (runningApps != null && !runningApps.isEmpty()) {
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
}
return null;
}
@Override
publicvoid onCreate(){
String processName = getProcessName(this, android.os.Process.myPid());
(processName if != null) {
boolean defaultProcess = processName.equals(getPackageName());
(defaultProcess) if {
initMainProcess();
} else if (processName.contains(":mqtt")){
//TODO-处理mqtt进程的初始化
}
}
}