第二章 IPC机制

1、在使用文件共享时,无法创建文件路径,原因是android7.0 SDcard 无法创建文件夹。这是因为android6.0的权限(Android运行时权限),需要手动开启应用权限,或者设置动态权限。解决方法参考:
http://blog.csdn.net/yewuqingxuan/article/details/75127343

2、messenger跨进程通信时无法在service的进程中打出log,原因竟然是没在studio中选中相应进程
这里写图片描述

3、studio中右键新建aidl文件会在main文件夹下自动生成一个aidl包,和java包平级。
这里写图片描述
新建aidl接口文件后,会在如下图中自动生成相关java类
这里写图片描述

4、所有在binder中传输的接口都需要继承IInterface接口。

aidl接口文件,定义了远程方法,并继承IInterface接口。
Stub文件(就是我们说的Binder)是一个抽象类,继承Binder(可以跨进程通信),同时实现aidl接口(增加业务功能)。其实它并没有实现aidl的接口,而是放在了service里用匿名内部类的形式实现。

binder类的方法在服务端是运行在Binder的线程池中的,所以不能在里面进行ui操作。
binder类的方法在客户端调用的时候,会通过transact()方法发起RPC,同时当前线程挂起,然后服务端的onTransact()方法会被调用,直到RPC过程结束后,当前线程继续。所以得考虑另起工作线程的问题。

传监听器时之所以选择aidl接口而不是普通接口,是因为aidl中无法使用普通接口

5、客户端将监听器往服务端传时,每次都会在服务端产生新的aidl对象,这样注册和解注册时就会出问题,此时我们就要用到RemoteCallbackList这个类,这个类非常厉害

6、客户端将监听器往服务端传时,在服务端操作的对象已经不再是Binder类了,而是它的内部类Proxy。原因见自动生成的aidl java类,在onTransact()方法中:
这里写图片描述

7、shareUID可以让两个进程共享目录文件数据,(如果对方的组件声明权限)还可以不需要权限启动对方的组件(同时还需要签名相同)

android系统会给每个应用分配一个唯一的UID,这个应用里的所有进程都会共享这一个UID

UID不相同的两个进程,如果一个进程中的组件声明了权限,那么另一个进程如果想要访问就得添加权限,不然会报错。

自定义权限不是运行时权限,只要应用申请即可拥有,不需要手动打开。

组件可以通过代码强制验证权限:

int check = checkCallingOrSelfPermission("com.ryg.chapter_2.permission.ACCESS_BOOK_SERVICE");
        if(check == PackageManager.PERMISSION_DENIED){
            //没通过验证权限
        }

8、权限的保护等级:
normal是等级最低的,代表该权限没什么危险,只要申请了就能获取。

dangerous代表该权限是有危险的,用户需要谨慎获取。这个等级与normal最明显的区别在于——dangerous的权限在6.0及以上的系统是需要通过运行时权限动态获取的。

signature代表只有带有同样的数字签名的APK才能获取,一般用于公司内部不同APK的交互调用。

signatureOrSystem在signature的基础上允许了系统应用对该权限的获取。

9、不同应用调用Service时。隐式调用失效,要用显示调用:
这里写图片描述

10、不同应用间绑定Service时,Service不能加自定义权限,否则绑定不了。


总结:

1、何为IPC?

2、做为IPC最常用的一个场景,android应用为什么需要开启多进程?
开启多进程的方式?(“:”和“.”的区别)
多进程会产生哪些问题?

3、进程间的shareUID有何意义?

4、理解Serializable(serialVersionUID的意义)
理解Parcelable
Serializable和Parcelable有何不同的应用场景?

(重点)5、深刻理解Binder类,aidl文件生成的java类

6、IPC的几种方式:
—a、使用intent传输
—b、使用文件共享
—c、使用Messenger
(重点)—d、使用AIDL(只是android系统为我们生成Binder类的一个模板):
写AIDL的方法;
使用Binder类的方法;
AIDL文件支持的数据类型;
实现观察者模式(理解RemoteCallbackList这个类);
客户端服务端所在线程问题;
Binder死亡时的两种解决方法(死亡代理和onServiceDisconnected()),他俩区别在线程不同;
服务端权限验证的两种方式(onBind()和onTransact());

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值