- 通过给四大组件在mainest.xml中增加android:process属性,可以轻松的开启多进程模式,但是这样也是暗藏杀机的。
- 开启多进程模式
-
- 正常情况下,android中多进程是指一个应用存在多个进程的情况,因此暂时忽略两个应用之间的通讯问题。
- 正常情况下,在一个应用中开启多进程只有上述说到的一个方法,也就是说我们无法给一个线程或实体类开启一个单独的进程。此外,还有一种非常规方法,通过JNI在native层fork一个进程。
代码示例如下:
如上,在清单文件中分别给第二 第三个开启了两个进程,在启动应用后,分别点击进入第二 第三个页面时,会发现开启了如下三个进程(包名为默认进程),分别为
-
- 其中第二个和第三个进程名开启规则不一样,其进程名也是有区别的,主要有这么几点区别:
-
- “:”表示在当前的进程名前面附加上当前的包名,这是一种简写。
- 第三种为完整的命名方式,不会附加包名信息
- “:”表示为当前应用的私有进程,其他应用的组件不可以和他跑在同一进程中。而第三种,则属于全局进程,其他应用可以通过shareUid的形式和他跑在同一个进程中
- android系统会为每一个应用分配一个唯一的uid,具有相同uid的应用才可以共享数据。两个应用通过shareuid跑在同一个进程中也是有条件的,第一uid相同,第二签名相同。这样才可以共享data目录 组件信息 共享内存。
2.多进程模式的运行机制
-
- 使用多进程会造成如下问题
-
- 静态成员和单例模式失效
- 线程同步机制失效
- SP的可靠性下降
-
- sp不支持多个进程同时进行数据的读写,否则会造成一定几率数据丢失。sp本质上通过读写xml实现的,如果并发的话,可能是有问题的。
- Application会被创建多次
-
- 在组件跑在新的进程中的时候,系统在创建进程的同时会分配新的虚拟机和内存地址,相当于启动应用的过程,所以系统会创建新的application
- 运行在同一进程的组件属于同一个application和虚拟机,运行在不同进行的组件是属于不同的虚拟机和application的。
- 出现原因如下:
-
- Second ThirdActivity都运行在独立的进程中,因为android为每个应用分配一个独立的虚拟机,也就是说为每个进程分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的内存地址,这样导致在访问同一个类的对象时,会产生多个副本,他们的修改只对当前进程有效,而对其他进程不会造成任何影响。
- 正常情况下,运行在不同进程中的四大组件,只要他们通过内存共享数据,都会共享失败,而四大组件不可能不通过中间层来共享数据,因此,单独的指定android:process是不可以的,只有在不共享数据的情况下是可以的。
3.跨进程通信的方式
-
- 通过Intent传递数据
- 通过共享文件和SP
- 基于Binder的Messager和AIDL
- Socket等