我正在尝试创建一个可绑定的粘性服务(我需要在后台对服务持有的某些数据运行潜在的异步操作)。为此,我需要确保 onBind 始终在 onStartCommand 之后运行。有没有办法保证这一点?
3 回答
根据您的要求,您可能不需要绑定到您的Service
. 然后使用IntentService
就足够了,因为该服务将在其工作完成后自行停止。
取自文档:
IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。客户端通过 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
可以在这里找到。
这可以处理您的异步操作。如果您需要任何反馈,这将“破坏”需求的异步部分,您可以使用 aLocalBroadcastManager
或如您所说,您可以绑定到 this Service
。再说一次,这取决于你想要做什么。
从文档中,您有两种类型的服务。
开始
当应用程序组件(例如活动)通过调用 startService() 启动服务时,服务被“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被破坏。通常,启动的服务执行单个操作并且不会将结果返回给调用者。例如,它可能通过网络下载或上传文件。操作完成后,服务应自行停止。
边界
当应用程序组件通过调用 bindService() 绑定到服务时,服务被“绑定”。绑定服务提供了一个客户端-服务器接口,允许组件与服务交互、发送请求、获取结果,甚至通过进程间通信 (IPC) 跨进程执行此操作。绑定服务仅在另一个应用程序组件绑定到它时运行。多个组件可以一次绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。
提醒:您可以启动一个Service
throughstartService()
以使其“无限期”运行并通过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
,如何使用和实现它可以在这里找到。
只需选择最适合您的用例的方法,您就可以开始了。
关键是,您不应该同时调用 startService() 和 bindService()。如果要绑定到服务,请调用 bindService()。连接服务后,将调用您的 ServiceConnection.onServiceConnected() 实现,为您提供服务的 IBinder。通常,绑定服务用作内部客户端-服务器接口的服务器部分。您绑定到服务,取回一个 IBinder,它为您提供服务对象本身的句柄,然后使用服务句柄来传递数据或调用服务中的方法。
绑定服务几乎总是用于连接进程(IPC)。
根据文档:
服务基本上可以采用两种形式:
已启动
当应用程序组件(例如活动)通过调用 startService() 启动服务时,服务即被“启动”。
绑定
当应用程序组件通过调用 bindService() 绑定到服务时,该服务被“绑定”。[..] 绑定服务仅在另一个应用程序组件绑定到它时运行。多个组件可以一次绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。
为确保onStartCommand()
始终在之前执行onBind()
,请随时向服务发送新的意图,以绑定到它。这是因为对服务的任何新意图都会触发 onStartCommand()
,然后调用bindService()
将执行onBind()
.