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

Android:如何强制在onBind()之前调用onStartCommand()?,android,android-service,Android,Android Service,我正在尝试创建一个可绑定到的粘性服务(我需要在后台对该服务持有的某些数据运行潜在的异步操作)。为此,我需要确保onBind总是在onstart命令之后运行。有没有办法保证这一点?根据: 服务基本上可以采取两种形式: 已开始 当应用程序组件(如活动)通过调用startService()启动服务时,服务被“启动”绑定 当应用程序组件通过调用bindService()绑定到服务时,服务被“绑定”。[…]绑定服务的运行时间仅为 另一个应用程序组件绑定到它。可以使用多个组件 一次绑定到服务,但当所有绑定都

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

根据:

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

已开始
当应用程序组件(如活动)通过调用startService()启动服务时,服务被“启动”
绑定
当应用程序组件通过调用bindService()绑定到服务时,服务被“绑定”。[…]绑定服务的运行时间仅为 另一个应用程序组件绑定到它。可以使用多个组件 一次绑定到服务,但当所有绑定都解除绑定时,服务 它被摧毁了


要确保始终在执行
onBind()
之前执行
onStartCommand()
,请随时向服务发送新的意图。这是因为任何
onStartCommand()。如果要绑定到服务,请调用bindService()。连接服务时,将调用ServiceConnection.OnServiceConnection()的实现,为您提供服务的IBinder。通常,绑定服务用作内部客户机-服务器接口的服务器部分。您绑定到服务,获取一个IBinder,该IBinder为您提供服务对象本身的句柄,然后使用服务句柄在服务中传递数据或调用方法


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

根据您的需求,您可能不需要绑定到
服务。然后使用一个就足够了,因为这个服务将在其工作完成后自动停止

摘自文件:

IntentService是处理异步服务的基类 按需请求(表示为意图)。客户端发送请求 通过startService(意图)调用;根据需要启动服务, 使用辅助线程依次处理每个意图,并自行停止 当它用完时

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
的更多信息

它可以处理异步操作。如果您需要任何反馈,这将“破坏”需求的异步部分,您可以使用或,正如您所说的,您可以绑定到这个。再说一遍,这取决于你想做什么

从文档中,您有两种类型的服务

开始

当应用程序组件(例如 活动)通过调用startService()启动它。一旦启动,服务 可以无限期地在后台运行,即使组件 它被摧毁了。通常,已启动的服务执行单个 操作,不向调用方返回结果。比如说, 可以通过网络下载或上载文件。手术什么时候开始 完成后,服务应自行停止

绑定

当应用程序组件通过绑定到服务时,服务被“绑定” 正在调用bindService()。绑定服务提供客户端服务器 允许组件与服务交互的接口,发送 请求,获取结果,甚至跨流程使用 进程间通信(IPC)。绑定服务的运行时间仅为 另一个应用程序组件绑定到它。可以使用多个组件 一次绑定到服务,但当所有绑定都解除绑定时,服务 它被摧毁了

提醒:您可以通过
startService()
启动
服务,使其“无限期”运行,并稍后通过调用
onBind()
绑定到该服务

Intent it = new Intent(this, MyService.class);
startService(it); // Start the service.
bindService(it, this, 0); // Bind to it.
如果您只想在
活动
运行期间运行此服务,您可以调用
onBind()

有关“默认”
服务
、如何使用和实现它的更多信息,请参见


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

问题是,当我调用
startService()
,然后几乎立即调用
bindService()
,Android有时会将
onBind()
安排在
onStartCommand()
之前。第三种服务形式是混合服务。请注意,oBind()本身可以调用startService(self)“我需要在后台对服务持有的某些数据运行潜在的异步操作”——这不需要绑定。两年后,但是。。。我的回答可能会有帮助。尝试IntentService方法。这是错误的。请重新阅读此文档:。特别是本段:尽管本文档通常分别讨论这两种类型的服务,但您的服务可以以启动(无限期运行)和允许绑定的两种方式工作。这只是一个是否实现两个回调方法的问题:onStartCommand()允许组件启动它,onBind()允许绑定。此外,您不能将服务对象用于IPC,您必须使用Messenger或AIDL。为什么这是公认的答案??这是大错特错的
Intent it = new Intent(this, MyService.class);
bindService(it, this, 0); // This will create the service and bind to it.