Android Aidl使用

簡(jiǎn)介

在android中,常常一個(gè)應(yīng)用需要和另外一個(gè)應(yīng)用進(jìn)程跨進(jìn)程通信,這就不可避免地涉及到了跨進(jìn)程通信。android有種多種方式可以達(dá)到跨進(jìn)程通信的目的,例如文件共享,Bundle,Messenger,Aidl。文件共享存在并發(fā)讀寫(xiě)的問(wèn)題,Bundle傳遞參數(shù)只能局限于基本數(shù)據(jù)類型以及實(shí)現(xiàn)了Parceable或者Serializable接口的對(duì)象 ,本文主要介紹Aidl跨進(jìn)程通信

客戶端實(shí)現(xiàn)

  • 定義一個(gè)實(shí)體類實(shí)現(xiàn)Parcelable接口

public class Book implements Parcelable {

    public int bookId;

    public String bookName;

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(this.bookId);
        dest.writeString(this.bookName);
    }

    public Book() {
    }

    public Book(int bookId, String bookName) {
        this.bookId = bookId;
        this.bookName = bookName;
    }

    protected Book(Parcel in) {
        this.bookId = in.readInt();
        this.bookName = in.readString();
    }

    public static final Parcelable.Creator<Book> CREATOR = new Parcelable.Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel source) {
            return new Book(source);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

  • 定義一個(gè)Book.aidl類
package com.apache.android.aidl;

parcelable Book;

  • 定義接口通信aidle文件
interface IBookManager {

   List<Book> getBookList();

   void addBook(in Book book);
}

注意這里有一個(gè)坑,就是這里將Book.java和Book.aidl是同在aidl目錄下的(出于方便移植的目的 ),但是android studio在編譯的時(shí)候會(huì)報(bào)錯(cuò),提示找不到Book.java類, 原因是Android Studio 是使用gradle來(lái)構(gòu)建項(xiàng)目的,而Gradle構(gòu)建項(xiàng)目的時(shí)候會(huì)通過(guò)SourceSet來(lái)配置不同的訪問(wèn)路徑,從而加快查找速度-問(wèn)題就出在這里,Gradle 默認(rèn)是將java代碼的訪問(wèn)路徑放在java目錄下的,這樣一來(lái)如果java代碼放在aidl目錄下,gradle自然就找不到這個(gè)java文件了,解決辦法是在gradle中把a(bǔ)idl目錄也配置到sourceSet中去

 sourceSets{
        main{
            java.srcDirs = ['src/main/java', 'src/main/aidl']
        }
    }

遠(yuǎn)程服務(wù)端實(shí)現(xiàn)

定義一個(gè)BookManagerService服務(wù),在manifest清單文件中配置為 remote進(jìn)程

public class BookManagerService extends Service {
    private CopyOnWriteArrayList<Book> mBookList = new CopyOnWriteArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        mBookList.add(new Book(1,"android"));
        mBookList.add(new Book(2,"ios"));
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    private IBinder binder = new IBookManager.Stub() {
        @Override
        public List<Book> getBookList() throws RemoteException {
            return mBookList;
        }

        @Override
        public void addBook(Book book) throws RemoteException {
            mBookList.add(book);
        }
    };
}

創(chuàng)建一個(gè)IBinder對(duì)象并在onBinder方法中返回,這個(gè)對(duì)象繼承自IBookManager.Stub,并實(shí)現(xiàn)它內(nèi)部的Aidl方法

客戶端使用

客戶端使用就比較簡(jiǎn)單了, 綁定遠(yuǎn)程服務(wù),綁定成功后將服務(wù)端返回的Binder對(duì)象轉(zhuǎn)換成Aidlj可口,然后就可以通過(guò)這個(gè)接口去調(diào)用服務(wù)器端的方法了


     Intent intent = new  Intent(this,BookManagerService.class);
    bindService(intent,connection, Context.BIND_AUTO_CREATE);
    

    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            NLog.d(TAG, "onServiceConnected");

            manager = IBookManager.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            NLog.d(TAG, "onServiceDisconnected");
            manager = null;
        }
    };

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);
    }




    private void addBook(){
        try {
            if (manager == null){
                return;
            }
            Book book = new Book(mCount.getAndAdd(1), "Android進(jìn)階: "+mCount.get());
            manager.addBook(book);
            printBookList();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android跨進(jìn)程通信IPC整體內(nèi)容如下 1、Android跨進(jìn)程通信IPC之1——Linux基礎(chǔ)2、Andro...
    隔壁老李頭閱讀 10,971評(píng)論 13 43
  • AIDL(Android Interface Definition Language) 程序員可以利用AIDL自定...
    AnRFDev閱讀 3,206評(píng)論 3 5
  • 一、Android IPC簡(jiǎn)介 IPC是Inter-Process Communication的縮寫(xiě),含義就是進(jìn)程...
    SeanMa閱讀 2,049評(píng)論 0 8
  • Jianwei's blog 首頁(yè) 分類 關(guān)于 歸檔 標(biāo)簽 巧用Android多進(jìn)程,微信,微博等主流App都在用...
    justCode_閱讀 6,118評(píng)論 1 23
  • 「勇敢」 你寫(xiě)了一首情歌 只唱了一遍 就打濕了我的雙眼 在我的午夜夢(mèng)回 在我的心底深處 種下了一粒種子 開(kāi)出了思念...
    柢木沐閱讀 290評(píng)論 0 0

友情鏈接更多精彩內(nèi)容