36

当方向改变发生时,生命周期的哪个方法被调用?我的应用程序执行该onResume()方法或者可能重新加载整个活动,因为我设置了一个布尔值来检查它是否是第一次运行。我读过onConfigurationChanged()当方向改变发生时开始,是真的吗?如何处理?

4

2 回答 2

44

一个有趣的...

Activity is startonResume()是您默认在 XML 中声明的。

正如我从关于堆栈溢出的问题答案中发现的那样:

方向改变

  • onSaveInstanceState
  • 暂停
  • 停止
  • 创建
  • 开始
  • onRestoreInstanceState
  • 恢复

切换到活动 2

  • onSaveInstanceState
  • 暂停

在活动 2 中改变方向

  • 停止
  • 创建
  • 开始

从 Activity2 转回

  • 恢复

我猜是因为 Activity 1 在旋转时被隐藏,onRestoreInstanceState所以不会因为没有“视图”而被调用(即,它不能被看到/查看)。此外,完全有可能拥有 2 个完全不同的纵向/横向布局文件,它们可能具有具有不同 ID 的不同 UI 元素。

因此,我想说如果你想使用 BundleonSaveInstanceState来保存你自己的数据,那么你需要在你的onCreate(在活动 1 中)添加额外的逻辑来处理你自己的数据(以及有条件地在onRestoreInstanceState)。

特别是,您可以维护一个“最后已知”的方向字段,以便onCreate知道它需要处理您自己的数据,因为方向已经改变,而不是依赖于onRestoreInstanceState被调用。

于 2011-06-11T12:40:01.250 回答
4
public class MainActivity extends AppCompatActivity {
private final static String TAG = "AppActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate(Bundle) called");
    setContentView(R.layout.activity_main);
}

@Override
public void onStart() {
    super.onStart();
    Log.d(TAG, "onStart() called");
}

@Override
public void onPause() {
    super.onPause();
    Log.d(TAG, "onPause() called");
}

@Override
public void onResume() {
    super.onResume();
    Log.d(TAG, "onResume() called");
}

@Override
public void onStop() {
    super.onStop();
    Log.d(TAG, "onStop() called");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy() called");
}

}

1) 尝试在您的手机和/或模拟器上运行您的应用程序并打开窗口顶部的 Logcat => 选择详细。

2) 现在尝试更改屏幕方向(例如从纵向 => 横向模式)。

我希望这个替代方案能让您更深入地了解活动生命周期。

于 2018-08-06T17:29:45.907 回答