有人能解释一下安卓中无界服务和绑定服务之间的区别吗?

36
有没有人能解释一下安卓中无界服务和绑定服务的区别,并且解释一下意图服务?
谢谢。
4个回答

68

绑定服务

当应用程序组件通过调用bindService()将服务绑定时,服务即被绑定。绑定服务提供了客户端-服务器接口,允许组件与服务进行交互,发送请求,获取结果,甚至可以通过进程间通信(IPC)在进程之间进行操作。

当最后一个客户端从服务解除绑定时,系统会销毁该服务除非该服务是由startService启动的。

未绑定服务或已启动服务

当应用程序组件(如活动)通过调用startService()启动服务时,服务即被启动。一旦启动,服务可以在后台无限期运行,即使启动它的组件被销毁也不受影响。

但是

关于Service类的大部分混淆实际上都围绕着它不是什么而产生的:

一个服务不是一个独立的进程。服务对象本身并不意味着它在自己的进程中运行;除非另有规定,否则它将在与其所属应用程序相同的进程中运行。
服务不是线程。它本身不是在主线程之外执行工作的手段(以避免应用程序无响应错误)。
这就是 IntentService 的用处。 IntentService 是 Service 的子类,它使用一个工作线程来处理所有按需异步请求(表示为 Intents)。客户端通过 startService(Intent) 调用发送请求;服务根据需要启动,使用工作线程逐个处理每个 Intent,当没有任务时停止自身。

Example

希望有所帮助 :)

2
请提供每种类型的清晰定义,谢谢!我正在研究服务并试图找到与此相关的问题的答案。Intent Service不会并行处理请求,它使用一个后台线程和队列请求。拥有自己的线程池的绑定服务是否可以更好地实现可扩展性? - Mark
2
你应该使用一个服务,最好是带有自己的线程池,并选择newFixedThreadPool来固定CPU数量(根据可用CPU)。我实际上使用mqtt这种方法,它运行得非常顺畅。 - Spurdow
2
谢谢回复,以及使用服务的建议 - 我正在阅读有关mqtt和推送通知的内容。一旦我了解了一件事情,它就不可避免地会引导我去涉及到许多其他主题! - Mark

11

8
  1. 当组件(例如活动)调用startService()方法时,未绑定的服务会启动。 而一个服务被绑定时,是另一个组件(例如客户端)调用bindService()方法。

  2. 未绑定的服务可以通过调用stopSelf()方法自行停止。 而绑定服务只有在所有客户端解除绑定之前无法停止。

  3. 未绑定的服务将在后台无限运行。 而绑定服务不会在后台无限运行。

  4. 未绑定的服务可通过stopService()方法停止。 而在绑定服务中,客户端可以通过调用unbindService()方法解除绑定服务。

谢谢


1
我给你点赞,因为你提供了一个很好的答案来回答一个老问题。现在在底部添加一个文档链接,我会认为这是一个非常好的答案。 - m02ph3u5

8

绑定和未绑定服务不是一枚硬币的两面

服务可以是绑定或未绑定(启动)或两者都是,这只是您为Service类的回调方法提供的实现问题。在这里看到所有四个回调方法。

但为了区分起见,请看以下内容:

1. 启动服务

通过调用startService()方法启动未绑定服务。
通过调用bindService()方法启动绑定服务。
但是,在这两个调用中,系统会内部调用onStartCommand()方法。

2. 服务的生命周期

一旦启动未绑定服务,它将无限期运行,直到

绑定服务在服务与客户端绑定时运行。当没有活动的客户端与服务绑定时,系统会销毁服务。

3. onBind()方法

编写服务时,您必须重写onBind()方法。如果是非绑定服务,则返回null;如果是绑定服务,则返回IBinder对象。

尽管无绑定服务不返回Ibinder对象,但这并不意味着它不能与应用程序组件交互。有一些方法可以实现,例如广播接收器结果接收器

单向与双向与服务通信

当你想要与你的服务进行双向通信时,你应该将你的服务与活动绑定。
例如:在后台播放音乐并有暂停、播放选项(活动<->服务)。

当你只想让你的服务更新你的活动时,请使用未绑定或已启动的服务(服务->活动)。
例如:每秒更新活动的计时器服务。

另一个例子:

你编写了一些处理位置更改的服务。
如果你想在移动10米时更新你的活动(使用未绑定服务)。
如果你想在活动中点击某个按钮时查看当前位置的坐标(使用绑定服务)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接