java - Android - 调用 "finish()"不会触发 onDestroy

标签 java android android-intent android-lifecycle

我有 3 项 Activity 。我想做这样的事情:

A -> 按下按钮时 -> B -> 按下按钮时 -> (销毁 A、B)创建 C

一切正常,但我注意到 Android Studio 日志中有一些“奇怪”的行为。

当我按下 Activity A 上的按钮时,这就完成了:

I/System.out: The A Activity is onStart. 
I/System.out: The A Activity is onResume. 
I/System.out: The A Activity is onPause. 
I/System.out: The B Activity is onResume. 
I/System.out: The A Activity is stopped.

然后我在 Activity B 上再次按下按钮:

I/System.out: The B Activity is paused.
I/System.out: The B Activity is stopped.

然后我进入 Activity C。但是即使我在 Activity B中调用finish()方法,控制台上也没有写出 Activity A和B被销毁。

只是,当我从 Activity C 中按下后退按钮时,就会执行此操作。

I/System.out: The B Activity is destroyed.
I/System.out: The A Activity is destroyed.

我会自动退出应用程序。

我的问题是: 为什么当我按下 Activity B 上的按钮时没有触发此操作?

B级:

startActivity(new Intent(this, C.class));

B 停止:

@Override
protected void onStop() {

    Intent returnIntent = getIntent();
    setResult(Activity.RESULT_CANCELED, returnIntent);
    finish();

    super.onStop();

    System.out.println("The B Activity is stopped.");
}

一个类:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1){
        finish();
    }
}

编辑:

还有一件奇怪的事情,当我按下 Activity B中的按钮时,我进入 Activity C,并且执行 Activity B onStop。

但是:

  1. 正如我所说,finish() 不会触发
  2. setResult() 不会触发 Activity A“onActivityResult”

setResult()什么时候触发?与 onDestroy() 一起使用?

编辑2

如果您阅读评论,就会出现另一个有趣的问题。

为什么当 onStop() 调用 finish() 时,onDetroy() 方法没有被调用?当 finish() 方法超出 onStop() 时,onDestroy() 会正常调用。

这是正常的/设计使然吗?

最佳答案

  1. Activity 位于堆栈中,因此当您从一个 Activity 启动新 Activity 时,旧的 Activity 不会被销毁,它将保留在堆栈中,因为通常您会在应用程序的生命周期中返回到它,方法是按“后退按钮”。

  2. 当您想要触发 Activity 的结果时,必须调用 startActivityForResult

  3. onDestroy 在不再需要 Activity 时触发,这是 Android 框架的决定,您无法真正知道何时发生这种情况,因为 Android 猜测您很有可能会在您的应用程序中回到它。应用程序生命周期。它取决于使用的内存和导航到它的距离,只是构建 Activity 的优化以避免滞后行为。

关于java - Android - 调用 "finish()"不会触发 onDestroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35972726/

相关文章:

java - 标记注释与标记界面

Jpanel添加Jpanel后Java Swing repaint()、revalidate()问题

android - 使用 FileProvider 通过 Intent 发送多个不同类型的文件

android-intent - GA Android SDK中的广告系列评估令人困惑

android - Android EditText 中的 Highlite 特定单词

android - 为什么在 android 通知 Intent 中不发送额外数据(整数)?

java - 在java代码中创建隐藏文件夹

Java GUI 未显示

android - 获取 JSON 响应 Android

android - "Webpage not found""file:///android_asset/html-nl/index.html not found"安卓设备错误