龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 移动开发 > Android开发 >

Android程序设计之AIDL实例详解

时间:2014-09-12 02:13来源:网络整理 作者:网络 点击:
分享到:
这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下

通常来说,AIDL这项技术在我们的应用开发过程中并不是很常用,虽然新浪微博提供了SSO登录,但是其原理就是使用AIDL。本文就以完整的实例形式讲述了AIDL的原理及实现方法。

AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.

说白了,AIDL就是定义一个接口,客户端(调用端)通过bindService来与远程服务端简历一个连接,在该连接建立时会将返回一个IBinder对象,该对象是服务端Binder的BinderProxy,在建立连接时,客户端通过asInterface函数将该BinderProxy对象包装成本地的Proxy,并将远程服务端的BinderProxy对象赋值给Proxy类的mRemote字段,就是通过mRemote执行远程方法调用。需要对Binder机制有更深的理解,请参考老罗的Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析。下面我们看一个AIDL实例。

AIDL接口声明

在src目录下创建一个com.example.advanceandroid.aidl包,然后在该包下创建一个ILogin.aidl文件,注意是创建文件而不是类或者接口类型。在ILogin.aidl中声明接口,实例如下 :

package com.example.advanceandroid.aidl;
interface ILogin {
    String login();
}

注意看,接口和方法声明都不用public,方法加入public会提示错误。编写完后如果eclipse开启了自动编译则会在gen/com.example.advanceandroid.aidl下生成一个ILogin.java类,内容大致如下:

package com.example.advanceandroid.aidl; 
public interface ILogin extends android.os.IInterface 
{ 
  /** Local-side IPC implementation stub class. */ 
  public static abstract class Stub extends android.os.Binder implements 
      com.example.advanceandroid.aidl.ILogin 
  { 
    private static final java.lang.String DESCRIPTOR = "com.example.advanceandroid.aidl.ILogin"; 
 
    /** Construct the stub at attach it to the interface. */ 
    public Stub() 
    { 
      this.attachInterface(this, DESCRIPTOR); 
    } 
 
    /** 
     * Cast an IBinder object into an com.example.advanceandroid.aidl.ILogin 
     * interface, generating a proxy if needed. 
     */ 
    public static com.example.advanceandroid.aidl.ILogin asInterface(android.os.IBinder obj) 
    { 
      if ((obj == null)) { 
        return null; 
      } 
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); 
      if (((iin != null) && (iin instanceof com.example.advanceandroid.aidl.ILogin))) { 
        return ((com.example.advanceandroid.aidl.ILogin) iin); 
      } 
      return new com.example.advanceandroid.aidl.ILogin.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_login: {              // 1、登录请求,执行的是this.login(); 
          data.enforceInterface(DESCRIPTOR); 
          java.lang.String _result = this.login(); 
          reply.writeNoException(); 
          reply.writeString(_result); 
          return true; 
        } 
      } 
      return super.onTransact(code, data, reply, flags); 
    } 
 
    private static class Proxy implements com.example.advanceandroid.aidl.ILogin 
    { 
      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 login() throws android.os.RemoteException        // 2、Proxy中的login,通过Binder机制实现IPC 
      { 
        android.os.Parcel _data = android.os.Parcel.obtain(); 
        android.os.Parcel _reply = android.os.Parcel.obtain(); 
        java.lang.String _result; 
        try { 
          _data.writeInterfaceToken(DESCRIPTOR); 
          mRemote.transact(Stub.TRANSACTION_login, _data, _reply, 0); 
          _reply.readException(); 
          _result = _reply.readString(); 
        } finally { 
          _reply.recycle(); 
          _data.recycle(); 
        } 
        return _result; 
      } 
    } 
 
    static final int TRANSACTION_login = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); 
  } 
  public java.lang.String login() throws android.os.RemoteException; 
} 

精彩图集

赞助商链接