.清单文件中没有加service字段,即使service是jar包中的,也须要在清单文件中注册函数
2.远程服务没有启动代理
在Android中,当咱们跨进程启动或者绑定一个Service,当时不能保证第一次就能成功,好比,远程的Service还没起启动成功,须要过一段时间才行,当没有绑定成功后,咱们经过aidl来调用RemoteServcie就会出现Null错误,即ServiceConnection中的onServiceConnected()还未被回调,没有给本地远程服务代理赋值。队列
为了解决绑定或者启动没有成功的问题,咱们可使用循环绑定策略,即发现并未绑定成功,咱们再次绑定,可是又不能无限循环,由于,假如远程就是没有了,无限循环绑定就会出现错误。因此必须还有定个循环绑定次数。进程
当咱们使用远程Service的本地代理时候,先判断它是否为null,若为null,则执行循环绑定操做,而且制定一个循环绑定次数限制,好比是3,每次循环后次数限制就作减一操做,当减为0时候,表示远程服务出现错误,则再也不执行循环绑定操做。ci
在执行循环绑定操做时候,咱们可使用延迟绑定操做,就是延迟几毫秒再绑定,这样,就确保Remote Service启动时间是足够的。能够经过编写一个Handler,使用handler.sendMessageDelayde(Messagee msg, long delayMillis)操做来延迟。io
3.服务本身销毁ast
当咱们实现本身的aidl的Service时候,咱们须要本身销毁Servcie,由于外界可能只是startService(),并不会调用stopServcie()操做,另外一方面,当咱们Service作完工做后,将本身销毁,也节省cpu,所以本身销毁Servcie就显得很是重要。cli
Service中,本身销毁操做就是自己调用stopSelf()函数,可是什么时候调用该函数才是重点,咱们能够经过任务队列实现。循环
当Service中,咱们为全部Tasks建立一个队列,当client端调用Service时候,每推动一个Task,就将该Task插入到该队列中,当执行完一个Task后,就从队列中删除,而后判断该队列是否为空,若为空则执行stopService()操做。(我的喜欢broadcast来处理)
---------------------
service