8

我正在尝试创建一个可绑定的粘性服务(我需要在后台对服务持有的某些数据运行潜在的异步操作)。为此,我需要确保 onBind 始终在 onStartCommand 之后运行。有没有办法保证这一点?

4

3 回答 3

9

根据您的要求,您可能不需要绑定到您的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) 跨进程执行此操作。绑定服务仅在另一个应用程序组件绑定到它时运行。多个组件可以一次绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。

提醒:您可以启动一个ServicethroughstartService()以使其“无限期”运行并通过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,如何使用和实现它可以在这里找到。

只需选择最适合您的用例的方法,您就可以开始了。

于 2015-12-06T14:36:58.393 回答
1

关键是,您不应该同时调用 startService() 和 bindService()。如果要绑定到服务,请调用 bindService()。连接服务后,将调用您的 ServiceConnection.onServiceConnected() 实现,为您提供服务的 IBinder。通常,绑定服务用作内部客户端-服务器接口的服务器部分。您绑定到服务,取回一个 IBinder,它为您提供服务对象本身的句柄,然后使用服务句柄来传递数据或调用服务中的方法。

绑定服务几乎总是用于连接进程(IPC)。

于 2013-06-29T23:02:43.877 回答
0

根据文档

服务基本上可以采用两种形式:

已启动
当应用程序组件(例如活动)通过调用 startService() 启动服务时,服务即被“启动”。
绑定
当应用程序组件通过调用 bindService() 绑定到服务时,该服务被“绑定”。[..] 绑定服务仅在另一个应用程序组件绑定到它时运行。多个组件可以一次绑定到服务,但是当所有组件都解除绑定时,服务将被销毁。

为确保onStartCommand()始终在之前执行onBind(),请随时向服务发送新的意图,以绑定到它。这是因为对服务的任何新意图都会触发 onStartCommand(),然后调用bindService()将执行onBind().

于 2013-06-29T20:57:37.117 回答