Android:如何在onBind()之前强制调用onStartCommand()?

时间:2013-06-29 20:42:53

标签: android android-service

我正在尝试创建一个可绑定的粘性服务(我需要在后台运行该服务所持有的某些数据的异步操作)。为此,我需要确保onBind始终在onStartCommand之后运行。有什么方法可以保证吗?

3 个答案:

答案 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)。绑定服务只运行   另一个应用程序组件绑定到它。多个组件可以   立即绑定到服务,但当所有这些服务解除绑定时,服务   被毁了。

提醒:您可以启动ServicestartService()使其“无限期”运行并稍后通过调用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()