【问题标题】:startService() throws java.lang.IllegalStateExceptionstartService() 抛出 java.lang.IllegalStateException
【发布时间】:2017-06-01 14:22:35
【问题描述】:

来自我的活动的onCreate()

我正在尝试通过以下代码启动服务:

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

但是,我收到以下异常:

java.lang.IllegalStateException: Not allowed to start service Intent (service-name) : app is in background

知道这可能是什么原因吗?现在坚持了几个小时。

【问题讨论】:

  • 您在哪个版本的 Android 上进行测试?另外,你能发布整个 Java 堆栈跟踪吗?
  • @CommonsWare Android -O。来自developer.android.com/preview/behavior-changes.html 似乎是新添加的。 bold 现在,如果面向 Android O 的应用在不允许创建后台服务的情况下尝试使用 startService() 方法,则会引发 IllegalStateException。**bold**
  • 您的错误消息与我从 O 看到的一致,这就是我询问设备版本的原因。您尝试在何时何地启动该服务?
  • “所以系统不允许在后台启动应用程序服务”——这没有任何意义。应用程序 A 在前台。它应该能够启动其核心内容的服务,包括 App B 的任何服务。无论如何,先尝试绑定到服务,然后在服务绑定后为同一服务调用 startService()
  • 也许 A、B 和 C 都应该是一个应用程序。无论如何,您可以尝试在Context 上调用startForegroundService() 而不是startService()

标签: android android-service android-8.0-oreo


【解决方案1】:

对于需要从前台应用调用后台应用服务的情况,我们可以按照顺序:

  • 先调用 bindService()
  • 由于绑定调用而在 OnServiceConnected() 之后
  • 调用 StartService()。

【讨论】:

  • 所以这一定是绑定服务?
  • 那么如何启动服务以响应 Firebase 通知?
  • @DanielF 我认为最好使用 JobScheduler。您可以根据某些条件(例如 Charger Connected 等)指定要启动的作业。developer.android.com/reference/android/app/job/…
  • @SahilMehta 感谢您的反馈。我的问题是我开始以 API 26 为目标,除非你使用 startForegroundService (我认为这是名称),否则你不能从后台调用服务,然后你必须向它传递一个通知。
  • @DanielF ,我认为 JobScheduler 应该在这种情况下提供帮助。我也遇到过类似的情况。
猜你喜欢
  • 1970-01-01
  • 2012-07-03
  • 2012-04-23
  • 2020-01-09
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多