寫給初學者,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么?

分享到: 更多
快速时时的套路 时时彩龙虎免费计划 欢乐生肖开奖结果 快三稳赚口诀 网球比分 pk10模式长期稳赚6码倍投 三公九卿制 pk10两码精准计划 有通比牛牛的游戏中心 分分pk10精准在线计划 网上游戏棋牌 上海时时最快开奖结果查询结果 看牌抢庄牛牛真人版 赛车pk10的开奖记录98 福利彩票www 全天北京pk赛车计划51