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