Ошибка навигации Jetpack Compose при запуске действия из уведомленияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка навигации Jetpack Compose при запуске действия из уведомления

Сообщение Anonymous »

В моем приложении есть модальная панель навигации для перехода между домашней и целевой страницами.
Я попытался запустить приложение и перейти на целевую страницу, коснувшись уведомления, содержащего намерение глубокой ссылки, и это действительно сработало. Но когда я нажал кнопку домашней страницы в ящике, навигация не показала главный экран, а осталась на целевом экране.
Затем я нажал системную кнопку возврата, экран перешел на домашнюю страницу, и навигация снова работает так, как я ожидал, можно перемещаться между двумя страницами.
Я удалил restreState = true в кнопке навигации ящика, затем обнаружил, что навигация работает нормально, но не смог восстановить состояние экрана.
/>Интересно, что вызвало эту проблему: создал ли я независимое действие поверх исходного? Или restState восстановил весь экран?
Вот мой код:
AndroidManifest.xml Код для отправки уведомления:

Код: Выделить всё

 //screenRoute is "home_page"  or "target_page"
val deeplinkUri = "myapp://$screenRoute".toUri()

val deepLinkIntent = Intent(
Intent.ACTION_VIEW,
deeplinkUri,
).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP
}

// Create PendingIntent
val pendingIntent: PendingIntent = TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(deepLinkIntent)
getPendingIntent(
hashcode,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
}

val notificationManager =
context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val builder = NotificationCompat.Builder(context, NotificationUtils.ALARM_CHANNEL_ID)
.setContentTitle("Notification Title")
.setSmallIcon(R.drawable.app_icon)
.setContentText(message)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true)

notificationManager.notify(1, builder.build())
Код панели навигации:
Я хочу установить эти две страницы как страницы верхнего уровня, поэтому я использовал popUpTo(), чтобы очистить обратную стопку.

Код: Выделить всё

  DrawerNavigationButton(
//....//
onClick = {
navController.navigate("home_page") {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
restoreState = true
launchSingleTop = true
}
}
)
DrawerNavigationButton(
//....//
onClick = {
navController.navigate("target_page") {
popUpTo(navController.graph.findStartDestination().id) {
saveState = true
}
restoreState = true
launchSingleTop = true
}
}
)
И код навигационного хоста:

Код: Выделить всё

 val uri = "myapp:/"

NavHost(
navController = navController,
startDestination = "home_page"
) {
//Home Page
composable(
route = "home_page",
deepLinks = listOf(
navDeepLink { uriPattern = "$uri/home_page" }
),
) { backStackEntry ->
HomeScreen(
//........//
)
}

//Target Page
composable(
route = "target_page",
deepLinks = listOf(
navDeepLink { uriPattern = "$uri/target_page" }
),
) { backStackEntry ->
TargetScreen(
//........//
)
}
}
Будем благодарны за любую помощь!


Подробнее здесь: https://stackoverflow.com/questions/798 ... tification
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»