远程Service使用的几个坑

最近项目中要用到Service的多种服务,就把这块没怎么在实际项目使用过的内容给预习下,总结下思路就开始干活了。
学习过程是官方文档+demo练习:
官方文档主要是两部分指南: 1. 绑定服务
2. AIDL
另外写demo练习的时候,遇到几个细节上的坑,就去网上搜帖子,写的好的帖子挺多的,但是提到关键几点有坑的地方的真的是不多,所以基本还是自己调试把坑给踩了。
这里就不贴详细代码和官方文档的翻译了(给出官方链接和demo链接),只写下自己的几点总结,和踩到的几个坑。
首先,说下本地Service/Messenger和远程Service的不同应用场景:
1.本地Service
即应用内部的Service实现,不需要跨进程,比如后台播放音乐或者请求持续请求网络数据的需求。用startService开启,就是需要一个常驻后台的服务;用bindService绑定,可以调用Service实现类中的公有方法。
demo下载:
github
csdn
2.Messenger
跨进程通信,非多线程业务并发。因为是跨进程通信,所以开启intent的时候需要精确创建远程Service的intent;
这里提供一个方法(demo也有):
/**
* 生成指向远程Service的intent
* @param pkgName 远程service应用包名
* @param className 远程service实现类全路径
* @param action
* @return
*/
publicIntentcreateExplicitIntent(String pkgName, String className, String action) {
ComponentName component =new ComponentName(pkgName, className);
Intent intent =new Intent(action);
intent.setComponent(component);
return intent;
}
demo下载:
github 客户端资源
github服务端代码
csdn
3.比较复杂的还是远程service的aidl通信过程,下面按照步骤过下流程
一、 在服务端,src/main/目录下新建一个文件夹,命名为“aidl”,并且在aidl目录下新建和项目包名同样的包目录,也就是和src/main/java/下面的报目录一致,这是"com.example.aidlservice"。
包目录:src/main/aidl/com/example/aidlservice/
然后再上面这个包目录下面新建".aidl"文件,这里是IRemoteService.aidl,并声明接口方法。
选择"Buid - Make Project"之后,会在app/build/generated/source/aidl/debug目录下生成IRemoteService.java方法。
二、 在服务端,继承Service,实现自己的服务类并注册,这里是RemoteService。并继承IRemoteService.Stub实现接口方法的功能代码添加。
三、 【远程Service使用的几个坑】把服务端的src/main/aidl/目录直接拷贝到客户端的main/目录下,然后"Make Project"工程生成接口代码。客户端绑定服务单同样需要用到精确绑定,绑定后可调用服务端接口方法。
demo下载:
github服务端代码
github客户端代码
csdn
然后,介绍下自定义类型参数的传递过程,这里只列下自定义类型的创建步骤,使用代码在上面远程service代码中。
一、 在src/main/java/com/example/aidlservice/目录下新建Person.java类,实现自Parcelable接口,具体实现方式直接看代码。
二、 在src/main/aidl/com/example/aidlservice/目录下新建Person.aidl文件,此文件中只有两行代码,此处可能有人对比之前的.aidl接口文件会蒙圈,反正我刚开始是蒙了,所以截图如下:


远程Service使用的几个坑
文章图片
Person.aidl文件 三、 在声明使用自定义类型的方法的.aidl文件中生命Person类型,截图如下:


远程Service使用的几个坑
文章图片
如果Person.aidl是后来添加的,那么还需要再把整个服务端aidl目录拷贝到客户端,重新"Make Project"。到这里还没有完...
四、 把服务端src/main/java/com/example/aidlservice/目录下的Person.java类拷贝到客户端的src/main/java/com/example/aidlservice/目录下(一般客户端java下的包目录与服务端不一致,那么就新建个一致的包目录)。
自定义类型是在远程service代码上添加的,在同一个demo里。


小结:service的知识点很多,可以翻翻官方文档。如果不太明白流程的可以下载demo看下具体的代码实现,作为参考。
这里只是简单列下步骤和容易出错的点,希望可以帮到不幸踩到坑的人,如有错误和更好的建议,欢迎指出。

    推荐阅读