写给初学者,Android AIDL必看内容

  更好的设计Android软件应该熟悉掌握AIDL IPC机制,可以让你编写的组件类似Windows ActiveX COM一样更好的复用,提供类似像Symbian那样的服务器机制。服务可以很好的解决在后台运行无UI的窗口。我们创建一个aidl文件名为android123.aidl下面是示例代码,修改于Android SDK文档。

  一、创建AIDL文件

package cn.com.android123;

  引入声明 import cn.com.android123.IAtmService;

// 声明一个接口,这里演示的是银行ATM程序

interface IBankAccountService {

    

    int getAccountBalance(); //返回整数,无参数

    void setOwnerNames(in Listnames); //不返回,包含一个传入List参数

    BankAccount createAccount(in String name, int startingDeposit, in IAtmService atmService); //返回一个自定义类型

    int getCustomerList(in String branch, out String[] customerList); //返回整形,输入一个分支,输出一个客户列表

}

  二、实现一个接口

  显示的提供一个导出接口,为客户端提供绑定。

public class RemoteService extends Service {

    @Override

    public IBinder onBind(Intent intent) {

        if (IRemoteService.class.getName().equals(intent.getAction())) {

            return mBinder;

        }

        if (ISecondary.class.getName().equals(intent.getAction())) {

            return mSecondaryBinder;

        }

        return null;

    } //第一个接口

    private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {

        public void registerCallback(IRemoteServiceCallback cb) {

            if (cb != null) mCallbacks.register(cb);

        }

        public void unregisterCallback(IRemoteServiceCallback cb) {

            if (cb != null) mCallbacks.unregister(cb);

        }

    };//第二个接口

    private final ISecondary.Stub mSecondaryBinder = new ISecondary.Stub() {

        public int getPid() {

            return Process.myPid();

        }

        public void basicTypes(int anInt, long aLong, boolean aBoolean,

                float aFloat, double aDouble, String aString) {

        }

    };

}

  三、客户端交互

  通过Android.os提供的Parcelable类型来传递数据,通常我们使用Eclipse+ADT插件来完成,在Eclipse中在Package Explorer view视图上单击鼠标右键,选择Create Aidl preprocess file for Parcelable classes(创建aidl预编译文件),最终我们创建一个名为android123.aidl文件

import android.os.Parcel;

import android.os.Parcelable;

public final class Rect implements Parcelable {

    public int left;

    public int top;

    public int right;

    public int bottom;

    public static final Parcelable.CreatorCREATOR = new Parcelable.Creator() {

        public Rect createFromParcel(Parcel in) {

            return new Rect(in);

        }

        public Rect[] newArray(int size) {

            return new Rect[size];

        }

    };

    public Rect() {

    }

    private Rect(Parcel in) {

        readFromParcel(in);

    }

    public void writeToParcel(Parcel out) { //当前数据写入到Parcel中

        out.writeInt(left);

        out.writeInt(top);

        out.writeInt(right);

        out.writeInt(bottom);

    }

    public void readFromParcel(Parcel in) { //从Parcel中读取数据

        left = in.readInt();

        top = in.readInt();

        right = in.readInt();

        bottom = in.readInt();

    }

}


上一篇: Binder中的asInterface解析willhua

下一篇: 换了你,能做好Opensource么?

分享到: 更多