优点
- 分担主进程的内存压力。
当应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现
- 使应用常驻后台,防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。
Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。
典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。
坏处
- 消耗用户的电量。
- 多占用了系统的空间,若所有应用都这样占用,系统内存很容易占满而导致卡顿。
- 应用程序架构会变得复杂,因为要处理多进程之间的通信。这里又是另外一个问题了。
多进程的缺陷
进程间的内存空间是不可见的。开启多进程后,会引发以下问题:
1)Application的多次重建。
在Application的onCreate中获取进程Id来判断不同进程,然后做不同的事情。
2)静态成员的失效。
使用Intent或者aidl等进程通讯方式传递内容,不能用静态或单例模式。
3)文件共享问题。
多进程情况下会出现两个进程在同一时刻访问同一个数据库文件的情况。这就可能造成资源的竞争访问,导致诸如数据库损坏、数据丢失等。在多线程的情况下我们有锁机制控制资源的共享,但是在多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现。解决办法就是多进程的时候不并发访问同一个文件,比如子进程涉及到操作数据库,就可以考虑调用主进程进行数据库的操作。
4)断点调试问题。
调试就是跟踪程序运行过程中的堆栈信息,由于每个进程都有自己独立的内存空间和各自的堆栈,无法实现在不同的进程间调试。因此要改为同一进程:调试时去掉AndroidManifest.xml中android:process标签,这样保证调试状态下是在同一进程中,堆栈信息是连贯的。待调试完成后,再将标签复原。
网友评论