android - 使用后退按钮离开活动后,待定意图仍然存在
问题描述
我正在使用带有通知的待处理意图向我的设备发送推送。
我的待处理意图包含将在我的MainActivity
onCreate()
方法中用于处理导航的字段。成功导航到我的应用程序中的任何点后,我点击后退按钮,直到我的应用程序进入后台。onDestroy()
在那之后,我的活动由于某些原因立即调用(使用 android 模拟器 API 28)。问题是在将应用程序提升到前台后,PendingIntent 仍然存在,我的应用程序再次执行导航。
这真的很奇怪。我一直认为意图 withFLAG_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)
}
在活动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)
}
解决方案
好的,我知道了(非常感谢这个答案)!因此,如果您按下后退按钮离开活动,则可能会发生这种行为。在这种情况下,您的活动将在onDestroy()
不调用的情况下调用方法,onSaveInstanceState()
并且您将一遍又一遍地收到相同的意图(当然,在单击返回以退出您的应用程序时)。您需要做的就是检查您的应用程序是否是从最近调用的。为此,您可以在主要活动阅读您的意图之前实施此检查:
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
,这是针对此特定问题的一个非常小的解决方法。如果出现此标志只是不阅读您的意图,仅此而已。
推荐阅读
- regex - 在 htaccess 身份验证中排除主页 URL
- python - 如何删除 NaN 列?
- python-3.x - 类 MarketingBusinessDetailView(generic.DetailView): syntaxError: 无效语法
- react-native - JSON 解析错误:无法识别的令牌'<' - 在 React Native 中
- postgresql - Postgresql 递归函数
- python - 将 git 克隆到虚拟 Python 环境的推荐工作流程
- python - Python在docx中一张一张插入图片
- python - 如何将字符串列表转换为python中的字典列表
- google-app-engine - Google Cloud 未正确安装软件包
- android - 如何将自定义字体应用于xamarin android中的导航抽屉项目