Android启动服务时,应该使用onCreate或onStartCommand方法?

123
通常当我创建一个Android服务时,我会实现onCreate方法,但在我的最后一个项目中这种方法不起作用了。我尝试实现onStartCommand,似乎这种方式可行。
问题是:当我需要实现一个服务时,哪种方法是必须的?我必须实现哪些方法?是onCreateonStartCommand还是两者都要实现?每个方法的作用是什么?

1
无论如何,onCreate方法总是会被调用。 - IgorGanapolsky
2个回答

213

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

只有在确实需要仅仅一次地初始化某些内容时,才需要实现onCreate()方法。

onStartCommand()方法在每次客户端使用startService(Intent intent)启动服务时都会被调用。这意味着onStartCommand()方法可能会被多次调用。您应该在这个方法中处理每次客户端从您的服务请求信息所需要执行的任务。这取决于您的服务执行的任务以及其与客户端之间的通信方式。

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


7
一个应用程序中是否可以存在两个相同的服务实例? - jacktrades
2
根据理论和文档,理论上是不会的。但是在 Android 中似乎存在一些 bug,在某些情况下它确实会创建多个服务实例。但正如我所说,这是一个 bug,并且我们无法可靠地复现它。你为什么要问这个呢? - David Wasser
3
据我所知,目前没有报告任何官方错误。然而,有几个人报告了这种情况,并且我有一个应用程序知道发生了这种情况。我无法将问题简化为可重复的小问题,因此我自己没有提交错误报告。文档没有明确说明服务是单例的,但很清楚这是预期的行为。查看“startService()”的文档:明确说明“如果服务尚未运行,则将创建并启动服务;如果服务正在运行,则保持其运行”。 - David Wasser
9
当你调用startService()时,如果服务没有运行,Android将创建服务类的一个实例(这是一个服务对象),然后调用该对象的onCreate()方法,接着调用该对象的onStartCommand()方法。如果稍后再次调用startService(),如果服务仍在运行,Android不会创建新的服务对象。相反,它将只是在现有的服务对象上调用onStartCommand()方法。清楚吗? - David Wasser
1
知道了这些之后,我应该在哪里调用 startForeground()?是在 onCreate() 还是在 onStartCommand() 中?(为什么?)还是非常感谢您的解释! - Edw590
显示剩余12条评论

14

服务(Service)的行为和活动(Activity)相似,你想要在服务中实现的内容都可以在onCreate中进行初始化。

每当使用startService调用service时,onStartCommand函数将被调用。你可以传递任何操作来执行,例如:音乐播放器可以通过指令来播放、暂停或停止歌曲。

通过在onStartCommand函数中接收指令并执行相应的操作,你可以在服务中执行任何操作。

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)来启动服务。 - Diffy
你是否正确实例化了服务对象?或者你的清单文件中可能没有该服务。 - Zar E Ahmer
但是这个方法被称为实例化服务吗?那么服务对象在哪里呢? - Diffy
如果你想手动执行Service类中的某些方法或从该Service获取一些数据或对象,则需要绑定到该服务。Android开发者解释了如何做到这一点。 - Joaquin Iurchuk
如果一个服务被 Android 重新启动,它会再次调用 onCreate 吗? - daparic
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接