博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android绑定Service失败原因
阅读量:5924 次
发布时间:2019-06-19

本文共 1032 字,大约阅读时间需要 3 分钟。

hot3.png

.清单文件中没有加service字段,即便service是jar包中的,也需要在清单文件中注册

2.远程服务没有启动

   在Android中,当我们跨进程启动或者绑定一个Service,当时不能保证第一次就能成功,比如,远程的Service还没起启动成功,需要过一段时间才行,当没有绑定成功后,我们通过aidl来调用RemoteServcie就会出现Null错误,即ServiceConnection中的onServiceConnected()还未被回调,没有给本地远程服务代理赋值。

          为了解决绑定或者启动没有成功的问题,我们可以使用循环绑定策略,即发现并未绑定成功,我们再次绑定,但是又不能无限循环,因为,假如远程就是没有了,无限循环绑定就会出现错误。所以必须还有定个循环绑定次数。

          当我们使用远程Service的本地代理时候,先判断它是否为null,若为null,则执行循环绑定操作,并且制定一个循环绑定次数限制,比如是3,每次循环后次数限制就做减一操作,当减为0时候,表示远程服务出现错误,则不再执行循环绑定操作。

          在执行循环绑定操作时候,我们可以使用延迟绑定操作,就是延迟几毫秒再绑定,这样,就确保Remote Service启动时间是足够的。可以通过编写一个Handler,使用handler.sendMessageDelayde(Messagee msg, long delayMillis)操作来延迟。

3.服务自己销毁

   当我们实现自己的aidl的Service时候,我们需要自己销毁Servcie,因为外界可能只是startService(),并不会调用stopServcie()操作,另一方面,当我们Service做完工作后,将自己销毁,也节省cpu,因此自己销毁Servcie就显得非常重要。

          Service中,自己销毁操作就是本身调用stopSelf()函数,但是何时调用该函数才是重点,我们可以通过任务队列实现。

          当Service中,我们为所有Tasks创建一个队列,当client端调用Service时候,每推进一个Task,就将该Task插入到该队列中,当执行完一个Task后,就从队列中删除,然后判断该队列是否为空,若为空则执行stopService()操作。(个人喜欢broadcast来处理)

--------------------- 
 

转载于:https://my.oschina.net/u/920274/blog/3049733

你可能感兴趣的文章
maven安装和四大特性
查看>>
【OCP|052】OCP最新题库解析系列-3
查看>>
django 一对多,多对多关系解析
查看>>
配置percona mysql server 5.7基于gtid主主复制架构
查看>>
Windows2016的 IIS中配置PHP7运行环境
查看>>
浏览器image对象相关总结,(含PC浏览器,移动浏览器)
查看>>
实验报告五
查看>>
ORB0-SLAM2 system.h 阅读
查看>>
ueditor编辑器使用总结
查看>>
ssh整合之七注解结合xml形式
查看>>
[C puzzle book] Programming styles
查看>>
Javascript&Jquery获取浏览器和屏幕各种高度宽度方法总结及运用
查看>>
js懒加载
查看>>
小波变换 完美通俗解读【转载】
查看>>
python练习---校园管理系统
查看>>
小程序简介
查看>>
表格行的偶数与奇数
查看>>
基础数据类型之列表,元组
查看>>
1124 Raffle for Weibo Followers
查看>>
如何对文献进行阅读与整理
查看>>