aidl的文章 http://www.jianshu.com/p/a5c73da2e9be
-
1,编写自己的AIDL文件是接口interface类型,文件名是aidl,make project会生成一个和aidl文件名相同的java文件
-
2,编写service,在清单文件声明,在service中使用生成的java文件new对象的Stub()方法向上转型为IBinder
-
3,在组件中隐式绑定service,在绑定的ServiceConnection获取生成的java文件的对象实例,从IBinder转型过来的
-
4,使用转型过来的对象调用相应的方法
进程间通信:Intent, AIDL, ContentProvide, BroadcastReceiver
进程与线程区别
定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。(进程可以创建多个线程)
角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是CPU调度的单位。
资源共享方面:进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器。
独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
开销方面。进程切换的开销较大。线程相对较小。(前面也提到过,引入线程也出于了开销的考虑。)
线程间通信
1,Handler消息
2,共享内存(全局变量)
3,管道流(PipOutP)
4,Broadcast Receiver
5,EventBus
6,runOnUiThread(),view.post()
7,AsyncTask
进程间通信
1.BroadCastReceiver 由于面向整个系统注册的广播,跨进程消耗较大,性能不能保证。
2.ContentProvider 支持跨进程数据共享
3.AIDL接口是同步并且带返回结果的,如果执行时间较长,客户端的调用线程会一直等待。服务端执行AIDL接口是异步的,支持所有基本类型、AIDL接口、Parcelable、List、Map等类型的参数,实现起来繁琐。
4.Messenger 本质是AIDL通信,客户端发送Message后不带返回结果,服务端接收到Message是通过一个线程的Handler轮询MessageQueue处理的,因此处理Message是在同一线程。
5.HermesEventBus 本质也是AIDL通信,不需要自己实现绑定Service,发送事件也是不带返回结果的,使用简单。
6.Binder机制 Android跨进程通信实现的核心,AIDL就是基于Binder机制实现的,其中transact方法是客户端向服务端发送消息,onTransact方法是客户端接收服务端的消息。
7.Intent(Bundle)调用其他应用,比如打电话,相机
8.文件共享:简单易用 但不适合在高并发的情况下 并且读取文件需要时间 不能即时通信 常用于并发程度不高 并且实时性要求不高的情况
9.Socket :功能强大 可以通过网络传输字节流 支持一对多并发操作 但是实现起来比较麻烦 不支持直接的RPC 常用于网络数据交换
总结起来
当仅仅是跨进程的四大组件间的传递数据时 使用Bundle就可以 简单方便
当要共享一个应用程序的内部数据的时候 使用ContentProvider实现比较方便
当并发程度不高 也就是偶尔访问一次那种 进程间通信 用Messenger就可以
当设计网络数据的共享时 使用socket
当需求比较复杂 高并发 并且还要求实时通信 而且有RPC需求时 就得使用AIDL了
文件共享的方法用于一些缓存共享 之类的功能