点击通知时启动IntentService会导致应用崩溃

时间:2018-06-29 02:39:47

标签: android android-notifications

当用户在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")

1 个答案:

答案 0 :(得分:1)

对于启动ServiceIntentService施加的限制没有区别。当您的应用程序不在前台时,该限制适用于在后台启动服务,因此这两者都适用。

由于您正在处理Notification,并且无法控制服务的启动,因此您可以执行以下操作:

方法1

对于API级别的Android O及更高版本,请使用PendingIntent.getForegroundService代替PendingIntent.getService

  

这将启动前台服务,例如呼叫   Context.startForegroundService()

将您的IntentService转换为服务,并通过显示通知并致电startForeground()使其立即成为前台服务。

方法2:

基于documentation

  

在以下情况下,将后台应用程序放置在   临时白名单几分钟:

     
      
  • 处理高优先级的Firebase云消息(FCM)消息。
  •   
  • 接收广播,例如SMS / MMS消息。
  •   
  • 从通知中执行待处理的意图。
  •   

虽然应用程序位于白名单中,但它可以不受限制地启动服务,并且允许其后台服务运行。

在您的情况下,您无法运行IntentService,这很奇怪,可能是因为没有可见的通知。您可以扩展Service并通过显示通知并调用startForeground()使其立即成为前台服务。

方法3:

使用JobIntentService。请遵循此SO了解实施细节