android中使用AIDL

android中可以使用AIDL定义接口,实现进程间通信。 这个和COM等组件技术原理是一样的。

需要注意的有:

1. AIDL中定义的接口和方法名是不需要权限修饰符的.

2. AIDL中方法的返回类型如果是java基本基本类型则不需要import其他包和接口。

3. AIDL中一般只能import AIDL接口。不能import java的接口,但是List等java接口可以使用。

3. AIDL中方法的返回类型如果是自定义类,则该自定义的类需要:

    a. 创建该类名的.aidl文件。

    b. 实现Parcelable接口, 并生成CREATOR实例。


  例如  SongService.aidl文件定义:

import com.bean.SongInfo;
interface SongService {
    List<SongInfo> getSongs();
}

SongInfo.java文件定义

public class SongInfo {
        private int id;
    private String path;

   /* 
   省略 getter 和 setter
   */
}

I.  首先我们需要在 SongInfo.java文件所在目录下创建SongInfo.aidl文件。否则SongService.aidl中不能import SongInfo.

  SongInfo.aidl 文件内容很简单, 只需要加上:

  package com.bean.SongInfo;
  parcelable SongInfo;


II. 实现Parcelable接口。

import android.os.Parcel;
import android.os.Parcelable;

public class SongInfo implements Parcelable {
    private int id;
    private String path;

    /*
     * Ignore the setter and getter
     */


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int arg1) {
        out.writeInt(id);
        out.writeString(path);
    }

}
III. 其实到这里,准备工作还没有完成。 实现了Parcelable接口只是实现了Stub端生成的SongInfo 对象的打包和序列化,并没有完成对象传到Proxy端后解包和反序列化。android的框架中一般是实现一个静态的变量CREATOR.来实现解包和反序列化。

import android.os.Parcel;
import android.os.Parcelable;

public class SongInfo implements Parcelable {
    private int id;
    private String path;

    /*
     * Ignore the setter and getter
     */


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int arg1) {
        out.writeInt(id);
        out.writeString(path);
    }

    public static final Parcelable.Creator(SingInfo> CREATOR = new Parcelable.Creator<SongInfo>() {
        public SongInfo createFromParcel(Parcel in) {
            return new SongInfo(in);
        }

        public SongInfo[] newArray(int size) {
            return new SongInfo[size];
        }
    };


    /*
     * Add constructor here
     */

    public SongInfo(Parcel in) {
        id = in.readInt();
        path = in.readString();
    }

}

这里需要注意的是变量的读和写顺序是一致的,否则变量传递就会出现混乱。如果某个变量没有实现序列化和反序列化,该变量就不能正确传递。至此, AIDL部分准备好了,如果没有错误ADT会自动解析AIDL文件,生成对应的java文件。


在android中,最常见的场景是在Service中定义一些方法,供其他Activity调用.我们可以在Service中生成一个 SongService.Stub的实例, 并实现SongService.Stub中我们定义的接口, 在Activity中我们就可以调用bindService方法,ServiceConnection回调接口中,onServiceConnected()方法的的IBinder参数就是SongService 实例, 通过SongService.Stub.asInterface(ibinder) 取得SongService实例后, 就可以调用AIDL中定义的方法了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android AIDLAndroid Interface Definition Language)是一种用于定义客户端和服务之间通信接口的语言。AIDL 是一个 Android 特有的 RPC(远程过程调用)机制。 下面是使用 AIDL 的基本步骤: 1. 定义 AIDL 接口 在服务端创建一个 AIDL 文件,定义服务的接口方法。例如,创建一个名为 IMyService.aidl 的文件,其包含以下内容: ``` interface IMyService { void sayHello(); } ``` 2. 实现 AIDL 接口 在服务端实现 AIDL 接口,例如: ``` public class MyService extends Service { private final IMyService.Stub binder = new IMyService.Stub() { @Override public void sayHello() throws RemoteException { Log.i("MyService", "Hello World"); } }; @Nullable @Override public IBinder onBind(Intent intent) { return binder; } } ``` 3. 绑定服务 在客户端绑定服务,例如: ``` private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyService myService = IMyService.Stub.asInterface(service); try { myService.sayHello(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; private void bindService() { Intent intent = new Intent(this, MyService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE); } ``` 通过上述步骤,就可以实现客户端与服务端之间的通信。需要注意的是,AIDL 接口定义的方法必须是可序列化的。如果方法参数或返回值类型不支持序列化,可以通过 Parcelable 接口实现序列化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值