三星 S7 在收到高优先级 FCM 消息时从后台启动 Intent 时崩溃



我正在开发一个VoIP应用程序,当来电发生时,该应用程序会从Twilio接收高优先级通知。

有时,当这种情况发生时,我会收到以下异常,这是一个可怕的崩溃时间,因为它迫使另一端的语音邮件呼叫。

致命异常:java.lang.IllegalState异常:不允许启动 service Intent { act=com.incomingCall cmp=com./.service.VoIP服务(有附加功能(}:应用程序 在后台 uid UidRecord{368a9a8 u0a186 CEM 空闲进程:1 seq(0,0,0(}

例外都发生在三星Galaxy S7运行Android 8.0的计算机上,我们的许多用户都使用。

我在onMessageReceived中获取远程消息,从中解析一些数据,然后调用执行少量Twilio逻辑的Voice.handleMessage(this, data, twilioMessageListener),然后触发回调

private var twilioMessageListener: MessageListener = object : MessageListener {
override fun onCallInvite(callInvite: CallInvite) {
val intent = Intent(this@FcmListenerService, VoipService::class.java)
with(intent) {
action = Constants.ACTION.INCOMING_CALL
putExtra(Constants.EXTRA.INCOMING_CALL_MESSAGE, callInvite)
putExtra(Constants.EXTRA.INCOMING_CALL_MESSAGE_STATE, callInvite.state)
}
startService(intent)
}
}

然后在启动服务时崩溃。

根据文档

在某些情况下,后台应用放置在临时 白名单几分钟。当应用被列入白名单时,它 可以不受限制地启动服务及其后台服务 被允许运行。应用在以下情况下被列入白名单 处理对用户可见的任务,例如:

处理高优先级的 Firebase 云消息 (FCM( 消息。

所以我不确定我做错了什么,或者我能做些什么来解决这个问题?

这是一个高优先级的 FCM,我仍然收到错误?

这是三星S7操作系统中的错误吗? 我可以做些什么来解决这个问题吗?我尝试将我的设备打瞌睡,但我无法复制它。

您可以在Google的文档中找到,当从后台调用startService时,会抛出IllegalState异常,这就是您的情况:

如果应用程序处于无法启动服务的状态 (例如,在允许服务的状态下不在前台(

https://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent(

这就是为什么你应该使用startForegroundService而不是startService。

类似于startService(android.content.Intent(,但隐含 承诺服务将调用 startForeground(int, android.app.通知(一旦开始运行

但是,startForegroundService有其自身的缺点,我认为这是一个平台错误。所以我的建议是不要使用我在这里解释的那样:

Context.startForegroundService(( 没有调用 Service.startForeground((

最新更新