线程间通信,进程间通信和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了 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值