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

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

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

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

【问题讨论】:

    标签: android android-activity activity-lifecycle


    【解决方案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() 中。每天都能学到新东西,我猜……
    • 不!不完全是 请参阅:stackoverflow.com/questions/12655898/…
    【解决方案3】:

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

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

    【讨论】:

    • 这些是鲜为人知的优秀方法,但我不相信有onPostPause()
    • 谢谢。我会调查的。我了解到大多数 Android 书籍中没有提到很多内容。
    【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2018-07-18
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      • 2015-05-13
      • 2013-07-10
      • 1970-01-01
      相关资源
      最近更新 更多