ot;remoteService.getPid(): " + pid1 + " remoteService.basicTypes(): " + pid2);
} catch (RemoteException e) {
e.printStackTrace();
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
/*正规做法是设置标记位,标志服务是否已经unbind,来决定是否调用unbindService
* 此处,简便行事,默认此时服务已经unbind
*/
//unbindService(conn);
}
}
4、注意事项
1、Android5.0以后,不允许隐式调用服务,所以必须制定要调用的服务所在的包名(调了一下午才调通)
2、通过客户端的打印结果,可以知道当调用getpid和basicTypes的接口时,服务器端处理客户端调用的线程是不一样的。具体原因需要深入学习下Binder的机制
3、与本地服务的不同在于,服务器端返回的是继承自Binder的Stub类型的Binder,客户端获取服务器端的handle时使用了Stub的asInterface接口。另外服务器端需要在AndroidMainfest.xml中声明服务时指定android:process属性。
4、AIDL中支持以下的数据类型
Java 的原生类型
String 和CharSequence
List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; 以上三种类型都不需要导入(import)
AIDL 自动生成的接口 需要导入(import)
实现android.os.Parcelable 接口的类. 需要导入(import)。
5、总结
使用远程服务流程总结如下;
1、定义AIDL文件,声明该服务需要向外提供的接口
2、在服务器中实现AIDL中定义的接口
3、在AndroidMainfest.xml中声明远程服务
4、客户端中拷贝服务端的AIDL文件
5、客户端中指定服务器的服务名称和所在包,进行绑定
6、客户端使用Stub.asInterface接口获取服务器的hander,调用服务提供的接口