Activity 中 onBackPressed() 的默认实现是什么

What is the default implementation of onBackPressed() in Activity

我想知道 ActivityonBackPressed() 的默认实现。如何处理 onBackPressed() 默认实现中的 Activity 恢复?

以下是我遇到的问题。我有一个这样的测试 Activity 代码:

public class MainActivity extends Activity {
    public static boolean test = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this,"is "+test,Toast.LENGTH_LONG).show();
        test = !test;
    }
}

当我第一次进入应用程序时,我得到 'is false'。然后我单击后退按钮并进入主屏幕。之后,当我进入应用程序时,我得到了 Toast 'is true'。我认为 onBackPressed() 在返回主屏幕时应该终止我的应用程序,但事实并非如此。这是我的问题。

如果我像这样覆盖 onBackPressed()

@Override
public void onBackPressed() {
//  super.onBackPressed();
    finish();
    try {
        android.os.Process.killProcess(android.os.Process.myPid());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我总是在进入应用程序后得到 Toast'is false'。

任何人都可以解释这个问题并告诉我 onBackPressed() 的默认实现是什么吗?

我想详细了解onBackPressed()中的流程。看了onBackPressed()上的一些源码,但是没看懂

提前致谢。

从 AOSP Activity class 找到 here:

/**
 * Called when the activity has detected the user's press of the back
 * key.  The default implementation simply finishes the current activity,
 * but you can override this to do whatever you want.
 */
public void onBackPressed() {
    if (mActionBar != null && mActionBar.collapseActionView()) {
        return;
    }

    if (!mFragments.getFragmentManager().popBackStackImmediate()) {
        finishAfterTransition();
    }
}

所以基本上当你调用完成时,进程实际上并没有被销毁。您可以阅读更多相关内容 here。这意味着您的应用程序中的内存不会被破坏,因此当您重新启动您的应用程序时,之前的 boolean 值会被记住。

在重写实现的情况下,您明确销毁了进程,这将清除您的 activity 状态的内存,因此当您重新启动应用程序时,boolean 初始化将再次发生.

ActivityonBackPressed() 的默认实现可能不会告诉您很多关于实际 Activity/应用程序生命周期的信息。你应该挖多少北斗来了解内部Android(和Linux)"mechanics"对application/process的杀戮。

应用程序开发人员应该知道的是,一旦 Activity 在后台(按下主页按钮、收到来电等,即 onPause() 后跟 onStop() 已被调用) 它的进程可能(类似于你对 android.os.Process.killProcess(...) 所做的)也可能不会被杀死。请参阅 Dianne Hackborn 的 Multitasking the Android Way 以供参考。

至于通过按后退按钮完成 Activity,并不意味着它的实例将立即被杀死并收集内存垃圾(参见 this answer)。这只是意味着 Activity 的新实例将在您下次导航回它时创建。

关于您的代码和

When I first enter the app, I get 'is false'. Then I click back button and get to the home screen. After that, when I enter the app, I get the Toast 'is true'. I think the onBackPressed() should kill my app when it gets back to the home screen, but It does not.

这是当 Activity 处于后台时系统没有终止进程的情况(同样,不能保证)。如果是这样,Toast 会显示 false.

为了检查每次按下后退按钮然后导航回应用程序时是否创建了 MainActivity 的新实例,我不建议使用静态变量,- 它出现不是那么明显(例如,参见 is it possible for Android VM to garbage collect static variables... or Are static fields open for garbage collection?)。

此外,您只是在 truefalse 之间切换,这可能会造成混淆。例如,您可以使用 non-static 递增它而不是使用静态变量,或者 toast 当前 Activity 实例的哈希码,如 Toast.makeText(this,"is " + this.hashCode(), Toast.LENGTH_LONG).show()。通过这样做,Activity 生命周期应该按照 documentation.

If I override onBackPressed() ... I always get the Toast 'is false' after I enter the app.

这或多或少类似于系统终止您的应用进程时的情况。