gpt4 book ai didi

java - Android 上的绑定(bind)服务与启动服务以及如何同时进行

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:42:12 28 4
gpt4 key购买 nike

我在问一个已经(部分地,在我看来)得到解决的棘手问题 herehere .假设在许多示例中,我们想要创建一个音乐应用程序,使用(比方说)单个 Activity 和服务。我们希望服务在 Activity 停止或销毁时继续存在。这种生命周期表明启动了服务:

A service is "started" when an application component (such as an activity) starts it by calling startService(). Once started, a service can run in the background indefinitely, even if the component that started it is destroyed

好的,但是我们还希望能够与服务通信,所以我们需要一个服务绑定(bind)。没问题,我们有绑定(bind)和启动的服务 this answer suggests :

到目前为止一切顺利,但问题是当 Activity 开始时,我们不知道服务是否可用。它可能已经开始,也可能还没有。答案可能是这样的:

  • 在启动时,尝试绑定(bind)到服务(使用不带 bindService() 标志的 BIND_AUTO_CREATE)
  • 如果失败,则使用 startService() 启动服务,然后绑定(bind)到它。

这个想法是基于对 bindService() 文档的特定阅读:

Connect to an application service, creating it if needed.

如果零标志意味着“服务不是真正需要的”那么我们就可以了。因此,我们使用以下代码尝试类似的操作:

private void connectToService() {
Log.d("MainActivity", "Connecting to service");
// We try to bind to an existing service
Intent bindIntent = new Intent(this, AccelerometerLoggerService.class);
boolean bindResult = bindService(bindIntent, mConnection, 0);
if (bindResult) {
// Service existed, so we just bound to it
Log.d("MainActivity", "Found a pre-existing service and bound to it");
} else {
Log.d("MainActivity", "No pre-existing service starting one");
// Service did not exist so we must start it

Intent startIntent = new Intent(this, AccelerometerLoggerService.class);
ComponentName startResult = startService(startIntent);
if (startResult==null) {
Log.e("MainActivity", "Unable to start our service");
} else {
Log.d("MainActivity", "Started a service will bind");
// Now that the service is started, we can bind to it
bindService(bindIntent, mConnection, 0);
if (!bindResult) {
Log.e("MainActivity", "started a service and then failed to bind to it");
} else {
Log.d("MainActivity", "Successfully bound");
}
}
}
}

我们得到的是每次都成功绑定(bind):

04-23 05:42:59.125: D/MainActivity(842): Connecting to service
04-23 05:42:59.125: D/MainActivity(842): Found a pre-existing service and bound to it
04-23 05:42:59.134: D/MainActivity(842): onCreate

全局问题是“我是否误解了绑定(bind)服务与启动服务以及如何使用它们?”更具体的问题是:

  • 认为传递给 bindService() 的零标志意味着“不启动服务”是否是对文档的正确理解?如果没有,是不是没有办法在不启动服务的情况下调用bindService()
  • 为什么即使服务没有运行,bindService() 也会返回 true?在这种情况下,根据 Log 调用,服务似乎并未启动。
  • 如果前一点是 bindService() 的正确/预期行为,是否有解决方法(即以某种方式确保 startService 仅在服务被调用时调用没有运行?)

附言我已经解决了我自己代码中的问题:我无论如何都会发出 startService() 调用,因为重复的 startService() 会被忽略。但是,我仍然想更好地理解这些问题。

最佳答案

  1. 如果您使用 0 标志绑定(bind)服务,则该服务将不会启动。您可以使用 BIND_AUTO_CREATE 标志绑定(bind)服务,如果服务未启动,它将启动。但是,当您取消绑定(bind)服务时,服务将被销毁。
  2. 带有 0 标志的 bindService 始终返回 true。
  3. 您可以随时调用 startService。如果该服务已经在运行,则不会创建新服务。将调用正在运行的服务 onStartCommand。

onCreate中startService,onResume中bindService,onPause中unbindService应该没有问题。

关于java - Android 上的绑定(bind)服务与启动服务以及如何同时进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162002/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com