android AIDL在同一工程下的使用方式
2020-04-25 本文已影响0人
heheworld
AIDL 一直都有听说,主要应用场景是跨进程通信,分客户端和服务端,网上的代码一大堆。最近项目刚好用到,手写下遇到很多问题,记下来。
需求:同一个工程,一个service使用remote 作为独立进程中的service,需要跟主进程通信,service中负责轮询数据,有特定数据后,传递给主进程。
但网上demo多是写Client,Server两个工程,也都是Client主动发起的一次性请求,只能自己倒腾了。不写不知道,一写发现好多地方都卡壳了,记下来
-
Q:只有一个工程,但需要通过aidl实现跨进程,怎么弄?
截图如下: a.png
A: 正常操作,在/src/main目录下,建立跟java同级的aidl文件夹,新建对应的aidl文件(包名跟java下的包名一致,记得是自动建立的,如果不是,就手动建下)
-
Q:AIDL 内需引用到自定义的类和接口,怎么办?
A: 正常写AIDL文件,但自定义类需要实现parcelable接口(parcelable类型),在引用文件内需手动import下该自定义类。
如下IMyAidlInterface 使用到了 Student类,则对应的AIDL应该这么写:
// Student.aidl
package com.nico.test4aidl;
// Declare any non-default types here with import statements
parcelable Student; //Student.aidl 表示是个parcelable 类型的对象,供其他AIDL接口使用
// IMyAidlInterface.aidl
package com.nico.test4aidl;
// Declare any non-default types here with import statements
import com.nico.test4aidl.Student; //这里手动引入Student
import com.nico.test4aidl.IMyCallback;
interface IMyAidlInterface {
Student getStudent();
void changeData();
void registerCallback(IMyCallback callback);
void unRegisterCallback();
}
如果用到其他的接口,(我这边需求是客户端通过aidl在服务端注册,服务端在处理,如果有触发会通知客户端,于是通过aidl
可以这么来写)
// IMyCallback.aidl
package com.nico.test4aidl;
// Declare any non-default types here with import statements
interface IMyCallback {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void callback(boolean flag); //客户端给服务端的回调方法
}
- Q: 怎么启动?
A:正常bindservice,startservice都可以,Intent 是使用setComponent来指定对应的service。服务端service在配置文件里加上:remote。
大概就这么多了。平时还是需要多写代码,纸上得来终觉浅。
最后,遇到一个问题,在服务端的service内,aidl接口方法想调用service内的方法,kotlin来写总是提示不对,java写就没问题,对kotlin不熟悉,没有深入去研究。