使用后退按钮离开活动后挂起的意图保持

如何解决使用后退按钮离开活动后挂起的意图保持

我正在使用带有通知的待处理 Intent 向我的设备发送推送。

我的待处理意图包含将在我的 MainActivity onCreate() 方法中用于处理导航的字段。成功导航到我的应用程序中的任何一点后,我点击后退按钮,直到我的应用程序进入后台。紧接着,我的活动出于某些原因立即调用 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)
}

在活动 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 将调用 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,这是针对此特定问题的一个非常小的解决方法。如果出现的这个标志只是不理解你的意图,就是这样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?