使用后退按钮离开 activity 后,待定意向仍然存在
Pending intent stays after leaving activity with back button
我正在使用带有通知的待处理意图向我的设备发送推送。
我的待处理意图包含将在我的 MainActivity
onCreate()
方法中用于处理导航的字段。成功导航到我的应用程序中的任何一点后,我点击后退按钮,直到我的应用程序进入后台。紧接着我的 activity 出于某些原因立即调用 onDestroy()
(使用 android 模拟器 API 28)。问题是,将应用程序提升到前台后,PendingIntent 仍然存在,我的应用程序再次执行导航。
真是奇怪。我一直认为带有 FLAG_ONE_SHOT
的意图只能使用一次。我也试着自己弄清楚意图,但也没成功。
我的意图构建
const val NAVIGATION_BUDNLE = "nav_bundle"
private fun createPendingIntent(): PendingIntent? {
val destination = resolveDestionation()
val intent = Intent(context.applicationContext, MainActivity::class.java).apply {
flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
putExtra(NAVIGATION_BUDNLE, destination)
}
return PendingIntent.getActivity(context, Random.nextInt(), intent, FLAG_ONE_SHOT)
}
在 activity onCreate()
方法的末尾,我有这些行来处理导航。
intent?.extras?.get(NAVIGATION_BUNDLE)?.let {
navController.setGraph(R.navigation.nav_graph, it as Bundle)
clearCurrentIntent() // intent = null and intent?.extras?.remove(NAVIGATION_BUNDLE)
}
好的,我知道了(非常感谢 this 的回答)!因此,如果您离开 activity 并按下后退按钮,就会发生这种情况。在这种情况下,您的 activity 将调用 onDestroy()
方法而不调用 onSaveInstanceState()
并且您将一遍又一遍地收到相同的意图(当然,同时单击返回退出您的应用程序)。您需要做的就是检查您的应用程序是否是最近调用的。为此,您可以在主要 activity 阅读您的意图之前实施此检查:
if (intent.flags and FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == 0) {
intent?.extras?.get(NAVIGATION_BUNDLE)?.let {
navController.setGraph(R.navigation.nav_graph, it as Bundle)
}
}
如果您的应用程序是最近启动的, 标志 FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
将出现,这是解决此特定问题的非常小的解决方法。如果出现此标志只是不阅读您的意图,就是这样。
我正在使用带有通知的待处理意图向我的设备发送推送。
我的待处理意图包含将在我的 MainActivity
onCreate()
方法中用于处理导航的字段。成功导航到我的应用程序中的任何一点后,我点击后退按钮,直到我的应用程序进入后台。紧接着我的 activity 出于某些原因立即调用 onDestroy()
(使用 android 模拟器 API 28)。问题是,将应用程序提升到前台后,PendingIntent 仍然存在,我的应用程序再次执行导航。
真是奇怪。我一直认为带有 FLAG_ONE_SHOT
的意图只能使用一次。我也试着自己弄清楚意图,但也没成功。
我的意图构建
const val NAVIGATION_BUDNLE = "nav_bundle"
private fun createPendingIntent(): PendingIntent? {
val destination = resolveDestionation()
val intent = Intent(context.applicationContext, MainActivity::class.java).apply {
flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
putExtra(NAVIGATION_BUDNLE, destination)
}
return PendingIntent.getActivity(context, Random.nextInt(), intent, FLAG_ONE_SHOT)
}
在 activity onCreate()
方法的末尾,我有这些行来处理导航。
intent?.extras?.get(NAVIGATION_BUNDLE)?.let {
navController.setGraph(R.navigation.nav_graph, it as Bundle)
clearCurrentIntent() // intent = null and intent?.extras?.remove(NAVIGATION_BUNDLE)
}
好的,我知道了(非常感谢 this 的回答)!因此,如果您离开 activity 并按下后退按钮,就会发生这种情况。在这种情况下,您的 activity 将调用 onDestroy()
方法而不调用 onSaveInstanceState()
并且您将一遍又一遍地收到相同的意图(当然,同时单击返回退出您的应用程序)。您需要做的就是检查您的应用程序是否是最近调用的。为此,您可以在主要 activity 阅读您的意图之前实施此检查:
if (intent.flags and FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == 0) {
intent?.extras?.get(NAVIGATION_BUNDLE)?.let {
navController.setGraph(R.navigation.nav_graph, it as Bundle)
}
}
如果您的应用程序是最近启动的, 标志 FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
将出现,这是解决此特定问题的非常小的解决方法。如果出现此标志只是不阅读您的意图,就是这样。