Android:对service的一点理解1

来源:互联网 发布:sql server数据库知识 编辑:程序博客网 时间:2024/06/06 21:42

对于service,它是系统的四大控件之一,它和Activity一样,我们在创建之后,需要在manifest中进行注册。


对于service,今天学习了它的两种调用方式。
一个是基于startservice的开启服务器,
其中过程有
startservice----oncreat
onstartcommand
onstart
stopservice-----ondestroy
四个步骤,通过这种方式开启的服务,即使是页面关闭,在后台的服务也不会关闭,除非我们在程序中有手动关闭步骤并且手动关闭;同时这种方法开启的服务,在后台服务未关闭时,只进行一次oncreat,即程序再次点击启动服务,直接从onstartcommand开始,而不再进行oncreat。




另外一个步骤这是bind,绑定式开启服务。
它的步骤是
bindService----onbind();(如果方式为自动启动的话,服务器未启动的,自动oncreat)
oncreat
onstartcommand
onstart
unonbind
ondestroy
其中onstartcommand和onstart在单应用程序运行中没有观测到出现,据说是出现在多应用程序混合使用时。
另外通过该方法开启服务,该服务就和该程序的Activity不同生但共死,两者之间关系紧密,即当该页面关闭后,绑定就会解除,同时该服务进入销毁阶段。
通过这种方法,我们可以达到之前那种方法所不能实现的功能,即可以调用我们服务中的函数了,可以对服务中的内容进行访问。
这种绑定方法开启的服务,相比之下,安全系数也更高。






对于基于bind方法得到的服务,调用该服务中的方法,我们需要分别在Activity和service的类中生成两个内部类,使得他们建立连接。
这个连接的中间人就是一个ibinder对象,要得到这个对象,我们需要一个BindService 对象,该对象运用于serviceconnect中,它所获取的ibinder是在service类中的内部类binder(继承ibinder的已经实现的类)上,通过该类内部我们自己生成的方法对service内部的函数进行调用,通过多重传递后使得该函数得以在Activity中进行使用。


Ps.如果我们基于安全考虑,对在Service中的ibinder内部类进行private的访问控制,我们可以通过一个自建的implement,里面写入未实现的方法(即我们要调用的方法),之后在我们serviceconnect中传递时用该接口为强制转换对象后进行调用,即可规避该private访问控制。这样做,我们同时可以在ibinder的类中写入其他的方法,而该方法并不继承与该自写接口,这样,我们外部的Activity中就不能对它进行调用。这就是之前说它的安全系数高的原因。





0 0
原创粉丝点击