在Android开发中,我们可能会使用单独的进程来做一些事情,比如推送服务,心跳服务等,这些不需要主应用启动,只需要一个独立的进程即可。这时候我们一般都会采用启动一个后台Service,这个Service运行在一个独立的进程中,比如在Androidmainfest.xml中配置Service的android:process=”:push”指定该Service运行在:push进程中。
一般情况下这样做是没有任何问题的,但是如果你在你的Application的onCreate方法里有对数据库的操作,或者该Service里有对数据库的操作,就会有可能会有两个进程同时操作一个数据库的情况,一个是你的主应用的进程,进程名为你的包名例如org.flysnow;一个是你的Service所在的进程,进程名为你的包名+”:push”,即org.flysnow:push。这两个进程可能在同一时间访问同一个数据,同一个配置文件等。这就可能造成资源的竞争访问,造成的问题就不可预料了,比如数据库损坏,数据丢失等。
多进程其实和多线程一样,并发访问的时候产生的问题很难预料,在多线程的时候我们有锁等机制控制资源的访问,但是在多进程中比较难,虽然有文件锁、排队等机制,但是在Android里很难实现,毕竟在Android里一个进程就是一个VM虚拟机,底层的东西控制不了,Java层又没有办法控制,所以在多进程中一定不要有并发增删改文件的操作。
解决问题的核心就是不并发访问同一个文件,多线程时就使用Lock机制;多进程的时候就避免进行数据库的访问,比如只做一些心跳、激活、消息抓取等操作,涉及到把消息存储到数据库,访问配置文件等操作还是调用主进程进程操作。还一个要注意的就是Application的oncreate方法里要避免多进程访问同一文件,因为没一个进程初始化都会执行该方法,可以在一些进程初始化的时候不需要文件操作的时候不要进行文件操作,比如在onCreate里获取当前的进程,不等于包名的就不进行文件的访问操作,获取进程可以使用android.os.Process.myUid()方法。