Android Studio使用aidl实现进程间通信

使用aidl自动生成IBinder接口


aild的写法:
1.package 包名;
2.import <任何非默认类型的类,包括同一包下的>;
3.接口中的数据类型只能是:

  • 基本数据类型,String和CharSequence,List(ArrayList),Map(HashMap),Parcelable,AIDL
  • 若用到自定义的Parcelable类,需要新建同名aidl文件

    // Book.aidl
    import com.gaoxiang.android.test.aidl;
    parcelable Book;
    // Book.java
    package com.gaoxiang.android.test.aidl;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    public class Book implements Parcelable {
        // 省略
    }
  • 除了基本数据类型,其他类型的参数必须标上方向:in(输入型), out(输出型), inout(输入输出型)
  • aidl接口只支持方法,不支持声明静态常量

    // IBookManager.aidl
    interface IBookManager {
        List getBookList();
        void addBook(in Book book);
        void registerListener(IOnNewBookArrivedListener listener);
        void unregisterListener(IOnNewBookArrivedListener listener);
    }

4.build之后,在同一包下,系统自动生成IBookManager.java

直接利用aidl方式实现IPC


  • aidl包:
    首先新建aidl包,新建所需的Parcelable类,定义用到的aidl接口,build后自动生成aidl接口,将aidl
    包复制到服务端应用和客户端应用。

  • 服务:

(1) anifest允许外部应用访问`android:exported=”true”

<service
     android:name=".service.BookManagerService"
     android:enabled="true"
     android:exported="true"
     android:process=":remote">
 service>

(2) 定义实例实现aidl接口中的抽象方法

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

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

    @Override
    public void registerListener(IOnNewBookArrivedListener listener) throws RemoteException {
        mListenerList.register(listener);
    }

    @Override
    public void unregisterListener(IOnNewBookArrivedListener listener) throws RemoteException {
        mListenerList.unregister(listener);
    }
};

(3) 重写IBinder onBind(Intent)方法,返回aidl接口的实现类

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}   
  • 客户端:

(1) 新建ServiceConnection实例,实现onServiceConnected()

public void onServiceConnected(ComponentName name, IBinder service) {
    // 通过asInterfac(IBinder)获得服务端的aidl接口的实现类
    mBinderPool = IBinderPool.Stub.asInterface(service);
    // 省略
}

(2) 绑定服务

Intent intent = new Intent();
// 应用包名,和服务包名
intent.setComponent(new ComponentName("com.gaoxiang.android.test",
    "com.gaoxiang.android.test.service.BookManagerService"));
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

参考资料


[1] 《Android开发艺术探索》, 任玉刚. https://book.douban.com/subject/26599538/

你可能感兴趣的:(Android)