一步一步的写一个简单的AIDL服务接口
2020-07-08 本文已影响0人
StoneWay3
1.项目中新建一个自定义的服务类继承系统服务,并且实现onbind方法
public class AidlDemoService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
2.在manifest中注册该服务
<service
android:name=".AidlDemoService"
android:process=":aidldemo">
<intent-filter>
<action android:name="action.com.stone.aidldemo.AidlDemoService" />
</intent-filter>
</service>
3.新建aidl文件,名字我们叫它IAidlService.aidl
注意:文件必须建立在main下面跟java同级,并且跟服务的包名一直,否则的话编译不出来接口;
新建aidl文件.png文件中引入服务的包名(跟其他的java类的包名引入方式相同)
引入服务包名.png4.编辑aidl文件,并且定义好我们的接口
注意:文件里面的注释最好不要有中文,否则的话可能编译不出来接口;
编辑aidl.png5.build -> make project
等到项目编译结束以后,在服务中如果能够找到IAidlService这个类,那么说明已经成功编译出来了
6.编译成功以后,在服务中心实现我们的接口
声明接口.png7.服务的oncreat方法中可以进行一些初始化
@Override
public void onCreate() {
super.onCreate();
//todo:初始化一些东西
}
8.在服务的onbind中返回我们的接口
@Nullable
@Override
public IBinder onBind(Intent intent) {
return stub;
}
9.可以在接口中写一些我们想要的功能和方法了
private IAidlService.Stub stub = new IAidlService.Stub() {
@Override
public int getIntCount() throws RemoteException {
return intCount;
}
@Override
public void getVoidMethod() throws RemoteException {
Toast.makeText(AidlDemoService.this, "调用这个void方法了" + voidCount + "次", Toast.LENGTH_LONG).show();
voidCount+=1;
}
@Override
public void setParas(int count) throws RemoteException {
intCount += count;
Toast.makeText(AidlDemoService.this, "参数已经接收", Toast.LENGTH_LONG).show();
}
@Override
public String getStringData() throws RemoteException {
return "调用的void字符串";
}
@Override
public String getStringByString(String str) throws RemoteException {
return "哈哈你传过来的参数是:"+str;
}
};
10.启动服务
启动服务.png11.服务连接
服务连接.png12.服务内方法的使用:
方法调用.png13.服务解绑
服务解绑.png.......................................................................................................
************************************服务传递对象 ****************************************
以上说的是服务传递简单的数据类型,比如说int,string,long,double等,有时候需要传递对象,那么就要在做一些工作了。
1新建需要传递的bean对象。比如UserInfoBean.
2.设置好我们需要的参数,实现get和set方法,并且序列化(Parcelable)
3.跟服务一样在同样的报名目录下新建一个aidl文件UserInfoBean.aidl,这里为了再次强调包名一致,所以我们将bean类信件了一个包
bean对象的项目结构.png4.将UserInfoBean的包名复制到UserInfoBean.aidl文件中,并且声明一下:parcelable UserInfoBean;
bean.png5.在IAidlService.aidl中引入UserInfoBean:
import com.stone.aidldemo.bean.UserInfoBean;
并且创建相应的方法:
import com.stone.aidldemo.bean.UserInfoBean;
6.build->make project
AidlDemoService中实现接口方法,就可以了
至此,aidl基本的用法和不走已经差不多了,当然还有很多需要优化和改善的地方,希望各位看官不吝赐教,最后祝大家事业有成。
最后写了一个粗糙简单的demo,github