这取决于 onStartCommand 中返回的值。
您必须返回 START_NOT_STICKY
根据文档:
对于已启动的服务,它们可以决定运行另外两种主要的操作模式,具体取决于它们从 onStartCommand() 返回的值:START_STICKY 用于根据需要显式启动和停止的服务,而 START_NOT_STICKY 或 START_REDELIVER_INTENT 用于适用于只应在处理发送给它们的任何命令时保持运行的服务
简而言之:如果您返回 START_STICKY,则只要资源可用,就会重新创建服务。如果您返回 START_NOT_STICKY 您必须重新激活发送新意图的服务。
由于所有这些都引发了我的好奇心,我制作了一个示例应用程序来测试它。您可以在此处找到包含所有来源的 zip
有一个 startService 按钮和一个 stopService 按钮,它们可以满足您对它们的期望。该服务在 onStartCommand 中返回 START_NOT_STICKY。我在 onCreate、onStartCommand 和 onDestroy 中放置了 toast。
这里会发生什么:
- 如果我按开始,则会调用 onCreate 和 onStart
- 如果我按下停止,就会触发 onDestroy
- 如果我按 start 两次,onCreate 被调用一次,onStartCommand 被调用两次
所以它的行为与预期的一样。
如果我按照您的描述启动服务并终止应用程序,则不会调用 onDestroy,但不会调用 onCreate 或 onStart。
如果我回到应用程序并再次按启动,则会调用 onCreate,这意味着,正如我之前所写的,START_NOT_STICKY 会阻止服务自动重启。
我猜您的应用程序中有其他东西可以再次启动服务(可能是待处理的意图)。