服务与活动之间如何产生联系

    在活动中启动一个服务只要构造相应的Intent,然后传入到startService()里就可以了,但是启动服务后,服务只是做自己的事情,与活动没有什么联系,活动似乎控制不了自己开启的服务。但是服务里有一个传入Intent返回IBinder对象的onBind()方法,服务可以通过传入onBind()的Intent知道是哪个活动开启了自己,可以通过onBind()返回一个IBinder对象给开启自己的活动,从而让得到这个IBinder对象的活动可以通过这个对象来控制自己,所以服务被控制的行为要与这个IBinder对象相关联,具体的方法是创建一个继承自Binder对象的类,在类里写好被控制的行为,并创建该类的实例,把该实例作为onBind()的返回对象,类似于把被控制的行为绑定在这个类上了。那活动如何去传递一个Intent对象给服务的onBind()方法呢?传递的前提是开启onBind()方法,那在什么条件达成时会开启服务的onBind()方法呢?当活动调用bindService()方法时,可以启动onBind()方法,所以也要在bindService方法里指定启动哪一个服务的onBind()方法,所以第一传入的参数是配置好的Intent,这个Intent也同时向服务的onBind()方法告诉自己是哪个活动,接下来的问题是启动onBind()方法后,活动如何去获得返回的IBinder对象,以及如何通过这个对象去使用绑定在上面的控制行为呢?其实使用了bindService()方法后,活动和服务就已经建立连接了,但是活动并没有获得IBinder以及处理它的能力,它需要一个继承自服务连接ServiceConnection接口的类的实例来获得IBinder对象,并重写里面连接后的方法onServiceConnected(X,IBinder)来完成操作,onBind()返回的IBinder对象就是返回到这个方法里,之后活动就可以通过这个实例在具体的方法里对IBinder对象进行操作,进而控制服务,那么在bindService时就需要指定一个ServiceConnection对象,好让服务知道要返回到哪个ServiceConnection对象里,所以bindService()第二个传入的参数就是ServiceConnection对象,这也就是说,服务是可以被拥有了继承自ServiceConnection接口的实例的活动所控制。

    对于继承自接口ServiceConnection的类的实例的创建是可以通过匿名内部类省略的。对于bindService(),第三个参数用于传入指定的值,以表示采用何种方式建立联系。

你可能感兴趣的:(服务与活动之间如何产生联系)