远程Service使用的几个坑

最近项目中要用到Service的多种服务,就把这块没怎么在实际项目使用过的内容给预习下,总结下思路就开始干活了。

学习过程是官方文档+demo练习:

官方文档主要是两部分指南:
1. 绑定服务

  1. AIDL

另外写demo练习的时候,遇到几个细节上的坑,就去网上搜帖子,写的好的帖子挺多的,但是提到关键几点有坑的地方的真的是不多,所以基本还是自己调试把坑给踩了。

这里就不贴详细代码和官方文档的翻译了(给出官方链接和demo链接),只写下自己的几点总结,和踩到的几个坑。

首先,说下本地Service/Messenger和远程Service的不同应用场景:
1.本地Service
即应用内部的Service实现,不需要跨进程,比如后台播放音乐或者请求持续请求网络数据的需求。用startService开启,就是需要一个常驻后台的服务;用bindService绑定,可以调用Service实现类中的公有方法。

demo下载:

https://download.csdn.net/download/u013168615/10289011

2.Messenger
跨进程通信,非多线程业务并发。因为是跨进程通信,所以开启intent的时候需要精确创建远程Service的intent;

这里提供一个方法(demo也有):

/**

  • 生成指向远程Service的intent

  • @param pkgName 远程service应用包名

  • @param className 远程service实现类全路径

  • @param action

  • @return

*/

public IntentcreateExplicitIntent(String pkgName, String className, String action) {

ComponentName component =new ComponentName(pkgName, className);

Intent intent =new Intent(action);

intent.setComponent(component);

return intent;

}

demo下载:

https://download.csdn.net/download/u013168615/10289008

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实现接口方法的功能代码添加。

三、
把服务端的src/main/aidl/目录直接拷贝到客户端的main/目录下,然后”Make Project”工程生成接口代码。客户端绑定服务单同样需要用到精确绑定,绑定后可调用服务端接口方法。

demo下载:

https://download.csdn.net/download/u013168615/10291771

然后,介绍下自定义类型参数的传递过程,这里只列下自定义类型的创建步骤,使用代码在上面远程service代码中。
一、
在src/main/java/com/example/aidlservice/目录下新建Person.java类,实现自Parcelable接口,具体实现方式直接看代码。

二、
在src/main/aidl/com/example/aidlservice/目录下新建Person.aidl文件,此文件中只有两行代码,此处可能有人对比之前的.aidl接口文件会蒙圈,反正我刚开始是蒙了,所以截图如下:

Person.aidl文件
三、
在声明使用自定义类型的方法的.aidl文件中生命Person类型,截图如下:

如果Person.aidl是后来添加的,那么还需要再把整个服务端aidl目录拷贝到客户端,重新”Make Project”。到这里还没有完…

四、
把服务端src/main/java/com/example/aidlservice/目录下的Person.java类拷贝到客户端的src/main/java/com/example/aidlservice/目录下(一般客户端java下的包目录与服务端不一致,那么就新建个一致的包目录)。

自定义类型是在远程service代码上添加的,在同一个demo里。

小结:service的知识点很多,可以翻翻官方文档。如果不太明白流程的可以下载demo看下具体的代码实现,作为参考。

这里只是简单列下步骤和容易出错的点,希望可以帮到不幸踩到坑的人,如有错误和更好的建议,欢迎指出。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值