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() {@Overridepublic 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的组件