谢谢。
当应用程序组件通过调用bindService()将服务绑定时,服务即被绑定。绑定服务提供了客户端-服务器接口,允许组件与服务进行交互,发送请求,获取结果,甚至可以通过进程间通信(IPC)在进程之间进行操作。
当最后一个客户端从服务解除绑定时,系统会销毁该服务除非该服务是由startService启动的。
未绑定服务或已启动服务
当应用程序组件(如活动)通过调用startService()启动服务时,服务即被启动。一旦启动,服务可以在后台无限期运行,即使启动它的组件被销毁也不受影响。
但是
关于Service类的大部分混淆实际上都围绕着它不是什么而产生的:
一个服务不是一个独立的进程。服务对象本身并不意味着它在自己的进程中运行;除非另有规定,否则它将在与其所属应用程序相同的进程中运行。有界服务绑定到活动,仅在绑定的活动仍在运行时才能工作。而无界服务将在活动销毁后仍能持续工作直到完成。下面链接中给出了一个表格区分,非常适用于面试。 http://infobloggall.com/2014/04/15/bounded-service-in-android/
当组件(例如活动)调用startService()方法时,未绑定的服务会启动。 而一个服务被绑定时,是另一个组件(例如客户端)调用bindService()方法。
未绑定的服务可以通过调用stopSelf()方法自行停止。 而绑定服务只有在所有客户端解除绑定之前无法停止。
未绑定的服务将在后台无限运行。 而绑定服务不会在后台无限运行。
未绑定的服务可通过stopService()方法停止。 而在绑定服务中,客户端可以通过调用unbindService()方法解除绑定服务。
谢谢
服务可以是绑定或未绑定(启动)或两者都是,这只是您为Service类的回调方法提供的实现问题。在这里看到所有四个回调方法。
但为了区分起见,请看以下内容:
通过调用startService()
方法启动未绑定服务。
通过调用bindService()
方法启动绑定服务。
但是,在这两个调用中,系统会内部调用onStartCommand()方法。
一旦启动未绑定服务,它将无限期运行,直到
绑定服务在服务与客户端绑定时运行。当没有活动的客户端与服务绑定时,系统会销毁服务。
编写服务时,您必须重写onBind()方法。如果是非绑定服务,则返回null;如果是绑定服务,则返回IBinder对象。
尽管无绑定服务不返回Ibinder对象,但这并不意味着它不能与应用程序组件交互。有一些方法可以实现,例如广播接收器或结果接收器。当你想要与你的服务进行双向通信时,你应该将你的服务与活动绑定。
例如:在后台播放音乐并有暂停、播放选项(活动<->服务)。
当你只想让你的服务更新你的活动时,请使用未绑定或已启动的服务(服务->活动)。
例如:每秒更新活动的计时器服务。
另一个例子:
你编写了一些处理位置更改的服务。
如果你想在移动10米时更新你的活动(使用未绑定服务)。
如果你想在活动中点击某个按钮时查看当前位置的坐标(使用绑定服务)。