Android AIDL學習(三)

1.概述

AIDL必須使用Java語言構建.aidl文件,每個.aidl文件都必須定義單個接口,並且只需包含接口聲明和方法簽名;

2.AIDl所支持的數據類型

2.1Java中基本數據類型,例如Int 、byte、Boolean、double、float、long等

2.2String

2.3CharSequence

2.4List 、Map等

3.使用流程

3.1創建AIDL接口,首先創建一個實體類Book;

package com.example.app3;

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

public class Book implements Parcelable {
    public int bookId;
    public String bookName;

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

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

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

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

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

3.2創建Book.aidl和IBookManager.aild

// Book.aidl
package com.example.app3;

parcelable Book;

package com.example.app3;
import com.example.app3.Book;
interface IBookManger {
  List<Book>getBookList();
  void addBook(in Book book);
}

此處注意在創建AIDL時,在AIDl使用某一個類,即使在統一報名下,也要添加其出處以及新建一個同名的AIDL對象,例如Book類。

3.3創建遠程服務端的Service

package com.example.app3;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class BookManagerService extends Service {

    private static final  String TAG="AIDLS";

    private CopyOnWriteArrayList<Book>mBookList=new CopyOnWriteArrayList<>();

    private Binder mBinder=new IBookManger.Stub() {
        @Override
        public List<Book> getBookList() throws RemoteException {
            return mBookList;
        }

        @Override
        public void addBook(Book book) throws RemoteException {

        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        mBookList.add(new Book(1,"Android開發藝術探索"));
        mBookList.add(new Book(2,"Java核心代碼"));
    }

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

3.4客戶端實現

當服務端綁定成功後將服務器返回的Binder對象轉換爲AIDL接口,然後藉此去掉用服務端的遠程方法。客戶端具體如下

public class MainActivity extends AppCompatActivity {

    private static final String TAG="MainActivity";

    private ServiceConnection mConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            IBookManger manager=IBookManger.Stub.asInterface(service);
            try {
                List<Book>bookList=manager.getBookList();
                Log.i(TAG,"查詢圖書目錄,目錄的類型:"+bookList.getClass().getCanonicalName());
                Log.i(TAG,"圖書目錄信息:"+bookList.toString());
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent(this,BookManagerService.class);
        bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
    }

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

到此一個簡單的AIDL調用就完成了。

參考資料

Android開發藝術探索

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章