线程间通信,进程间通信和AIDL

aidl的文章 http://www.jianshu.com/p/a5c73da2e9be

  1. 1,编写自己的AIDL文件是接口interface类型,文件名是aidl,make project会生成一个和aidl文件名相同的java文件

  2. 2,编写service,在清单文件声明,在service中使用生成的java文件new对象的Stub()方法向上转型为IBinder

  3. 3,在组件中隐式绑定service,在绑定的ServiceConnection获取生成的java文件的对象实例,从IBinder转型过来的

  4. 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了 

文件共享的方法用于一些缓存共享 之类的功能

发布了77 篇原创文章 · 获赞 3 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/haiyang497661292/article/details/78865075
今日推荐