当用户在android Oreo及更高版本上点击通知时,应用程序崩溃:java.lang.IllegalStateException:不允许启动服务意图。我了解这是由于android Oreo中引入的后台服务限制。但是我不确定我有什么选择,因为我需要在用户点击通知后立即启动IntentService来做一些简短的后台工作。
在FCM的onMessageReceived方法中:
val denyIntent = Intent(this, DenyService::class.java)
denyIntent.putExtra(VIDEO_EXTRA_SESSION_ID, sessionId)
denyIntent.putExtra(VIDEO_DENY_REASON, "callee_action_deny")
val denyIntentCode = System.currentTimeMillis().toInt()
val pendingIntentDeny = PendingIntent.getService(this, denyIntentCode, denyIntent, 0)
notificationBuilder.setDeleteIntent(pendingIntentDeny)
notificationBuilder.addAction(
R.drawable.ic_call_reject,
getString(R.string.chat_action_reject),
pendingIntentDeny
)
class DenyService : IntentService("DenyCall")
答案 0 :(得分:1)
对于启动Service
或IntentService
施加的限制没有区别。当您的应用程序不在前台时,该限制适用于在后台启动服务,因此这两者都适用。
由于您正在处理Notification
,并且无法控制服务的启动,因此您可以执行以下操作:
方法1
对于API级别的Android O及更高版本,请使用PendingIntent.getForegroundService代替PendingIntent.getService
这将启动前台服务,例如呼叫 Context.startForegroundService()
将您的IntentService
转换为服务,并通过显示通知并致电startForeground()
使其立即成为前台服务。
方法2:
在以下情况下,将后台应用程序放置在 临时白名单几分钟:
- 处理高优先级的Firebase云消息(FCM)消息。
- 接收广播,例如SMS / MMS消息。
- 从通知中执行待处理的意图。
虽然应用程序位于白名单中,但它可以不受限制地启动服务,并且允许其后台服务运行。
在您的情况下,您无法运行IntentService
,这很奇怪,可能是因为没有可见的通知。您可以扩展Service
并通过显示通知并调用startForeground()
使其立即成为前台服务。
方法3:
使用JobIntentService。请遵循此SO了解实施细节