远程服务的创建和调用需要使用AIDL语言,步骤如下:
使用AIDL语言定义远程服务的接口
通过继承Service类实现接口中定义的方法和属性
绑定和使用远程服务
以下为一个简单Demo ,RemoteMathCallerDemo界面如下:
绑定远程服务后,调用RemoteMathServiceDemo中的MathService服务进行加法运算。
1.使用AIDL语言定义远程服务的接口
以Android Studio为例,首先需要建立对应目录及aidl文件,如下:
(比如直接在java目录下的包上右键新建aidl文件 IDE会自动生成aidl目录及该目录下的包和文件这样的小技巧我可不会随便告诉别人)
IMathService.aidl文件内容如下:
// IMathService.aidl
package com.example.remotemathservicedemo;
// Declare any non-default types here with import statements
interface IMathService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
long Add(long a,long b);
}
然后在build目录下会自动生成与该aidl文件对应的java接口文件,(若没有生成则重新make project) 如下:
在看IMathService.java内容之前呢,不知道你有没有注意到,我前两张截图都截到了上面的一个Module:remotemathcallerdemo,这个就是调用端,目前我们编辑的remotemathservicedemo是服务端。
下面为IMathService.java的完整代码,加上了我自己的理解和注释:
/*
* 这个文件是自动生成的。不要修改
*/
package com.example.remotemathservicedemo;
/* 在这里声明任何非默认类型
所有使用AIDL建立的接口都必须继承 android.os.IInterface 基类接口
这个基类接口中定义了 asBinder()方法 用来获取Binder对象
*/
public interface IMathService extends android.os.IInterface {
/**
* 本地IPC实现stub类
*/
public static abstract class Stub extends android.os.Binder implements com.example.remotemathservicedemo.IMathService {
private static final java.lang.String DESCRIPTOR = "com.example.remotemathservicedemo.IMathService";
public Stub() {
this.attachInterface(this, DESCRIPTOR);
}
//asInterface(IBinder) 是Stub内部的远程服务接口,调用者可以通过该方法获得远程服务的实例
public static com.example.remotemathservicedemo.IMathService asInterface(android.os.IBinder obj) {
if ((obj == null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
//判断android.os.IInterface实例是否为本地服务 若是返回android.os.IInterface
//若不是本地服务 构造Proxy对象并返回之
if (((iin !