finish() 和 Activity 生命周期

Posted

技术标签:

【中文标题】finish() 和 Activity 生命周期【英文标题】:finish() and the Activity lifecycle 【发布时间】:2012-09-21 06:38:08 【问题描述】:

我正在为一门课程学习 android 编程,我有一个关于 finish() 如何融入 Activity 生命周期的快速问题。

当您调用finish() 时,会启动哪个生命周期回调?我认为它是 onPause(),然后是 onStop() 和 onDestroy()。这是正确的吗?

真的,我只是想确保它不会直接跳转到 onDestroy()。

【问题讨论】:

【参考方案1】:

真的,我只是想确保它不会直接跳转到 onDestroy()。 ???

不!

但是有一个例外调用finish()导致活动生命周期中断当你从onCreate()方法调用finish()时会发生这种情况onDestroy() 将立即被调用!

http://developer.android.com/reference/android/app/Activity.html#onCreate(android.os.Bundle)

【讨论】:

首先,链接已过时。这是当前版本:developer.android.com/reference/android/app/… 第二,大喊“不!”回答问题是一种非常粗鲁的方式,尤其是当您在自己的答案中这样做时,在一堆对其他人的答案的回复中。话虽如此,是的,这是正确的。 我同意巨大的“NO”令人不快,但是我认为帖子中的信息非常相关,并且人们在找到这个问题时会希望看到一些内容。我个人赞成投票。【参考方案2】:

你是对的。 onPause、onStop、onDestroy。

Here 是文档。

【讨论】:

感谢该链接,我之前实际上并没有看到该系列(我一直在查看 API 文档)。但是,提出了一些其他问题——例如,我认为 onDestroy() 将用作“析构函数”,而不是 onStop();并且所有持久数据都应该写入 onPause() 中。每天都能学到新东西,我猜…… 不!不完全是 请参阅:***.com/questions/12655898/…【参考方案3】:

是的,它不会跳过 onPause 和 onStop 跳转到 onDestroy()。

你也可能对 onPostResume() ,onPostPause() ,onPostCreate(),onUserLeaveHint() 等感兴趣。 这些都没有在Activity生命周期中列出来

【讨论】:

这些是鲜为人知的优秀方法,但我不相信有onPostPause() 谢谢。我会调查的。我了解到大多数 Android 书籍中没有提到很多内容。 不完全是 ***.com/questions/12655898/…【参考方案4】:

分析此类问题和问题对您来说也可能很有趣。例如,您可以在 onPause() 方法中设置一个调试断点,并从该点调查程序流程。

还有一些打印输出可以为您提供一些有用的信息。

例如,您可以编写 System.out.println("方法名称" + "被调用。");在您认为被调用的每个活动方法中。 (例如覆盖 onPause(),调用 super.onPause() 并放置控制台打印输出以查看是否调用了该方法。

在您开发过程中,您将了解很多有关 Android 系统的知识。

【讨论】:

【参考方案5】:

创建一个新的 Android 应用并将其放置在主 Activity 中。

然后查看输出的 LogCat 窗口(在 Android 的 DDMS 下)

以相同的方式构建您的应用程序 - 将所有 onPause、onStop 等方法与输出添加到 LogCat。

当您的程序运行时,您可以监控调用的内容和时间。

package com.app.myapp;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;


public class MyApp extends Activity


    @Override
    protected void onCreate(Bundle savedInstanceState)
    
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        LinearLayout layout = new LinearLayout(this); 

        Button exit = new Button(this);
        exit.setText("finish");
        exit.setOnClickListener(new Button.OnClickListener()
        
            public void onClick(View v)
            
                // TODO Auto-generated method stub
                Log.v("MyApp", "finish");
                finish();
            
        );

        layout.addView(exit);

        setContentView(layout);

        Log.v("MyApp", "onCreate");
    

    @Override
    protected void onDestroy()
    
        // TODO Auto-generated method stub
        super.onDestroy();

        Log.v("MyApp", "onDestroy");
    

    @Override
    protected void onPause()
    
        // TODO Auto-generated method stub
        super.onPause();

        Log.v("MyApp", "onPause");
    

    @Override
    protected void onRestart()
    
        // TODO Auto-generated method stub
        super.onRestart();

        Log.v("MyApp", "onRestart");
    

    @Override
    protected void onResume()
    
        // TODO Auto-generated method stub
        super.onResume();

        Log.v("MyApp", "onResume");
    

    @Override
    protected void onStart()
    
        // TODO Auto-generated method stub
        super.onStart();

        Log.v("MyApp", "onStart");
    

    @Override
    protected void onStop()
    
        // TODO Auto-generated method stub
        super.onStop();

        Log.v("MyApp", "onStop");
    


【讨论】:

这个建议(和 Jan Koester 的)的问题是我无法测试 Android 系统自动销毁 Activity 以释放资源的情况。或者如果有办法,我也不知道是什么。 可以使用Java的finalize方法。在 GC 销毁对象之前,它会调用此方法。使用系统输出或调用 LogCat。此外,查看 Android 模拟器中的设置和开发工具,有一些方便的功能可能会对您有所帮助。这是链接:developer.android.com/tools/debugging/debugging-devtools.html

以上是关于finish() 和 Activity 生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Activity的生命周期

Activity生命周期以及启动模式对生命周期的影响

Activity生命周期

Activity活动周期--活动的生存期

第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化

Activity的销毁