【问题标题】:Proper role of finish() in Android activity lifecycle [duplicate]finish()在Android活动生命周期中的正确作用[重复]
【发布时间】:2016-06-24 00:07:13
【问题描述】:

我已经阅读了 Android Activity Lifecycles 的文档,其中似乎不清楚的是:

调用finish()的约定是什么?

特别是:

  1. 我为另一个应用程序创建了一个Intent。我是否会就我当前的活动致电finish()
  2. 我触发了一个登录页面,LoginActivity,由MainActivity 调用。启动LoginActivity 时,我是否在MainActivity 上调用finish()?完成身份验证后,我是否在LoginActivity 上调用finish()

【问题讨论】:

  • 我不认为它是重复的——我知道finish() 做了什么,我在询问何时调用它的约定,因为它似乎没有在任何地方明确列出。
  • @MaxFeng - 看我的回答

标签: android android-activity


【解决方案1】:

您的问题没有单一的正确答案。这在很大程度上取决于您应用中的工作流程。

ActivityA 启动ActivityB 并且不调用finish() 时,ActivityA 仍然存在于任务的Activity 堆栈中。当ActivityB 结束时,ActivityA 将显示,因为它现在是堆栈中的顶部 Activity

ActivityA 启动ActivityB 并对其自身调用finish() 时,ActivityA 不再存在于任务的Activity 堆栈中。当ActivityB 结束时,ActivityA 将不会显示,因为它不再在堆栈中。将显示ActivityA 下方的Activity(如果有),否则任务将结束,因为其中不再有任何实时活动。

【讨论】:

    【解决方案2】:

    如果我们假设:

     Activity is "Window Manager"  
    

    --因为它的主要组件是 Window )

    所以调用finish() 等于Window'ed 应用程序中的关闭按钮:)

    • 用于回收资源。

    为了确认这个假设,我们可以查看 Activity 类定义

    public class Activity extends ContextThemeWrapper
        implements LayoutInflater.Factory2,
        Window.Callback, KeyEvent.Callback,
        OnCreateContextMenuListener, ComponentCallbacks2,
        Window.OnWindowDismissedCallback {
    
      ...
    
       private WindowManager mWindowManager;
       /*package*/ View mDecor = null;
    
      ...
    
    
        /**
         * Call this when your activity is done and should be closed.  The
         * ActivityResult is propagated back to whoever launched you via
         * onActivityResult().
         */
        public void finish() {
            finish(false);
        }
    
        /**
         * Finishes current activity & specifies whether to remove the task associated with it.
         */
        private void finish(boolean finishTask) { 
            ...
        }
    }
    

    回答您的问题您需要知道您稍后计划对您的活动做什么? - 一般预测它的寿命!

    • 将其留在堆栈中以备后用
    • 仅释放资源并持有实例(以省略耗时的后期初始化)
    • 销毁它的实例(以防你不再使用它) - 完成

    何时调用完成???取决于应用程序代码中存在的许多因素,并且它是个性化的,需要单独的方法。

    【讨论】:

      【解决方案3】:

      finish() 主要是在创建活动以获得结果时调用 (startActivityForResult)。

      它接收数据,计算一些东西,然后调用完成返回主应用程序。

      按下后退按钮时也会隐式调用。

      最后,它被用在主/细节对活动中。例如,您选择一篇文章来阅读它,然后您回到它之后的列表。但是您应该使用片段来实现这一点。

      【讨论】:

      • 所以在我的例子中,我不需要在MainActivity 上调用finish(),但我应该在LoginActivity 上调用?
      • 如果您的主入口点是 MainActivity(Manifest 中的主启动器),如果用户尚未连接,您可以调用 LoginActivity,然后调用完成返回主 Activity。这样,您的活动堆将包含 Main Activity 而不是 MainActivity / LoginActivity / MainActivity 更高效
      • 这不是真的。调用finish() 结束一个Activity(将其从任务中的Activity 堆栈中移除,触发对onDestroy() 的调用,以便GC 可以回收资源)。而已。如果ActivitystartActivity()startActivityForResult() 开头,则没有区别。如果finish() 未被调用(由您显式调用或由Android 框架隐式调用),则您的Activity 仍处于活动状态,处于活动状态并存在于任务的Activity 堆栈中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      相关资源
      最近更新 更多