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 生命周期的主要内容,如果未能解决你的问题,请参考以下文章