context.startForegroundService(startServiceIntent) 多次调用会多次调用 onCreate 吗?

3
如果我多次调用context.startForegroundService(startServiceIntent),会多次使用新的服务意图调用onCreate(),还是只会对新的服务意图调用第一次onCreate,然后多次调用onStartCommand()/onHandleIntent()?

在制作日志语句时,您可以非常轻松地尝试这个。 - Abdul Waheed
1个回答

10
这取决于服务是否正在运行。如果该服务尚未运行,startForegroundService()将触发对onCreate()的调用。例如:
- 您调用startForegroundService()
- Android创建您的服务实例并调用其onCreate()
- 然后Android调用其onStartCommand()(可能会触发对其他内容的调用,如IntentServiceonHandleIntent()
- 您再次调用startForegroundService()
- Android意识到您有一个正在运行的服务副本,并且不会创建新的服务实例,因此没有onCreate()调用
- 然后Android调用其onStartCommand()(可能会触发对其他内容的调用,如IntentServiceonHandleIntent()
- 您通过类似stopService()stopSelf()的方式停止您的服务(如果仍在使用IntentService,则onHandleIntent()返回)
- 您再次调用startForegroundService(),因为您真的喜欢那个方法
- Android创建您的服务实例并调用其onCreate()
- 然后Android调用其onStartCommand()(可能会触发对其他内容的调用,如IntentServiceonHandleIntent()

1
太好了!这让我想到另一个问题: 如果Android意识到我有一个正在运行的服务副本,并且不创建新的副本,因此没有onCreate()调用而是onStartCommand(),那么我会有两个并行的工作流吗?(一个来自onStartCommand(),另一个仍在onHandleIntent()中?) - Bazouk55555
1
@AdrienBoukobza:你提到了onHandleIntent()。这表明你正在使用IntentService。如果是这样,那么你的命令是排队的。IntentService只有一个后台线程。因此它将处理第一个命令。然后,如果有另一个等待的命令,它将处理该命令。这将继续进行,直到没有更多的命令,此时IntentService调用stopSelf()并消失。因此,除非你在onHandleIntent()实现中出错(例如,执行异步工作),否则一次只会处理一个命令。 - CommonsWare
太好了!如果这是一个普通的服务(而不是serviceIntent),它会并行执行吗? - Bazouk55555
1
@AdrienBoukobza:一个普通的Service没有线程。 onStartCommand()将依次调用,因为它始终在主应用程序线程上调用。两个命令是否并行处理完全取决于您在onStartCommand()中做什么。例如,如果您启动了两个协程或使用线程池等,那么这两个命令的工作可能会并发进行。 - CommonsWare

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