androidservice中stub作用是什么?

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

androidservice中stub作用是什么?
1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信
2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述:
--1.Create your .aidl file - This file defines an interface (YourI nterface.aidl) that defines the methods and fields available to a client.
创建你的aidl文件,我在后面给出了一个例子,它的aidl文件定
义如下:写法跟java代码类似,但是这里有一点值得注意的就是它可以引用其它aidl文件中定义的接口,但是不能够引用你的java类文件中定义的接口
1.package com.cao.android.demos.binder.aidl;
2.import com.cao.android.demos.binder.aidl.AIDLAc tivity;
3.interface AIDLService {
4.void registerTestCall(AIDLActivity cb);
5.void invokCallBack();
6.}
--2.Add the .aidl file to your makefile - (the ADT Plugin for E clipse manages this for you). Android includes the compiler, call ed AIDL, in the tools/ directory.
编译你的aidl文件,这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译:编译生成AIDLService.java如我例子中代码
--3.Implement your interface methods - The AIDL compiler creates an interface in the Java programming language from yo ur AIDL interface. This interface has an inner abstract class name d Stub that inherits the interface (and implements a few additio nal methods necessary for the IPC call). You must create a class t hat extends YourInterface.Stub and implements the methods yo u declared in your .aidl file.
实现你定义aidl接口中的内部抽象类Stub,public static abstract class Stub extends android.os.Binder implements com.cao.andr oid.demos.binder.aidl.AIDLService
Stub类继承了Binder,并继承我们在aidl文件中定义的接口,我们需要实现接口方法,下面是我在例子中实现的Stub类:
1.private final AIDLService.Stub mBinder = new AID LService.Stub() {
2.
3.@Override
4.public void invokCallBack() throws RemoteExcepti on {
5.Log("AIDLService.invokCallBack");
6.Rect1 rect = new Rect1();
7.rect.bottom=-1;
8.rect.left=-1;
9.rect.right=1;
10.rect.top=1;
11.callback.performAction(rect);
12.}
13.
14.
15.@Override
16.public void registerTestCall(AIDLActivity cb) throw s RemoteException {
17.Log("AIDLService.registerTestCall");
18.callback = cb;
19.}
20.};
Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了。

--4.Expose your interface to clients - If you're writing a servi ce, you should extend Service and override Service.onBind(Inten t) to return an instance of your class that implements your interf
ace.
第四步告诉你怎么在客户端如何调用服务端得aidl描述的接口对象,doc只告诉我们需要实现Service.onBind(Intent)方法,该方法会返回一个IBinder对象到客户端,绑定服务时不是需要一个ServiceCo nnection对象么,在没有了解aidl用法前一直不知道它是什么作用,其实他就是用来在客户端绑定service时接收service返回的IBinder 对象的:
1.AIDLService mService;
2.private ServiceConnection mConnection = new Se rviceConnection() {
3.public void onServiceConnected(ComponentNam
e className, IBinder service) {
4.Log("connect service");
5.mService = AIDLService.Stub.asInterface(service);
6.try {
7.mService.registerT estCall(mCallback);
8.} catch (RemoteException e) {
9.
10.}
11.}
12.
13.
14.public void onServiceDisconnected(ComponentN ame className) {
15.Log("disconnect service");
16.mService = null;
17.}
18.};
mService就是AIDLService对象,具体可以看我后面提供的示例代码,需要注意在客户端需要存一个服务端实现了的aidl接口描述文件,但是客户端只是使用该aidl接口,不需要实现它的Stub类,获取服务端得aidl对象后mService = AIDLService.Stub.asInterface(ser vice);,就可以在客户端使用它了,对mService对象方法的调用不是在客户端执行,而是在服务端执行。

4.aidl中使用java类,需要实现Parcelable接口,并且在定义类相同包下面对类进行声明:
上面我定义了Rect1类
之后你就可以在aidl接口中对该类进行使用了
package com.cao.android.demos.binder.aidl;
import com.cao.android.demos.binder.aidl.Rect1;
interface AIDLActivity {
void performAction(in Rect1 rect);
}
注意in/out的说明,我这里使用了in表示输入参数,out没有试过,为什么使用in/out暂时没有做深入研究。

5.aidl使用完整示例,为了清除说明aidl使用,我这里写了一个例子,例子参考了博客:
/saintswordsman/archive/2010/01/04/5 130947.aspx
作出说明
例子实现了一个AIDLTestActivity,AIDLTestActivity通过binds ervice绑定一个服务AIDLTestService,通过并获取AIDLT estActivity 的一个aidl对象AIDLService,该对象提供两个方法,一个是registe rTestCall注册一个aidl对象,通过该方法,AIDLTestActivity把本身实现的一个aidl对象AIDLActivity传到AIDLT estService,在AIDLTe stService通过操作AIDLActivity这个aidl远端对象代理,使AIDLTe stActivity弹出一个toast,。

相关文档
最新文档