Android 根Activity按HOME键后再进入不会重新创建

在Android开发中,我们经常会遇到一种情况,当我们按下HOME键回到桌面后再次进入应用时,应用会恢复到之前的状态,而不会重新创建。这是因为Android系统在设计上为了提供更好的用户体验,保留了应用的状态信息,使得用户可以在重新启动应用时继续之前的操作。

Activity的生命周期

在了解为什么根Activity按HOME键后再进入不会重新创建之前,我们先来回顾一下Activity的生命周期。Activity是Android应用的核心组件,它有以下几个重要的生命周期方法:

  • onCreate():当Activity第一次被创建时调用。
  • onStart():当Activity变得可见时调用。
  • onResume():当Activity在前台可见时调用。
  • onPause():当Activity失去焦点但仍然可见时调用。
  • onStop():当Activity不再可见时调用。
  • onRestart():当Activity重新启动时调用。
  • onDestroy():当Activity被销毁时调用。

Activity的保存和恢复状态

在Android系统中,当我们按下HOME键回到桌面时,系统会调用Activity的onPause()onStop()方法,使得Activity失去焦点并不再可见。但是,系统并不会立即销毁Activity,而是会保留其状态信息,以便在重新进入应用时恢复。

首先,我们需要在Activity中实现onSaveInstanceState()方法,该方法会在Activity被销毁之前调用。我们可以在该方法中保存Activity的状态信息,例如用户的输入、数据的加载等等。系统会将这些状态信息保存在Bundle对象中,并在Activity重新创建时通过onCreate()方法的参数进行传递。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // 保存状态信息
    outState.putString("key", value);
}

接下来,在Activity的onCreate()方法中,我们可以通过判断传入的Bundle对象是否为null来确定是否需要恢复状态信息。如果Bundle对象不为null,说明Activity是重新创建的,我们可以从Bundle中恢复之前保存的状态信息。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 恢复状态信息
    if (savedInstanceState != null) {
        String value = savedInstanceState.getString("key");
    }
}

通过这种方式,我们可以实现Activity的状态保存和恢复,使得当我们按下HOME键回到桌面后再进入应用时,应用可以继续之前的操作。

根Activity的特殊性

在Android应用中,通常会有一个根Activity,它是应用的入口点,并且在应用的整个生命周期中只会被创建一次。当我们按下HOME键回到桌面后再次进入应用时,根Activity不会重新创建,而是直接恢复之前的状态。

这是因为根Activity被设为了singleTasksingleInstance启动模式。在AndroidManifest.xml文件中,我们可以通过设置android:launchMode属性来指定Activity的启动模式。

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    ...
</activity>
  • standard:标准模式,每次启动Activity都会创建一个新的实例。
  • singleTop:栈顶复用模式,如果要启动的Activity已经位于栈顶,则不会创建新的实例。
  • singleTask:栈内复用模式,如果要启动的Activity已经存在于一个任务栈中,则不会创建新的实例,并且会将该任务栈调至前台。
  • singleInstance:单实例模式,该Activity将独立于其他任务栈,且单独位于一个新的任务栈中。

在根Activity设为singleTasksingleInstance启动模式后,当我们按下HOME键回到桌面后再次进入应用时,系统会将之前保存的状态信息直接恢复到根Activity中,而不会重新创建