【问题标题】:Android onCreate or onStartCommand for starting serviceAndroid onCreate 或 onStartCommand 用于启动服务
【发布时间】:2012-12-20 08:37:59
【问题描述】:

通常,当我创建一个 Android 服务时,我会实现 onCreate 方法,但在我的上一个项目中,这不起作用。我尝试实现onStartCommand,这似乎可行。

问题是:当我必须实现一个服务时,需要哪种方法?我必须实施哪些方法? onCreateonStartCommand,还是两者兼而有之?各自的作用是什么?

【问题讨论】:

  • onCreate 总是被调用

标签: android android-service oncreate


【解决方案1】:

Service 的行为与 Activity 相同 无论您想要 associate 使用一次服务,都会像初始化一样进入 onCreate

以及每当使用 startService 调用 service 时。 onStartCommand 将被调用。并且您可以传递任何操作来执行。就像音乐播放器一样,你可以播放、暂停、停止使用动作

你可以通过发送一个动作并在onStartCommand接收它来执行任何operation in service

onCreate 像构造函数一样工作。

简短编辑

onCreate() 仅在您第一次启动Service 时调用,而onStartCommand() 则在您每次再次调用startService 时调用。它可以让您设置播放、停止、暂停音乐等操作。

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}

【讨论】:

  • 所以当我使用 startService(intent) 调用服务时,不会调用 onCreate() 吗?我对理解什么是“服务对象”有疑问,因为我总是通过 startSevice(intent) 启动服务。
  • 您是否正确实例化了服务对象,或者您的清单中可能没有该服务
  • 启动服务如 startService(new Intent(this, ServiceName.class));
  • 但是这个方法叫实例化服务吗?那么服务对象在哪里呢?
  • 是一种使用intent调用Activity和Service的方式,负责在Android中打开Activity和Service。你想对服务对象做什么,你也可以有意识地去做。我的意思是将数据传递给服务
【解决方案2】:

onCreate()Service 对象被实例化时被调用(即:当服务被创建 时)。你应该在这个方法中做一些你只需要做一次的事情(即:初始化一些变量等)。 onCreate()每个实例化对象只会被调用一次。

如果你真的想要/需要初始化一些东西只需要一次,你只需要实现onCreate()

onStartCommand() 被调用每次客户端使用startService(Intent intent) 启动服务。这意味着onStartCommand() 可以被多次调用。您应该在此方法中执行每次客户端从您的服务请求某些内容时所需的操作。这在很大程度上取决于您的服务做什么以及它如何与客户端通信(反之亦然)。

如果您不实现onStartCommand(),那么您将无法从Intent 获取客户端传递给onStartCommand() 的任何信息,并且您的服务可能无法执行任何有用的工作。

【讨论】:

  • 同一个服务的两个实例可以存在于一个应用程序中吗?
  • @jacktrades 从理论上和根据文档:不。但是,Android 中似乎存在一些错误,在某些情况下它确实会创建多个服务实例。但是,正如我所说,这是一个错误,我们无法随意可靠地重现它。为什么要问?
  • @Mr_and_Mrs_D 据我所知,没有官方错误报告。但是,有几个关于这种情况的报告,我有一个应用程序,我知道它正在发生。我一直无法将问题减少到较小且可重复的问题,因此我自己没有提交错误。该文档没有明确说明服务是单例的,但很明显这就是预期的。查看'startService()`的文档:明确指出如果服务尚未运行,它将被创建并启动,如果它正在运行,则保持运行
  • @Diffy 当你调用startService()时,如果服务没有运行,Android会创建一个服务类的实例(这是一个服务对象),然后在那个对象上调用onCreate() .然后它将在该对象上调用onStartCommand()。如果一段时间后,您再次调用startService(),如果服务仍在运行,Android 将不会创建新的服务对象。相反,它只会在现有服务对象上调用onStartCommand()。清楚吗?
  • 我爱你! (y)像魔术一样工作(y)非常简单和很好的解释
猜你喜欢
  • 2019-12-22
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多