IPC机制:
1. 多进程概念;
2. 序列化机制和Binder;
3. 进程间通信:Bundle、文件共享、AIDL、Messenger、ContentProvider、Socket;
操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
进程和线程的区别:
进程和线程都是一个时间段的描述,是CPU工作时间段的描述。
进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。是系统进行资源分配和调度的一个独立单位,包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文。
线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
一个变量保存在内存中,CPU访问时将变量放入寄存器,读写完毕后再放回内存;
线程同步可使用关键字:Synchronized关键字修改函数或者一段代码;
线程死锁:
两个线程需要同时访问两个共享资源时,常常会出现这种问题;
在Android系统中,可以使用 “kill -3 <pid>” 来检查应用中死锁的线程;
命令提示符是“#”,而不是“$”,说明当前是用root用户权限操作shell
Android中的多进程:
一个应用内使用多进程:给四大组件在AndroidManifest中指定android:process属性
运行在不同进程中的组件是属于不同的虚拟机和Application的,即不同进程的组件会拥有独立的虚拟机、Application以及内存空间;
IPC基础概念:
1. Serializable接口
手动指定serialVersionUID的值,或让Eclipse根据当前类的结构自动生成它的hash值
静态成员变量不属于对象,只属于类,所以不参与序列化过程;
用transient关键字标记的成员变量不参与序列化过程;
2. Parcelable接口
完成对象的序列化,当需要通过Intent和Binder传输数据,或将对象持久化到存储设备上,或通过网络传输给其他客户端,
都需要使用Parcelable或Serializable;
系统提供了许多实现了Parcelable接口的类,它们都是可以直接序列化,如Intent、Bundle、Bitmap等;
区别:
Serializable是Java的序列化接口,使用简单,开销大,序列化和反序列号需要大量I/O操作;
Parcelable是Android的序列化接口,使用麻烦,效率高,推荐该方法。
通常,将对象持久化到存储设备上,或通过网络传输给其他客户端过程稍显复杂,建议使用Serializable。
3. Binder
AIDL文件的本质:是系统为我们提供了一种快速实现Binder的工具
Android中的IPC方式:
1. Bundle
2. 文件共享:
由于Android系统基于Linux,使得其并发读/写文件可以没有限制地进行,
适合在对数据同步要求不高的进程之间进行通信;
SharedPreferences: 是个特例,高并发时很大几率丢失数据,不建议进程间通信使用;
3. Messenger:
一种轻量级的IPC方案,底层实现是AIDL,在进程间传递Message对象;
以串行的方式处理客户端发来的消息,一次处理一个请求,因此在服务端不用考虑线程同步问题;
若大量并发请求,则Messenger不合适;
4. AIDL:
CopyOnWriteArrayList线程同步的List,支持并发读/写,非ArrayList
对象不能跨进程传输,使用RemoteCallbackList
观察者模式
RemoteCallbackList 是系统专门提供的用于删除跨进程的listener接口
权限认证的两种方法
5. ContentProvider:
不同应用间数据共享,底层实现也是Binder
ContentResolver的query、update、insert、delete
对底层的数据存储方式没有任何要求,可以使用SQLite数据库、普通文件、或内存中的一个对象来进行数据的存储
Activity ---- ContentResolver ---- ContentProvider ----- SQLiteOpenHelper
6. Socket:
流式套接字----TCP协议(面向连接的协议,提供稳定的双向通信功能,建立经过“三次握手”,超时重传机制)
用户数据报套接字----UDP协议(无连接的协议,提供不稳定的通信功能,性能上具有更好的效率,确定是不保证数据一定能够正确传输)