第二章IPC机制(Android开发艺术探索)

2024-09-03 02:08

本文主要是介绍第二章IPC机制(Android开发艺术探索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Bundle传递数据实现IPC(当然传递的类型必须要bundle支持)

特殊情况:传递的数据类型Bundle不支持的情况(即无法通过intent传输),
这种情况可以考虑:我们通过A进程中的Intent启动B进程的Service(比如intentService)来进行执行,执行完后再启动B进程中的目标组件

2.使用文件共享实现IPC(要注意并发读写的问题)
在windows上面,一个文件加了排斥锁,其他线程就无法访问
但是:android 是基于linux,并发读写文件无限制
附:反序列和序列化的内容是一样的,但是是2个对象


SharedPreferences在内存中有一份文件缓存
所以在多进程模式下,系统对它的读写就变的不可靠,面对高并发的读写访问,它有很大几率丢失数据,
所以不建议在进程间通信中使用SharedPreferences

3.使用Messenger实现IPC(信使,)
Messenger是串行的方式处理客户端的消息,如果有大量的并发请求就不太合适了,
messenger的作用主要是传递消息,并不能实现跨进程方法的调用
Messenger是对aidl进行了封装,只能发消息使用

4. 使用AIDL实现IPC
有一点要注意:客户端在onDestroy方法中解除注册到服务端的listener的时候,会出现can not unregister的情况,
原因是:对象是不能跨进程传输的,跨进程传输本质就是反序列化的过程,
这也是为什么AIDL的自定义对象都必须实现Parcelable接口的原因。
可以使用RemoteCallbackList:是系统专门提供的用于删除跨进程listener的接口(key,value的形式保存listener)

注意:
1.客户端调用远程服务的时候,如果远程方法比较耗时,那么客户端会出现ANR
解决:
避免在客户端的UI主线程中访问远程方法
2.同理,远程服务端调用客户端的耗时方法时,服务端也不要再UI线程中调用
3.如果服务端意外停止了(服务端的Binder可能意外死亡),那么客户端需要重新连接服务
方法1:服务端的Binder死亡,会收到binderDied方法的回调,我们在这个方法中重连
方法2:在onServiceDisconnected重连
两种方法的区别:
onServiceDisconnected在主线程,可以直接回调后进行ui操作
binderDied在客户端的binder线程池中回调,不能直接访问ui


AIDL权限验证:
默认情况下,远程服务任何人都可以连接
方法1:在onBind中验证,比如使用permission方式,在menifest中注册
方法2:在服务端的onTransact方法中验证

5.使用ContentProvider实现IPC
是android间专门用于不同应用间进行数据共享的方式,和messenger一样,底层是binder

6.使用socket实现IPC
socket的理解:
快递员:socket

数据发送过程:
1.产生socket
2.调用bind将socket的信息通知给驱动程序
3.应用程序把数据传给socket
4.驱动程序从socket中取出数据并通知网卡发送出去
接受数据过程:
1.产生socket
2.调用bind将socket的信息通知给驱动程序
3.驱动程序根据从网卡传送过来的数据报中”指定的目标端口号“,将处理的数据传送到相应的socket中,应用程序从socket中取数据


Binder连接池
AIDL:最常见的进程间通信方式
AIDL使用:
1.创建service接口,AIDL接口
2.创建一个类,继承AIDL接口中的Stub类,并实现抽象方法
3.在Service的onBind方法中返回这个类的对象
4.客户端绑定服务端的service,建立连接后就可以访问服务端的方法了
但是如果公司项目庞大,可能创建很多个service
解决方法:binderPool机制
1.一个业务一个AIDL
2.向服务端提供唯一标识和binder对象;服务端只需要一个service就好
3.服务端提供一个queryBinder接口,此接口返回相应的binder对象
binder连接池的作用:把每个业务模块的binder请求统一转发到远程service,这样避免重复创建service

选择合适的IPC方式
1.Bundle:优点:简单易用  缺点:只能传输Bundle支持的数据类型 使用场景:四大组件间的进程通信
2.文件共享优点:简单易用 缺点:不适合高并发的情况,并且无法做到进程间的即时通讯 使用场景:无并发访问情况下,交换简单的数据实时性不高的情况
3.AIDL:优点:功能强大,支持一对多并发通信,支持实时通讯  缺点:需要处理好线程同步 使用场景:一对多通信且有Rpc需求
4.Messager:优点:支持一对多串行通信,支持实时通讯 缺点:不能很好处理高并发情况,不支持Rpc,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 使用场景:低并发的一对多即时通信,无Rpc需求,或者无需返回结果的Rpc需求
5.ContentProvider :优点:在数据源访问方面功能强大,支持一对多并发数据共享,可通过call方法扩展其他操作(call在源码编译下可调用http://blog.csdn.net/luoshengyang/article/details/6950440) 缺点:主要提供数据源的Crud 使用场景:一对多的进程间数据共享
6.Socket: 优点:功能强大,可以通过网络传输字节流,支持一对多并发实时通讯 缺点:实现细节有点繁琐,不支持直接的Rpc
来源: <http://blog.csdn.net/q178266871/article/details/50394486>


















这篇关于第二章IPC机制(Android开发艺术探索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131717

相关文章

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO