startService()抛出java.lang.IllegalStateException异常。

9

从我的Activity的onCreate()方法开始,

我试图通过以下代码启动一个服务:

Intent intent = new Intent();
intent.setClassName(SERVICE_PKG_NAME, SERVICE_NAME);
context.startService(intent); //context = MainActivity.this

然而,我收到了以下异常:

java.lang.IllegalStateException: 不允许启动服务意图(服务名称):应用在后台运行

有什么想法是什么原因导致这种情况?我已经被卡住几个小时了。


1
你正在测试哪个版本的Android?另外,你能发布完整的Java堆栈跟踪吗? - CommonsWare
2
@CommonsWare Android -O。从https://developer.android.com/preview/behavior-changes.html看来是新添加的。**粗体**如果一个针对Android O的应用程序在不允许创建后台服务的情况下尝试使用startService()方法,则该方法现在会抛出IllegalStateException异常。粗体 - Sahil Mehta
1
你的错误信息与我从 O 看到的一致,这就是为什么我问设备版本的原因。你在哪里和何时尝试启动服务? - CommonsWare
1
“因此系统不允许在后台启动应用程序服务”这句话毫无意义。应用程序A在前台,应该可以随心所欲地启动其所需的服务,包括应用程序B的任何服务。无论如何,首先尝试绑定服务,然后在服务绑定后为同一服务调用startService() - CommonsWare
1
也许 A、B 和 C 应该合并成一个应用程序。无论如何,您可以尝试在 Context 上调用 startForegroundService() 而不是 startService() - CommonsWare
显示剩余8条评论
1个回答

3

对于需要从前台应用程序调用后台应用程序服务的情况,我们可以按以下顺序进行操作:

  • 首先调用bindService()函数。
  • 在绑定完成后,在OnServiceConnected()回调函数中执行下一步操作。
  • 最后调用StartService()函数。

所以这必须是一个绑定服务? - IgorGanapolsky
那么,我该如何在接收到 Firebase 通知时启动一个服务? - Daniel F
1
@DanielF 我认为最好使用JobScheduler。您可以根据特定条件(如连接充电器等)将要启动的作业指定给它。https://developer.android.com/reference/android/app/job/JobScheduler.html - Sahil Mehta
@SahilMehta 感谢您的反馈。我的问题是我开始针对API 26进行开发,而在那里,除非使用startForegroundService(我认为是这个名字),否则无法从后台调用服务。您必须传递一个通知。 - Daniel F
@DanielF,我认为JobScheduler应该能够帮助解决这个问题。我之前也遇到过类似的情况。 - Sahil Mehta

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