广播和aidl的区别Android,android进程间通信方式为什么要用AIDL不用广播?

1。bus工程实现通过service实现aidl实体类?

2。actor工程通过发起bindservice,根据action去启动远程(跨进程的)bus上的aidl。

那么问题来了,我们知道,linux系统进程间通信,各个进程间资源是隔离的,两个进程间需要通信,就要把msg转换成底层os系统能够识别的数据单元,在Android里面的方案是aidl parcelbal的序列化。

为了模拟和测试aidl的性能问题,我做了个简单实验,在Android中,进程间通信通过binder实现,bind是通信的数据载体,当序列化后的数据单元过大时,就会出问题,报出android。os。TransactionTooLargeException。

http://developer。android。com/reference/android/os/TransactionTooLargeException。html

官方文档里有说明,最大通常限制为1M。

也就是说如果大于1M数据的话,就应该分开传。理论上说,应该都是对象和字符串类型的数据为主,只要不是大图片实体等问题,一般应该够用。我这边做了一个测试,序列化传送了450k的String被序列化?后的数据,耗时使用了33秒的时间。?try?{StringBuilder?sb?=?new?StringBuilder();for(int?i?=?0;i30;i ){sb。

append(new?String?(stringMsg));}System。out。println(?"actor?time?start?:"? ?System。currentTimeMillis());binder。sendMsg("msg?from?actor?:?"? ?sb。

toString());}?catch?(RemoteException?e)?{//?TODO?Auto-generated?catch?blocke。printStackTrace();}------

public?static?BusCore?coreBinder?=?new?BusCore。

Stub()?{

@Overridepublic?void?sendMsg(String?msg)?throws?RemoteException?{Log。d("",?"?RemoteBusCoreService?msg:"? ?msg);

System。

out。println("buscore?time?end?:"? ?System。currentTimeMillis());}};

对于远程服务,必须调用?bindService()方法,而不是?startService()方法。

今天刚好是在做框架性?实现方案测试时,稍微检测了下个,mark下。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值