五 使用ContenProvider P106
ContentProvider是Android中提供的专门用于不同应用之间进行数据共享的方式,从这一点,他天生就适合进程间的通信,它的底层实现也是Binder,使用比BInder简单,主要以表格的形式来组织数据,行对应一条数据,列对应一条记录的一个字段
使用步骤:
1.创建一个类并继承ContentProvider,实现他的6个抽象方法
2.注册创建的Provider类 <Provider .......
并指明authorities标识,一般命名为 包名.provider;标明 permission com.ryg.PROVIDER
注册完外部程序就可以访问这个contentProvider了。 Uri uri=Uri.parse("content://com.ryg.chapter_2.book.provider");括号内唯一标识了我们定义的Provider 这个标识正好是我们注册时authorities的值。
ContentProvider除了支持对数据源的增删改查这四个操作,还支持自定义调用,这个过程是通过ContenResolver的Call方法和ContentProvider的Call方法来完成的。
六,使用Socket
Socket 套接字,它分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层中的TCP和UDP协议。
使用步骤:
1.声明权限 Internet权限和ACCESS_NETWORK_STATE权限 注意:不能在主线程中访问网络。
设计聊天室程序:
服务端:代码P119
七,Binder连接池
AIDL大致流程:首先创建一个Service和一个AIDL接口,接着创建一个类继承自AIDL接口中的Stub类并实现其中的抽象方法,在Service的onBind方法中返回这个类的对象,然后客户端就可以绑定服务端的service,建立连接后就可以访问远程服务端的方法了。
当多个业务模块都需要使用AIDL进行进程间通信时:每个业务模块创建自己的AIDL接口并实现此接口,然后向服务端提供自己的唯一标识和其对应的Binder对象;对于服务端来说只要一个Service就可以了,服务端提供一个queryBinder接口,这个接口能够根据业务模块的特征来返回相应的Binder对象给他们,不同的业务模块拿到所需的Binder对象后就可以进行远程方法调用了。
Binder线程池的作用:就是将每个业务模块的Binder请求统一转发到远程Service中去执行,从而避免了重复创建Service的过程。
使用步骤:
业务模块的AIDL接口定义和实现。
首先,为Binder连接池创建AIDL接口和IBinderPool.aidl(是一个接口)。代码P130
接着,为Binder连接池创建远程Service并实现IBinderPool