Android onCreate或onStartCommand用于启动服务


105

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

问题是:何时必须实施服务,需要哪种方法?我必须实现哪些方法?onCreateonStartCommand或两者兼而有之?每个角色扮演什么角色?


onCreate总是被称为
IgorGanapolsky

Answers:


189

onCreate()Service实例化对象时调用(即:创建服务时)。您应该使用此方法执行只需要执行一次的操作(即:初始化一些变量等)。每个实例化对象onCreate()只会被调用一次。

onCreate()当您实际上只想/ 需要初始化一次时,才需要实现。

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

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


6
应用程序中可以存在同一服务的两个实例吗?
jacktrades

1
@jacktrades理论上并根据文档:不。但是,Android中似乎存在一些错误,在某些情况下确实会创建服务的多个实例。但是,正如我所说,这是一个错误,我们无法随意可靠地复制它。你问来干什么?
David Wasser

3
@Mr_and_Mrs_D据我所知,目前还没有官方的错误报告。但是,有数种有关这种情况的报告,并且我有一个知道它正在发生的应用程序。我无法将问题缩小到可以重复的程度,因此我自己也没有提交过bug。该文档没有明确声明服务是单例,但是很清楚这就是预期的目的。查看'startService()`的文档:明确指出如果服务尚未运行,它将被创建并启动,如果服务正在运行,它将保持运行
David Wasser 2013年

6
@Diffy调用时startService(),如果服务未运行,则Android将创建服务类的实例(这是一个服务对象),然后onCreate()在该对象上调用。然后它将调用onStartCommand()该对象。如果一段时间后再次调用startService(),如果服务仍在运行,则Android将不会创建新的服务对象。相反,它将仅调用onStartCommand()现有服务对象。明白了吗?
David Wasser 2014年

1
我爱你!(y)就像魔术一样(y)非常简单且很好的解释
希尔顿卡德卡

11

服务的行为就像“活动”一样,无论您想要associate使用什么服务,它都会onCreate像初始化一样进入

以及每当service使用startService调用时onStartCommand将被称为。您可以通过任何动作来执行。就像音乐播放器一样,您可以播放,暂停,停止使用动作

您可以operation in service通过发送操作并接收操作来执行任何操作onStartCommand

onCreate 像构造函数一样工作。

简而言之编辑

onCreate()仅在您首次启动呼叫时调用一次,ServiceonStartCommand()每次您startService再次呼叫时调用一次。它可以让您设置诸如播放,停止,暂停音乐之类的动作。

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

因此,当我使用startService(intent)调用服务时,将不会调用onCreate()吗?我不确定什么是“服务对象”,因为我总是通过startSevice(intent)启动服务。
2014年

您是否正确实例化了服务对象,或者清单中可能没有该服务
AndroidGeek 2014年

启动服务,例如startService(new Intent(this,ServiceName.class));
AndroidGeek

但是这种方法称为实例化服务吗?那么服务对象在哪里?
2014年

这是一种使用Intent调用Activity和Service的方法,负责在Android中打开Activity和Service。您想要对服务对象进行的操作也可以有意地做到。我的意思是将数据传递给Service
AndroidGeek,2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.