通过给四大组件指定android:process属性,我们便可以轻易的开启多线程。但是会带来一些影响。
正常情况下在Android中多进程是指一个应用中存在多个进程的情况。
Android系统会为每个应用分配一个唯一的UID,UID相同的应用才能共享数据。两个应用通过ShareUID跑在同一个进程中是有要求的,需要这两个应用具有相同的ShareUID并且签名相同才可以。在这种情况下他们可以互相访问对方的私有数据。
Android为每个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,就会导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
在一个进程中修改值只会影响当前进程,对其他进程不会造成影响,比如在活动1中修改了一个静态成员变量000,在活动2中,静态成员变量000却没有发生改变。
所有运行在不同进程中的四大组件,只要他们之间需要通过内存来共享数据,都会共享失败,这也是多进程所带来的主要影响。
使用多进程也会带来其他问题:
(1)静态成员和单列模式完全失效。
(2)线程同步机制完全失效。
:既然都不是一块内存了,那么不管是锁对象还是锁全局类都无法保证线程同步,因为不同进程锁的不是同一个对象。
(3)SharedPreference的可靠性下降。
:SharedPreferences不支持两个进程同时去执行写操作,否则会导致一定几率数据丢失,这是因为SharePreference底层是通过读写XML文件来实现的,并发写显然是可能出问题的。
(4)Application会多次创建。
:当一个组件跑在一个新的进程中的时候,由于系统要在创建新的进程同时分配独立的虚拟机,所以这个过程就是启动一个应用的过程。因此,相当于系统又把这个应用重新启动了一遍,既然重启,那么自然会创建新的Application。这个问题其实可以这么理解,运行在同一个进程中的组件是属于同一个虚拟机和同一个Application的,同理,运行在不同进程中的组件是属于两个虚拟机和Application的。
在多进程模式中,不同进程的组件确实会拥有独立的虚拟机、Application以及内存空间,这会给实际开发带来很多困扰,是尤其需要注意的,或者我们也可以理解成同一个应用间的多进程:它就相当于两个不同的应用采用了SharedUID的模式,这样能够更加直接理解多线程的本质。