Закройте действие с намерением в полноэкранном режиме при нажатии на уведомление

#android #android-notifications #android-fullscreen

Вопрос:

Я создаю приложение для видеозвонков, и мне нужно отобразить экран входящего вызова. Я использую уведомление, которое отображает действие с полноэкранным механизмом намерения следующим образом:

 private fun createIncomingCallNotification(): Notification {
    val fullscreenPendingIntent = IncomingCallActivity.intent() // from splitties.intents module
        .toPendingActivity(flags =
            PendingIntent.FLAG_UPDATE_CURRENT or
            Intent.FLAG_ACTIVITY_CLEAR_TASK or
            Intent.FLAG_ACTIVITY_NEW_TASK or
            Intent.FLAG_ACTIVITY_NO_HISTORY or
            Intent.FLAG_ACTIVITY_CLEAR_TOP
        )
    return NotificationCompat.Builder(this, INCOMING_CALL_NOTIFICATION_CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_baseline_call_24)
        .setContentTitle("Incoming call")
        .setContentText("(919) 555-1234")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setCategory(NotificationCompat.CATEGORY_CALL)
        .setFullScreenIntent(fullscreenPendingIntent, true)
        .setContentIntent(
            VideoCallActivity.intent()
                .toPendingActivity(flags = 
                    Intent.FLAG_ACTIVITY_CLEAR_TASK or
                    Intent.FLAG_ACTIVITY_NEW_TASK or
                    Intent.FLAG_ACTIVITY_NO_HISTORY or
                    Intent.FLAG_ACTIVITY_NO_HISTORY or
                    Intent.FLAG_ACTIVITY_CLEAR_TOP
                )
        )
        .setAutoCancel(true)
        .setVibrate(DEFAULT_VIBRATE_PATTERN)
        .setSound(incomingCallSound)
        .build()
}
 

Он используется в качестве уведомления для службы переднего плана, которое запускается, когда получатель получает запрос на входящий вызов.

Полноэкранное действие и уведомление отображаются нормально. Однако, когда я принимаю вызов, нажав на уведомление, активность в полноэкранном режиме остается в стеке истории (даже с добавлением всех этих флагов плюс autoCancel ). Итак, когда я заканчиваю свой вызов, появляется полноэкранный режим IncomingCallActivity. Он остается даже тогда, когда я останавливаю службу переднего плана, связанную с уведомлением.

Любая помощь будет признательна!

TL;DR:

Я ищу поведение, подобное автоматической отмене, для fullScreenIntent сопровождающей аннотации. Поскольку система должна решать, отображается ли действие, я хотел бы использовать общий подход для отмены уведомления и закрытия полноэкранного действия при любом выборе действия (отклонить или принять вызов). Я подозреваю , что это следует сделать с помощью a BroadcastReceiver , но ищу советы о том, как это следует сделать в сжатой форме.

Редактировать:

Мне удалось решить эту BroadcastReceiver проблему, зарегистрировавшись в полноэкранном режиме с помощью a IntentFilter . В действии уведомления reject я просто sendBroadcast завершаю действие в полноэкранном режиме.

Однако все еще ищу подход «лучших практик» в этом вопросе.