进程通讯的几种方式

来源:互联网 发布:快手解析软件 编辑:程序博客网 时间:2024/05/21 06:12

android中每个应用都是一个独立进程,系统为它们分配独立的虚拟机,application以及内存空间。不同进程间不能共享内存,每个进程都要至少有一个线程。

IPC:Inter-Process Communication进程间的通讯,进程间数据交换的过程。

进程的分类:

1:前台进程

2:可见进程

3:服务进程

4:后台进程

5:空进程

当系统内存不足时,会从下往上的杀死进程回收内存。前台进程和可见进程系统宁愿报错,也不会回收它们。

开启进程的方式

在配置文件manifest里面指定四大组件(activity,service,broadcast,content provider)的属性android:process所在的进程。

例如:

<activity android:name="com.wyq.solution.SecondActivity"    android:label="@string/app_name"    android:process=":remote"/><activity android:name="com.wyq.solution.Third"    android:label="@string/app_name"    android:process="com.wyq.solution.remote"/>

两种方式的区别:1:“:”当前进程的名字时当前包名+remote thrid进程名字是一个完整的命名方式

                            2:进程名以“:”开头的进程是私有进程 其他应用的组件不可以和他跑在同一个进程中,进程名不以“:”开头的进程属于全局进程其他应用通过shareuid方式可以和它跑在一个进程中。

两个应用通过ShareUID 方式跑在同一个进程中要求:1:相同的ShareUID   2:签名相同 此时可以共享互相的私有数据 data目录 组件信息 内存数据类似一个应用的两部分

多进程的影响

1:静态成员和单例模式完全失效

2:线程同步机制完全失效

3:sharedpreference 不安全 读写xml不支持并发操作

4:application 多次创建


序列化方式

1:java提供的serializable

   serialVersionUID作用:序列化时系统会将当前类的serialVersionUID写入到序列化的文件中 当反序列化的时候系统会检查文件中的serialVersionUID看他是否与当前类一致,如果一致说明没有变化可以序列化,否则说明当前类与序列化类相比发生了变化无法发序列化。我们应该手动去指定serialVersionUID,如果不手动指定当类发生变化就会失败报错,手动指定后当前类改变了比如新加成员变量 删除了某个属性 还是可以恢复数据。

2:android提供的parcelable

序列化的是实例 静态成员不参与序列化过程。

二者区别:serializable整体实例序列化 大量i/o性能低 如果持久化到设备上使用serializable否则使用parcelable


IPC方式:

1:intent隐式启动一个进程  只能传输数据

2:文件共享                         不适合高并发 不能做到进程间及时通讯

3:Messenger                      串行的通讯方式 

4:AIDL                                功能强大 适合并发,运行在binder线程池中 可以调用方法

5:SOCKET                         字节流,网络通讯

0 0
原创粉丝点击