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中定义的方法了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值