当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.2.3 Service精通

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:15

他的语法很简单,而这种接口语言并非真正的编程语言,只是定义两个进程间的通信接口而已!而生成符合通信协议的Java代码则是由Android SDK的platform-tools目录下的aidl.exe工具生成,生成对应的接口文件在:gen目录下,一般是:Xxx.java的接口!而在该接口中包含一个Stub的内部类,该类中实现了在该类中实现了IBinder接口与自定义的通信接口,这个类将会作为远程Service的回调类——实现了IBinder接口,所以可作为Service的onBind( )方法的返回值!2)AIDL实现两个进程间的简单通信在开始编写AIDL接口文件前,我们需要了解下编写AIDL的一些注意事项:AIDL注意事项:接口名词需要与aidl文件名相同接口和方法前面不要加访问权限修饰符:public ,private,protected等,也不能用static final!AIDL默认支持的类型包括Java基本类型,String,List,Map,CharSequence,除此之外的其他类型都需要import声明,对于使用自定义类型作为参数或者返回值,自定义类型需要实现Parcelable接口,详情请看后面的传递复杂数据类型自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。另外,如果编写aidl你用的编译器是:Eclipse的话要注意:不要直接new file然后建立哦!这样的话是打不开文件,从而不能编写代码哦!①直接新建一个txt文件,编写好后保存为.aidl格式,然后复制到对应路径下②因为aidl和接口类似,所以直接new interface,编写好内容后,来到对应java文件所在目录下修改文件后缀名;假如你使用的是Android Studio的话,不同于Eclipse,如果你按照Eclipse那样创建一个AIDL文件,会发现并没有编译生成对应的XXX.java文件,AS下创建AIDL需要在main目录下新建一个aidl文件夹,然后定义一个和aidl包名相同的包,最后创建一个aidl文件,接着按ctrl + f9重新编译,就可以了!上面两者成功编译的结果如下,你可以分别在对应目录下找到对应的AIDL文件 1.服务端:Step 1:创建AIDL文件:IPerson.aidlpackage com.jay.aidl;interface IPerson { String queryPerson(int num);}我们打开IPerson.java看看里面的代码:IPerson.java/* * This file is auto-generated. DO NOT MODIFY. * Original file: C:\\Code\\ASCode\\AIDLServer\\app\\src\\main\\aidl\\com\\jay\\aidl\\IPerson.aidl */package com.jay.aidl;public interface IPerson extends android.os.IInterface{/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implements com.jay.aidl.IPerson{private static final java.lang.String DESCRIPTOR = "com.jay.aidl.IPerson";/** Construct the stub at attach it to the interface. */public Stub(){this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an com.jay.aidl.IPerson interface, * generating a proxy if needed. */public static com.jay.aidl.IPerson asInterface(android.os.IBinder obj){if ((obj==null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin!=null)&&(iin instanceof com.jay.aidl.IPerson))) {return ((com.jay.aidl.IPerson)iin);}return new com.jay.aidl.IPerson.Stub.Proxy(obj);}@Override public android.os.IBinder asBinder(){return this;}@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException{switch (code){case INTERFACE_TRANSACTION:{reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_queryPerson:{data.enforceInterface(DESCRIPTOR);int _arg0;_arg0 = data.readInt();java.lang.String _result = this.queryPerson(_arg0);reply.writeNoException();reply.writeString(_result);return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.jay.aidl.IPerson{private android.os.IBinder mRemote;Proxy(android.os.IBinder remote){mRemote = remote;}@Override public android.os.IBinder asBinder(){return mRemote;}public java.lang.String getInterfaceDescriptor(){return DESCRIPTOR;}@Override public java.lang.String queryPerson(int num) throws android.os.RemoteException{android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(num);mRemote.transact(Stub.TRANSACTION_queryPerson, _data, _reply, 0);_reply.readException();_result = _reply.readString();}finally {_reply.recycle();_data.recycle();}return _result;}}static final int TRANSACTION_queryPerson = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);}public java.lang.String queryPerson(int num) throws android.os.RemoteException;}这里我们关注的只是**asInterface(IBinder)**和我们定义的接口中的**queryPerson()**方法!该方法会把IBinder类型的对象转换成IPerson类型的,必要时生成一个代理对象返回结果!其他的我们可以不看,直接跳过,进行下一步。Step 2:**自定义我们的Service类,完成下述操作:1)继承Service类,同时也自定义了一个PersonQueryBinder类用来继承IPerson.Stub类就是实现了IPerson接口和IBinder接口2)实例化自定义的Stub类,并重写Service的onBind方法,返回一个binder对象!AIDLService.javapackage com.jay.aidlserver;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import com.jay.aidl.IPerson.Stub;/** * Created by Jay on 2015/8/18 0018. */public class AIDLService extends Service { private IBinder binder = new PersonQueryBinder(); private String[] names = {"B神","艹神","基神","J神","翔神"}; private String query(int

上一页  [1] [2] [3] [4] [5] [6]  下一页


4.2.3 Service精通