个人理解 我也不知道理解这样深不深刻 错了求指导 新人上午刚学习的
远程服务是一个可以跨进程的服务,远程访问的创建和调用需要使用AIDL语言,这个小实例就用到这个
一般从以下3个方面入手
使用AIDL语言定义跨进程服务的接口
通过继承Service类实现跨进程服务
绑定和使用跨进程服务
我是这样做的
在src下面创建一个
IMathService.aidl在这里面我写了一个接口 是实现比较数字大小的接口
然后在gen目录下 他给我们自己自动建立了一个叫做IMathService.java这是一个接口类
abstract class Stub extends android.os.Binder implements com.example.test3.IMathService
生成了一个内部静态抽象类Stub,Stub继承了Binder类,并实现ImathService接口
在Stub类中,还包含一个重要的静态类Proxy。如果认为Stub类实现进程内服务调用,那么Proxy类则是用来实现跨进程服务调用的,将Proxy作为Stub的内部类完全是出于使用方便的目的
第8行代码是IMathService继承了android.os.IInterface,这是所有使用AIDL建立的接口都必须继承的基类接口,这个基类接口中定义了asBinder()方法,用来获取Binder对象
在代码的第30行到第32行,实现了android.os.IInterface接口所定义的asBinder()方法
在IMathService中,绝大多数的代码是用来实现Stub这个抽象类的。每个远程接口都包Stub类,因为是内部类,所有并不会产生命名的冲突
asInterface(IBinder)是Stub内部的跨进程服务接口,调用者可以通过该方法获取到跨进程服务的对象
仔细观察asInterface(IBinder)实现方法,首先判断IBinder对象obj是否为null(第21行),如果是则立即返回
第24行代码是使用DESCRIPTOR构造android.os.IInterface对象,并判断android.os.IInterface对象是否为进程内服务
如果是进程内服务,则无需进程间通信,返回android.os.IInterface对象(第26行)
如果不是进程内服务,则构造并返回Proxy对象(第28行)
第66行代码是Proxy内部包含与IMathService.aidl相同签名的函数
第71~76行代码是在该函数中以一定的顺序将所有参数写入Parcel对象,以供Stub内部的onTransact()方法能够正确获取到参数
当数据以Parcel对象的形式传递到跨进程服务的内部时,onTransact()方法(第33行)将从Parcel对象中逐一的读取每个参数,然后调用Service内部制定的方法,并再将结果写入另一个Parcel对象,准备将这个Parcel对象返回给远程的调用者
Parcel是Android系统中应用程序进程间数据传递的容器,能够在两个进程中完成数据的打包和拆包的工作,但Parcel不同于通用意义上的序列化,Parcel的设计目的是用于高性能IPC传输,因此不能够将Parcel对象保存在任何持久存储设备上
然后就开始写service部分
先继承app.service这个父类 他就需要实现onbind() 他需要返回IBinder对象
然后我们就可以使用 刚刚创建那个aidl文件产生的那个接口类
private final IMathService.Stub mBinder = new IMathService.Stub()
IBinder对象的建立通过使用IMathService.java内部的Stub类实现,并逐一实现在IMathService.aidl接口文件定义的函数
他要求重写那个比较的方法就是aidl里写的那个方法
就在onbind里返回mBinder对象
在onunbind里返回false
完成service部分
测试 是没有界面的 如果有以下这些显示 则表示成功
[2014-04-09 12:39:50 - test3] ------------------------------
[2014-04-09 12:39:50 - test3] Android Launch!
[2014-04-09 12:39:50 - test3] adb is running normally.
[2014-04-09 12:39:50 - test3] No Launcher activity found!
[2014-04-09 12:39:50 - test3] The launch will only sync the application package on the device!
[2014-04-09 12:39:50 - test3] Performing sync
[2014-04-09 12:39:50 - test3] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'ffff'
[2014-04-09 12:39:50 - test3] Uploading test3.apk onto device 'emulator-5554'
[2014-04-09 12:39:53 - test3] Installing test3.apk...
[2014-04-09 12:39:58 - test3] Success!
[2014-04-09 12:39:58 - test3] \test3\bin\test3.apk installed on device
[2014-04-09 12:39:58 - test3] Done!
编写xml文件
<service android:name=".MathService"
android:process=":remote">
<intent-filter>
<action android:name= "com.example.test3.MathService" />
</intent-filter>
</service>
然后编写界面 activity
写接口内的实例
ServiceConnection
布尔值判定是否绑定
点击绑定就判定是否为true ,否就启动,是就不进行操作,启动绑定,然后设置值为true
点击取消 先判断是不是true 是的话就取消 不是的话 不进行操作 取消绑定,然后设置为false
点击比较 如果绑定服务启动内存有值的话 就开启比较 如果服务未进行绑定就显示没有绑定服务的 就不执行比较