android IPC
- 什么是IPC?
- 进程间通信
- 为什么需要IPC
- 因为一个进程总要从外部获取信息,不可避免的要获取其他进程的信息
- android规定单个应用内存只有16MB(根据android设备来的)
- 如何设置多进程模式
- 给四大组件指定属性:android:process
- 非常规方法:JNI在native层fork一个进程
- 查看进程 adb shell ps
- 以":"开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中,而进程名不以":"开头的进程属于全局进程,其他应用通过ShareUID方式可以和它跑在同一个进程中
- 我们知道Android系统会为每个应用分配一个唯一的UID,具有相同的UID的应用才能共享数据。
- 两个应用通过ShareUID跑在同一个进程是有要求的,需要这两个应用有相同的ShareUID并且签名相同才可以。可以互相访问对方的私有数据,还可以共享内存数据,或者说它们看起来就像是一个应用的两个部分
- 多进程模式的运行机制
- android为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机;
- 应用内多进程相当于系统又把这个应用重新启动了一遍,既然重新启动了,就会自然创建新的Application。
- 运行在同一个进程中的组件是属于同一个虚拟机和同一个Application的
- 多进程会造成如下几个问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreference的可靠性下降
- Application会多次创建
- 多进程会造成如下几个问题:
- IPC的几种方式
- Messenger
- 客户端
/** * Create a Messenger from a raw IBinder, which had previously been * retrieved with {@link #getBinder}. * * @param target The IBinder this Messenger should communicate with. */ public Messenger(IBinder target) { mTarget = IMessenger.Stub.asInterface(target); }
- 服务器
/** * Create a new Messenger pointing to the given Handler. Any Message * objects sent through this Messenger will appear in the Handler as if * {@link Handler#sendMessage(Message) Handler.sendMessage(Message)} had * been called directly. * * @param target The Handler that will receive sent messages. */ public Messenger(Handler target) { mTarget = target.getIMessenger(); }
@Nullable @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); }
- 客户端
- Messenger
-
-
- 如果客户端和服务器需要相互发消息,需要在客户端发消息的时候,指定message.replyto = messenger;
- 服务端通过Messenger messenger = msg.replyto;然后进行messenger.send()
- AIDL
- 支持哪些数据类型:
- 基本数据类型(int、long、char、boolean、double、float等)
- String和CharSequence
- List:只支持ArrayList,里面每个元素都必须能够被AIDL支持
- Map:只支持HashMap,里面的每个元素都必须被AIDL支持,包括key和Value
- Parceable:所有实现了Parceable接口的对象
- AIDL:所有的AIDL接口本身也可以在AIDL文件中使用
- in 、out和inout
- in表示输入型参数
- out表示输出型参数
- inout表示输入输出型参数
- 支持哪些数据类型:
-
-
- Bundle
- Bundle实现了Parcelable
- 我们在一个进程中启动另一个进程的Activity、Service和Receiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。当然传输的数据必须能够被序列化
- 共享文件
- ContentProvider
- Socket
- Bundle
Dana.Lee
To:Dana_Lee1016@126.com