我正在尝试创建一个可绑定的粘性服务(我需要在后台运行该服务所持有的某些数据的异步操作)。为此,我需要确保onBind始终在onStartCommand之后运行。有什么方法可以保证吗?
答案 0 :(得分:8)
根据您的要求,您可能不需要绑定到Service
。然后使用IntentService
就足够了,因为这项服务在完成工作后将自行停止。
取自文档:
IntentService是处理异步的Services的基类 请求(表示为Intents)。客户端发送请求 通过startService(Intent)调用;该服务根据需要启动, 使用工作线程依次处理每个Intent,并自行停止 当它用完了。
IntentService
的一个例子:
public class MyService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
// Do some work here, get Intent extras if any, etc.
// ...
// Once this method ends, the IntentService will stop itself.
}
}
}
有关如何创建IntentService
的更多信息,请访问here。
这可以处理您的异步操作。如果您需要任何反馈,这将“破坏”需求的异步部分,您可以使用LocalBroadcastManager
或者如您所说,您可以绑定到此Service
。然后,这取决于你想要做什么。
从文档中,您有两种类型的服务。
<强>开始强>
当应用程序组件(例如 activity)通过调用startService()来启动它。一旦启动,服务 可以无限期地在后台运行,即使是那个组件 开始它被摧毁。通常,已启动的服务执行单个服务 操作并不会将结果返回给调用者。例如,它 可能会通过网络下载或上传文件。什么时候操作 完成后,服务应该自行停止。
<强>结合强>
当应用程序组件通过它绑定时,服务被“绑定” 调用bindService()。绑定服务提供客户端 - 服务器 允许组件与服务交互的接口,发送 请求,获取结果,甚至跨进程使用 进程间通信(IPC)。绑定服务只运行 另一个应用程序组件绑定到它。多个组件可以 立即绑定到服务,但当所有这些服务解除绑定时,服务 被毁了。
提醒:您可以启动Service
到startService()
使其“无限期”运行并稍后通过调用onBind()
绑定到它。
Intent it = new Intent(this, MyService.class);
startService(it); // Start the service.
bindService(it, this, 0); // Bind to it.
如果您只想在Activity
正在投放的情况下运行此服务,则可以致电onBind()
。
Intent it = new Intent(this, MyService.class);
bindService(it, this, 0); // This will create the service and bind to it.
有关“默认”Service
的更多信息,如何使用和实施它可以找到here。
只需选择最适合您用例的内容,就可以了。
答案 1 :(得分:1)
关键是,你不应该同时调用startService()和bindService()。如果要绑定到服务,请调用bindService()。连接服务后,将调用ServiceConnection.onServiceConnected()的实现,为您提供服务的IBinder。通常,绑定服务用作内部客户端 - 服务器接口的服务器部分。绑定到服务,返回一个IBinder,它为您提供Service对象本身的句柄,然后使用Service句柄在服务中传递数据或调用方法。
绑定服务几乎总是用于连接进程(IPC)。
答案 2 :(得分:0)
根据docs:
服务基本上可以采用两种形式:
<强>开始强>
当应用程序组件(例如活动)通过调用startService()启动它时,服务“启动”。
的结合强>
当应用程序组件通过调用bindService()绑定到它时,服务被“绑定”。 [..]绑定服务只运行 另一个应用程序组件绑定到它。多个组件可以 立即绑定到服务,但当所有这些服务解除绑定时,服务 被毁了。
要确保onStartCommand()
始终在onBind()
之前执行,请随时在要绑定到服务时向服务发送新意图。这是因为任何new intent to the service will trigger onStartCommand()
,然后调用bindService()
将执行onBind()
。