概述:在Android中,一个应用程序可以调用另一个程序的服务:如支付宝支付 这种被调用的服务称之为远程服。使用远程服务必须要服务提供者提供远程服务支持,提供意图过滤器
在Android平台,每个应用程序都是一个单独的JVM,都运行在自己的进程空间里, 通常,一个进程不允许访问另一个进程的内存空间(一个应用不能访问另一个应用)。当用户(程序开发人员)想在一个App中访问另一个App的进程空间的时候,就需要进程间通信。在Android中,远程服务为我们提供了实现进程间通信的方式,其中,AIDL是应用程序开发人员常的一种方式。
具体实现
- 声明服务对外提供的相应方法
//因为是对外提供的方法,所以一定是public,因此,此处语法一定不能存在访问权限修饰符
interface IService {
void getShow();
}
- 改变中间类后缀名,把.java文件改成.aidl文件
- 此时,在gen包下就会生成与此接口同名的java文件(IService.java),此文件是系统自动生成的,其源代码的部分截取
public static abstract class Stub extends android.os.Binder implements com.asksky.bdser.IService{}
//可以看出,Stub类实现了之前的IService接口,那么,此时,在中间类中不需要继承Binder类了,也不需要实现IService接口。直接继承Stub类即可
private class GetService extends IService.Stub{}//内部方法不变
- 在清单文件中假如服务拦截路径
<service android:name="com.asksky.bdser.MyService">
<intent-filter>
<action android:name="com.asksky.IService"/>
</intent-filter>
</service>
- 最后,在远程方法获取此服务的中间类,在此之前需要将服务提供者的IService.aidl复制到当前工程目录下,包名要保持一致
注意:此处创建意图的方式有些不同:需要设置拦截路径,拦截路径就是在服务提供者清单中配置的自定义拦截路径
如果是本应用的远程服务类则不需要此步骤
Intent inten = new Intent();
inten.setAction("com.asksky.IService");
startService(inten);
bindService(inten, new MyConn(), BIND_AUTO_CREATE);
获取中间类的方式:
//IService is = (IService) service; 此时,获取中间类的方式相同,但是,建议使用以下方法
IService is = IService.Stub.asInterface(service);
//建议使用此方式:因为此方式获取中间类,其底层会先进行一系列判断(是否为空,是否继承了IService类),若没有此类,系统会创建一个类返回,健壮性较高一些
相关链接:
服务入门(Service)
如以上内容有任何错误或补充,欢迎加QQ:1195211669 ,验证信息:简书