初遇Android——跨进程使用Service
Android系统中,各应用程序都运行在自己的进程中,进程之间无法直接进行数据交换。为了实现这种跨进程通信(interprocess communication,简称IPC),Android提供了AIDL Service
AIDL Service简介
Android的远程Service调用与java的RMI基本相似,一样都是先定义一个远程调用接口,然后为该接口提供一个实现类即可。客户访问Service时,Android并不是直接返回Service对象给客户端,而是通过onBind()方法返回一个IBinder类型的对象作为Service的代理对象给客户端。因此,AIDL远程接口的实现类就是IBinder的实现类。
与绑定本地Service不同的是,绑定本地Service,onBind会直接把IBinder的实现类传给客户端的ServiceConnection的onServiceConnected方法的第二个参数;而绑定远程Service则是将IBinder对象的代理传给ServiceConnection的onServiceConnected方法的第二个参数。
当客户端获取了远程service的IBinder对象的代理后,接下来就可以通过该IBinder对象去回调远程Service的属性或方法了。
实现步骤:
1、创建AIDL文件
Android需要AIDL(Android Interface Definition Language)来定义远程接口
利用Android studio创建AIDL接口后,会自动为接口生成实现(但是我用的Android Studio1.4在创建了.aidl文件后并没有自动生成.java文件,要run一遍项目后才会生成),生成的java文件在app\build\generated\source\aidl\debug\目录下
interface ICat { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ String getColor(); double getWeight();}
自动生成的java文件中,有这样一个Stub类,它继承了android.os.Binder,所以Service的onBind方法可以将继承了Stub的类的对象传给客户端
public static abstract class Stub extends android.os.Binder{}
2、将接口暴露给客户端
在Service中,根据业务要求实现ICat接口
public class CatBinder extends ICat.Stub { @Override public String getColor() throws RemoteException { return "red"; } @Override public double getWeight() throws RemoteException { return 55; } }
这里只是简单的传递两个数据
创建ICat对象,通过onBind方法传给客户端
ICat ICat = new ICat();@Overridepublic IBinder onBind(Intent arg0){ return ICat;}
3、客户端接收代理对象
和绑定本地Service一样,都是通过ServiceConnection的onServiceConnected来获取,但是有一点不一样
①:将Service端.iadl文件生成的.java文件连同包一同复制到客户端项目中
②:onServiceConnected()方法获得对象的代理方法为:
catService = ICat.Stub.asInterface(service);
获取到代理对象后,就可以通过它来回调Service中实现的方法了
更多相关文章
- 浅谈Java中Collections.sort对List排序的两种方法
- 类和 Json对象
- python list.sort()根据多个关键字排序的方法实现
- 《Android面试宝典》学习笔记(第三章:组件)
- Android新的menu实现――ActionMode
- Android中对Handle机制的理解
- Android(安卓)下使用 JSON 实现 HTTP 请求,外加几个示例!
- Android的MediaRecorder架构介绍
- Android中Animator & Animation比较