finish()在Android活动生命周期中的正确角色

时间:2016-06-24 00:07:14

标签: android android-activity

我已阅读Android Activity Lifecycles的文档,而且似乎不清楚的是:

调用finish()的惯例是什么?

特别是:

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

3 个答案:

答案 0 :(得分:1)

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

ActivityA启动ActivityB但未调用finish()时,ActivityA堆栈中仍然存在Activity任务。当ActivityB结束时,ActivityA将会显示,因为它现在是堆栈中的顶级Activity

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

答案 1 :(得分:0)

如果我们假设:

 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) { 
        ...
    }
}

回答你的问题你需要知道你计划在以后对你的活动做些什么? - 通常预测它的寿命!

  • 将其留在堆栈中供以后使用
  • 仅释放资源并保留实例(以省略以后的初始化时间)
  • 销毁它的实例(如果你不再使用它) - 完成

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

答案 2 :(得分:-1)

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

它接收数据,计算某些内容然后调用完成以返回主应用程序。

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

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