Я попытался запустить приложение и перейти на целевую страницу, коснувшись уведомления, содержащего намерение глубокой ссылки, и это действительно сработало. Но когда я нажал кнопку домашней страницы в ящике, навигация не показала главный экран, а осталась на целевом экране.
Затем я нажал системную кнопку возврата, экран перешел на домашнюю страницу, и навигация снова работает так, как я ожидал, можно перемещаться между двумя страницами.
Я удалил 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
Мобильная версия