转自:http://blog.csdn.net/spencer_hale/article/details/54968092android
1.怎样用多进程数据库
Android多进程概念:通常状况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。咱们知道进程是系统分配资源和调度的基本单位,因此每一个进程都有本身独立的多线程
资源和内存空间,别的进程是不能任意访问其余进程的内存和资源的。架构
如何让本身的应用拥有多个进程:并发
四大组件在AndroidManifest文件中注册的时候,有个属性android:process这里能够指定组件的所处的进程。ide
默认就是应用的主进程。指定为别的进程以后,系统在启动这个组件的时候,就先建立(若是还没建立的话)这个进程,而后再建立该组件。打印出它的进程名称:重this
载Application类的onCreate方法便可。.net
设置android:process属性,要注意:若是是android:process=”:deamon”,以:开头的名字,表示这是一个应用程序的私有进程,不然它是一个全局进程。私有进程的进程名称是线程
会在冒号前自动加上包名,而全局进程则不会。通常咱们都是有私有进程,不多使用全局进程。调试
2.用多进程的好处
好处:
(1)分担主进程的内存压力。
当应用越作越大,内存愈来愈多,将一些独立的组件放到不一样的进程,它就不占用主进程的内存空间了。固然还有其余好处,有心人会发现
(2)使应用常驻后台,防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就从新启动它。
Android后台进程里有不少应用是多个进程的,由于它们要常驻后台,特别是即时通信或者社交应用,不过如今多进程已经被用烂了。
典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者作一些耗时的事情,或者开机启动这个进程,而后作监听等。
#坏处:消耗用户的电量。
多占用了系统的空间,若全部应用都这样占用,系统内存很容易占满而致使卡顿。
应用程序架构会变得复杂,由于要处理多进程之间的通讯。这里又是另一个问题了。
3.多进程的缺陷
进程间的内存空间是不可见的。开启多进程后,会引起如下问题:
1)Application的屡次重建。
2)静态成员的失效。
3)文件共享问题。
4)断点调试问题。
4.解决方法
1)针对Application的屡次重建:
在Application的onCreate中获取进程Id来判断不一样进程,而后作不一样的事情。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//获取进程Id
int pid = android.os.Process.myPid();
Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根据进程id获取进程名称
String pName = getProcessName(this,pid);
if("com.xyy.processtest".equals(pName)){
//处理该进程的业务
}
}
}
public String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager)
cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
2)针对静态成员的失效:
使用Intent或者aidl等进程通信方式传递内容,不能用静态或单例模式。
3)针对文件共享问题:
多进程状况下会出现两个进程在同一时刻访问同一个数据库文件的状况。这就可能形成资源的竞争访问,致使诸如数据库损坏、数据丢失等。在多线程的状况下咱们有锁机制控制资源的共享,可是在多进程中比较难,虽然有文件锁、排队等机制,可是在Android里很难实现。解决办法就是多进程的时候不并发访问同一个文件,好比子进程涉及到操做数据库,就能够考虑调用主进程进行数据库的操做。
4)针对断点调试问题:
调试就是跟踪程序运行过程当中的堆栈信息,因为每一个进程都有本身独立的内存空间和各自的堆栈,没法实如今不一样的进程间调试。所以要改成同一进程:调试时去掉AndroidManifest.xml中android:process标签,这样保证调试状态下是在同一进程中,堆栈信息是连贯的。待调试完成后,再将标签复原。