AIDL:注意事项

aidl入门

aidl方法参数tag out与实体类中readFromParcel的关系?

目前可以确定:使用了out,而不提供readFromParcel,build报错:缺乏readFromParcel方法

实现parcelable的实体类中必须重写:
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //一定要有此行,否则获取aidl接口方法返回的diy类型的对象相应属性为空(传回的diy对象不为空,属性为空    )
        dest.writeString(mName);
    }

用Android studio时,先建.aidl,然后在建同名的.java文件,要不然AS会提示“Interface name must be unique”

把serverApp中编写的aidl接口文件、aidl类型声明文件、相关的实体类连同它们所在的包一起cp到clientApp,绝对不能修改aidl和实体类的全限定名
这样serverApp和clientApp才都会认可这个接口

定义完aidl,build后生成java接口,接下来的用法和在一个app中使用bindService()类似,只不过要bind的service在另一个app中,需要做特殊的处理,即AIDL

不同的是:

private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //在clientAPP中使用如下方法,获取serverAPP的接口实现类对象
            IBookMgr iBookMgr = IBookMgr.Stub.asInterface(service);
        ......

把aidl相关的java实体类放到aidl文件夹中,比较方便转移
但要注意:在module的build.gradle文件的andorid{}中添加如下代码
   

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


这样,编译系统会在'src/main/java'和'src/main/aidl'中寻找java类,即便java实体类放到aidl文件夹中,也能够被找到 

serverApp定义Book getBook()方法 --> 返回对象给 --> clientApp,即在clientApp中调用getBook()得到返回值
server执行了实体类的writeToParcel方法 | client执行了实体类的createFromParcel方法
                                                                打包 --> 解包

clientApp调用server定义的void setBook(in Book book)方法 --> 传参给 --> serverApp
                         client执行了实体类的writeToParcel方法 | server执行了实体类的createFromParcel方法
                                                                                        打包 --> 解包 

为了使client中的隐式intent能够匹配到server中的service,必须有如下设定:

server中注册service组件时,添加:

<intent-filter>
    <action android:name="com.clc.app21s.bookMgr"/>
    //表示支持接收隐式intent
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

client中的隐式intent设置如下:

Intent intent = new Intent();
intent.setPackage("com.clc.app92s");//定位到包,即app
intent.setAction("com.clc.app21s.bookMgr");//定位到特定action的组件

猜你喜欢

转载自blog.csdn.net/qq_38861828/article/details/104846732