- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
兄弟连android学习视频整理笔记
创建AIDL的步骤:
第一步,新建一个AIDL文件
aidl文件是用来描述需要定义的业务方法
首先申明包
interface 不能有修饰符
写方法时也不能有修饰符,支持的数据类型在前面有。list、map所存的类型也是支持的类型
eg:
点击保存
可以看到在gen包下自动生成了IPerson.java 的java类
打开该文件可以看到声明:该文件为自动生成,不能修改
写aidl文件的目的是为了生成.java文件,在实际中是不使用aidl文件的
注意,若gen中的.java文件没有生成,说明aidl文件出错
可以看到在IPerson.java文件中生成了四个对应.aidl文件的方法,方法后面会有远程异常
还会生成一个抽象类,Stub -- 存根
Stub既是Iperson的内部类也是IPerson
查看stub,可以发现它没有实现之前定义的四个方法
但仍有一个静态的内部类Proxy,代理类
这个代理也实现了IPerson
代理模式的写法就是代理对象和被代理对象都要同时继承同一个接口
可以看到这个代理类内部有四个方法。代理了网络通信相关的功能
在onBind方法中返回了一个实例化的PersonImpl
为什么返回对象本应为IBinder 却返回了PersonImpl
原因如下:
从上可以看出,经过层层的继承,实际上PersonImpl就是IBinder
重新对IPC整个操作进行梳理:
通过.aidl接口,aidl语言是定义一个要提供给其他应用组件来访问的接口的声明,它会根据adt工具来生成接口IBinder,并且在存根Stub中生成一个代理对象。通过这个接口来实现了PersonImpl这样的业务对象。然后又把这个业务对象的实例化放到service里边。
理解:在业务对象创建完成后,通过service绑定的方式来暴露给其他应用组件来去访问。所以最终service并没有实现业务功能,它只是将其暴露出去
在绑定成功后所调用方法中的,就是 onBind中返回的personimpl
首先要声明要使用的业务对象接口
然后在回调方法中使用Stub类的asInterface方法返回一个person接口
再次梳理:
当activity去绑定服务时,系统会自动调用onbind方法。返回一个personimpl业务对象
这个返回的业务对象会被activity中的ServiceConnection所接收
然后ServiceConnection利用onServiceConnected方法将接收的业务对象借助Stub类的asInterface方法将service 转化为person接口
返回的person究竟是什么呢
输出测试一下
如下图:所以返回的person实际上就是personimpl。这个即为进程间的通信
可以在同一个工程中实现不同进程间的调用
需要在service中添加android:process=”:remote” 的属性
进程名字即为报名加remote(remote这个名字可以随便取)
可以看到activity和service运行于不同的进程
且这是返回的person不是personimpl而是一个代理类proxy
这是再运行程序输出,观察结果
源程序:
再次整理
注意:在绑定解绑后如果再次解绑则会报错
解决方法:定义一个boolean值
Boolean mBound=false;
当绑定时,mBound置true
解绑以及异常终止时,mBound置false
文档评论(0)