为什么要使用 Android 绑定服务?
Why to use Android Bound Service?
我很好奇,当您可以使用本地广播和定义在 Activity 和服务
了解每种实施方式的优缺点会很有帮助。
我在任何地方都找不到明确的答案。
使用边界 Service
更加灵活。您可以在 Service
(使用 AIDL)上定义 return 立即结果(同步)的方法,而使用 LocalBroadcastManager
则无法做到这一点。使用 LocalBroadcastManager
要求您以完全异步的方式使用 Service
。这将服务操作的启动与结果(回调)的 return 分离,这会使您的代码更复杂且更难以理解。异步使用有一些好处,有些地方你应该使用它,但如果你有一个绑定 Service
你可以准确选择何时使用同步调用以及何时使用异步回调。
此外,使用 AIDL 可以让您准确描述服务方法调用的签名。如果你使用startService(Intent)
,你不能保证调用者会在传递的Intent
中提供正确的参数,所以你需要依赖调用者来"do the right thing" and/or你需要添加很多额外的参数验证。
不要忘记来自@CommonsWare 的评论,关于 LocalBroadcastManager
如何仅在 Service
是 运行 与您的其余部分在相同的 OS 进程中时才有效应用程序(这使得它不适合编写系统服务之类的东西,这些东西在你的 OS 进程中不是 运行)。
服务是 运行 在后台运行的组件。它可以在不需要与用户交互的情况下执行长时间 运行ning 操作例如,服务可能会通过网络检索数据而不会停止或阻止用户与应用程序的 activity 交互,或者用户可能当用户在不同的应用程序中时在后台播放音乐。服务可以有两种类型或状态:
已启动:一旦启动,服务可以运行无限期地在后台运行,即使启动的组件已被销毁。当应用程序模块或组件(例如 activity)通过调用 startService() 启动它时,服务就会启动。例如,在启动画面启动时使用服务从 phone 书中检索联系人。
绑定:绑定服务提供了一个客户端-服务器接口,允许组件与服务交互、获取结果、发送请求,甚至跨进程进行进程间通信(工控机)。当应用程序组件通过调用 bindService() 绑定到绑定服务时,绑定服务就被绑定了。
我很好奇,当您可以使用本地广播和定义在 Activity 和服务
了解每种实施方式的优缺点会很有帮助。
我在任何地方都找不到明确的答案。
使用边界 Service
更加灵活。您可以在 Service
(使用 AIDL)上定义 return 立即结果(同步)的方法,而使用 LocalBroadcastManager
则无法做到这一点。使用 LocalBroadcastManager
要求您以完全异步的方式使用 Service
。这将服务操作的启动与结果(回调)的 return 分离,这会使您的代码更复杂且更难以理解。异步使用有一些好处,有些地方你应该使用它,但如果你有一个绑定 Service
你可以准确选择何时使用同步调用以及何时使用异步回调。
此外,使用 AIDL 可以让您准确描述服务方法调用的签名。如果你使用startService(Intent)
,你不能保证调用者会在传递的Intent
中提供正确的参数,所以你需要依赖调用者来"do the right thing" and/or你需要添加很多额外的参数验证。
不要忘记来自@CommonsWare 的评论,关于 LocalBroadcastManager
如何仅在 Service
是 运行 与您的其余部分在相同的 OS 进程中时才有效应用程序(这使得它不适合编写系统服务之类的东西,这些东西在你的 OS 进程中不是 运行)。
服务是 运行 在后台运行的组件。它可以在不需要与用户交互的情况下执行长时间 运行ning 操作例如,服务可能会通过网络检索数据而不会停止或阻止用户与应用程序的 activity 交互,或者用户可能当用户在不同的应用程序中时在后台播放音乐。服务可以有两种类型或状态:
已启动:一旦启动,服务可以运行无限期地在后台运行,即使启动的组件已被销毁。当应用程序模块或组件(例如 activity)通过调用 startService() 启动它时,服务就会启动。例如,在启动画面启动时使用服务从 phone 书中检索联系人。
绑定:绑定服务提供了一个客户端-服务器接口,允许组件与服务交互、获取结果、发送请求,甚至跨进程进行进程间通信(工控机)。当应用程序组件通过调用 bindService() 绑定到绑定服务时,绑定服务就被绑定了。