Android AIDL实现与服务相互调用

   开发笔记

 通过AIDL接口在进程间传递数据,记录在开发中遇到的一写问题


AIDL支持数据类型如下:

1. Java 的原生类型
2. String 和CharSequence
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型;  以上三种类型都不需要导入(import)
4. AIDL 自动生成的接口  需要导入(import)

5. 实现android.os.Parcelable 接口的类.  需要导入(import)。 


问题1 在传递非基础数据时 在参数前需加修饰
    void getDatas(in byte[] bs);

    void DataWhole(in PackageData data);
}

这里重点是in、out、inout修饰符以及Parcelable的使用!常见的是in、Parcelable,少用的out、inout。

这几种修饰符,可理解如下:

in:客户端的参数输入;

out:服务端的参数输入;

inout:这个可以叫输入输出参数,客户端可输入、服务端也可输入。客户端输入了参数到服务端后,服务端也可对该参数进行修改等,最后在客户端上得到的是服务端输出的参数。


问题2 传递对象时的必要操作

1.必需实现Parcelable接口,内部类必需为静态内部类

2.需在aidl目录创建同类名的AIDL文件,并声明Parcelable,如图

Android AIDL实现与服务相互调用_第1张图片

AIDL文件代码就两行

Android AIDL实现与服务相互调用_第2张图片


问题3 参数大小的限制

如上在传递byte[] 长度大于1024*1024时会抛出  TransactionTooLargeException  异常


问题4 实现与服务之间互相调用

1.在绑定服务时会返回一个实现了AIDL的对象,这样可以通过对象调用服务中对应实现,

2.可以在应用层实现一个AIDL接口的对象,通过绑定服务返回的AIDL对象回传给服务,这样可以在服务中主动调用应用层的方法实现数据回传通知,

//接收回调
INotification notification = new INotification.Stub() {
    @Override
    public void Datas(byte[] bs) throws RemoteException {
        Log.d(TAG, "Datas: 收到数据=" + Arrays.toString(bs));//已测试 最大数据1024*1024
        }
    }
      //传递回调对象
void setNotification(in INotification Notification);

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
    iAidlInterface = IAidlInterface.Stub.asInterface(service);
    try {
        iAidlInterface.setNotification(notification);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}



你可能感兴趣的:(Android AIDL实现与服务相互调用)