代码之家  ›  专栏  ›  技术社区  ›  Hector

为什么在GMail应用程序中点击UP&BACK会返回主屏幕,而不是我的Android应用程序

  •  0
  • Hector  · 技术社区  · 5 年前

    我当前的Android应用程序允许用户使用以下代码发送电子邮件:-

       @Suppress("SameParameterValue")
        private fun sendEmail(destinationEmailAddress: String, @StringRes resId: Int) {
            try {
                startActivity(
                    Actions.sendEmail(
                        destinationEmailAddress,
                        getString(resId),
                        getString(R.string.feedback_email_message, Build.VERSION.SDK_INT, VERSION_NAME)
                    )
                )
            } catch (_: Exception) {
                somethingWentWrong(R.string.email_error)
            }
        }
    

    具有 sendEmail 功能类似于:-

    fun sendEmail(email: String, subject: String = "", message: String = "") =
        Intent(Intent.ACTION_SENDTO)
            .apply {
                data = Uri.parse(
                    "mailto:$email" +
                            "?subject=${Uri.encode(subject)}" +
                            "&body=${Uri.encode(message)}"
                )
            }
    

    使用 BACK 键用户返回到我的应用程序。

    使用 UP 在Gmail中,他们首先会看到自己的收件箱,然后他们只能选择使用 返回 键,返回设备的主屏幕。 我的应用程序在最近的页面中仍处于“活动”状态。

    无论用户是否使用 返回 钥匙还是 向上的 & 返回 组合键?

    0 回复  |  直到 5 年前
        1
  •  3
  •   ianhanniballake    5 年前

    你无法改变Gmail的“向上”按钮的工作方式。事实上,它的工作原理与“向上”按钮的工作原理完全一致 Principles of Navigation :

    当你的应用程序使用另一个应用程序任务的深层链接启动时,向上将用户转换回你的应用程序任务,并通过模拟的后堆栈和 而不是触发深层链接的应用程序。 然而,后退按钮确实会将你带回另一个应用。

    完全可以预期,向上按钮会让Gmail中的用户在Gmail的任务中(即,Gmail在最近菜单中的条目)保持不变。这就是上后卫之间的核心区别。

        2
  •  -1
  •   SowlM    5 年前

    这个 Back Key 始终以编程方式进行管理,用于将用户从其他Avtivity或Fragmnet带回主页,这是UI/UX设计的一部分。

    大多数时候 后退键 只是一个复制品 Up Key ,比如在Gmail应用程序中,当你导航到第二个活动/片段时,会在某个位置(主要是屏幕左上角)出现一个后退键,帮助你导航回主屏幕。

    你真正需要做的是 Implement Custom Back Navigation 对于 上键 .

    为了实现这个目标,你应该理解Android任务和后台堆栈的概念,任务是用户在执行某项工作时与之交互的活动的集合。这些活动按每个活动打开的顺序排列在堆栈(后堆栈)中。

    例如,电子邮件应用程序可能有一个活动来显示新消息的列表。当用户选择一条消息时,会打开一个新的活动来查看该消息。此新活动将添加到后堆栈中。如果用户按下后退按钮,则新活动完成并弹出堆栈。这 video 提供了后台堆栈工作原理的良好概述。

    当当前活动开始另一个活动时,新活动被推到堆栈顶部并获得焦点。上一个活动保留在堆栈中,但已停止。当活动停止时,系统将保留其用户界面的当前状态。

    当用户按下后退按钮时,当前活动从堆栈顶部弹出(活动被销毁),上一个活动继续(其UI的上一个状态被恢复)。

    A representation of how each new activity in a task adds an item to the back stack. When the user presses the Back button, the current activity is destroyed and the previous activity resumes.

    在你的情况下,你需要做的是“提供定制的后台导航”

    您可能希望覆盖默认的后退按钮行为,以允许用户在其网页浏览历史记录中导航,而不是在应用程序中导航到以前的屏幕。

    因此,您应该实现自定义的反向导航。

    ComponentActivity ,是 FragmentActivity AppCompatActivity ,允许您通过使用其 OnBackPressedDispatcher ,您可以通过调用 getOnBackPressedDispatcher() .

    这个 OnBackPressedDispatcher 控制如何将后退按钮事件分派给一个或多个 OnBackPressedCallback 物体。的构造函数 OnBackPressedCallback 初始启用状态采用布尔值。仅当启用回调时(即。, isEnabled() 返回true)调度器会调用回调函数的 handleOnBackPressed() 来处理后退按钮事件。您可以通过调用 setEnabled() .

    回调是通过addCallback方法添加的。强烈建议使用 addCallback() 方法,该方法需要 LifecycleOwner 。这可确保 OnBackPressedCallback 仅当 LifecycleOwner 这就是生命周期。状态起动。该活动还将在关联回调时删除已注册回调 生命周期所有者 被销毁,这可以防止内存泄漏,并使其适合在比活动的生命周期更短的片段或其他生命周期所有者中使用。

    下面是一个回调实现示例:

    class MyFragment : Fragment() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            // This callback will only be called when MyFragment is at least Started.
            val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
                // Handle the back button event
            }
    
            // The callback can be enabled or disabled here or in the lambda
        }
        ...
    }
    

    如果你想在活动中这样做 onBackPressed() 要处理后退按钮事件,建议使用 OnBackPressedCallback 相反但是,如果您无法进行此更改,则以下规则适用:

    • 所有通过addCallback注册的回调都会在调用super时进行计算。onBackPressed()。
    • onBackPressed始终被调用,无论是否注册 OnBackPressedCallback的实例。