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开发艺术探索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值