Android:对Service的一点理解2

对于bind服务单应用,在编写中发现,实际上bind服务只是繁琐,难度倒是没有多少,在服务中要记得去建立一个内部binder类,在onbind中对它的实例进行返回。在该内部类中对service中函数进行调用,如果需要提高安全性,则将该内部类进行private访问权限设置后,使用一个接口去封装它需要被我们main程序调用到的函数后,让该内部类继承该接口。之后在Activity中的serviceconnect中使用该接口来进行强制转换传来的ibinder参数,得到我们的binder类型对象。之后在Activity中使用该对象对服务中函数进行调用,这样我们就可以访问到服务中的函数了。


在应用运行后我发现,该程序在绑定并且解绑后,同样可以通过此时已经传递到Activity中的binder来对服务中的程序进行调用,估计是底层还没关掉吧,不然此时服务已经关闭了。亦或者是此时一整个binder都已经传到Activity中了?以后还要再研究下。




对于服务的混合运用,先来说下正常流程。
首先是startservice,开启服务;---------oncreat onstartcommand  onstart
之后是bindservice,绑定服务;--------onbind onstartcommand    onstart(忘记具体有没有了)
其次是unbindservice,服务放开--------onunbind 
最后是stopservice,停止服务--------ondestroy


Ps.服务已开启状态下的连接bindservice时后台服务程序的调用和服务未开启时直接绑定后开启服务的后台程序是不一样的,前者有onstartcommand onstart,后者没有这两个。


PPS.要记得  如果是用startservice来开启服务,之后再使用bindservice去对服务进行绑定,这个时候,你如果用stopservice来进行服务注销的话,是不会成功的,即服务此时不对该stop做出反应,而当你这个时候选择使用unbind来取消绑定,服务不止会取消绑定,而且会把程序也关闭。
即该流程为
startservice,开启服务;---------oncreat onstartcommand  onstart
bindservice,绑定服务;--------onbind onstartcommand    onstart
stopservice,停止服务--------无反应
unbindservice,服务放开--------onunbind ondestroy


这个对我们服务的控制会产生一些小问题,有时候仅仅需要解绑而不是销毁服务的时候,可能点击错误stopservice后点击unbindservice导致程序销毁,要注意。


避免该问题发生,方法有点忘记了,我再去问下下次、、、、、


另外呢,今天还学习了服务的不同进程间调用。
首先服务类存在于一个程序中,该程序的Activity中不管该服务是否被调用,即该服务存在于该进程并且被注册,且intentfilter有action属性,方便其他类对它进行隐式访问。
其次,正如上文所说的,为了安全而采用的那个接口,在我们另外一个程序中此时是看不到的,这个时候我们应该运用aidl,进行进程间的数据传递,即把我们的interface接口后缀名改成.aidl,此时可能会报错,去掉一些public修饰符即可。
改成aidl后,我们在另外的需要调用该服务的进程中,intent意图内使用setaction来对该服务进行隐式调用,对于其它的操作和我们之前同进程内的类似,但是,这个时候我们ibinder的创建要怎么进行呢。
首先,需要在该进程中src文件夹下新建一个和之前包同名的包(还未测试是否必要,应该没必要),在该空白包中复制之前修改了后缀的aidl接口文件到该包中,保存后发现此时R文件旁边多了一个我们之前写的接口的.java后缀,表明此时该文件中出现了该接口,我们可以进行调用了。在Activity中,使用该接口来定义该实例,之后在serviceconnect中,对于传来的参数,不是直接的赋值该该实例,一般这个时候我们会使用一个Stub类对它进行插入后得到的类对象赋值给该接口,之后就没问题了,我们就可以完成进程间的交互。
Ps.之前在单运用程序中的取消绑定后一样可调用服务函数的事情同样会发生。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值