当方向发生变化时,会调用哪种活动方法?

Nik*_*ski 31 android orientation onresume android-activity

当方向发生变化时,会调用生命周期的哪种方法?我的应用程序执行该onResume()方法或者可能重新加载整个活动,因为我已经设置了一个布尔值来检查它是否是第一次运行.onConfigurationChanged()当方向发生变化时,我已经开始阅读,这是真的吗?怎么办呢?

Sit*_*ten 38

有意思的......

Activity是start onResume(),默认情况下在XML中声明.

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

方向变化

  • 的onSaveInstanceState
  • 在onPause
  • 的onStop
  • 的onCreate
  • 在onStart
  • onRestoreInstanceState
  • 的onResume

切换到活动2

  • 的onSaveInstanceState
  • 在onPause

在活动2中改变方向

  • 的onStop
  • 的onCreate
  • 在onStart

从Activity2切换回来

  • 的onResume

我猜测因为活动1在旋转时被隐藏,onRestoreInstanceState因为没有"视图"(即,它无法被查看/查看)而未被调用.此外,完全可以为纵向/横向设置2个完全不同的布局文件,这些文件可能具有不同的具有不同ID的UI元素.

因此,我想说如果你想使用Bundle onSaveInstanceState来保存你自己的数据,那么你需要在你的onCreate(在Activity 1中)添加额外的逻辑来处理你自己的数据(以及在那里有条件地执行它)onRestoreInstanceState).

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

  • 实际上方向改变=`onPause` - >`onSave ...` - >`onStop` - >`onCreate` - >`onStart` - >`onResume` (6认同)
  • ^^这是不正确的.我们只能说onSaveInstanceState被称为BEFORE onStop - >"如果被调用,这个方法将在onStop()之前发生.不能保证它是在onPause()之前还是之后发生." (3认同)
  • 在我的情况下,`onDestroy`也在轮换时被调用 (3认同)
  • 根据android文档,没有人能预料到onSaveInstanceState是在onPause之前还是之后被调用。我们只能肯定地说在onStop http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)之后调用onSaveInstanceState (2认同)

小智 5

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");
}
Run Code Online (Sandbox Code Playgroud)

}

1) 尝试在您的手机和/或模拟器上运行您的应用程序,然后打开窗口顶部的 Logcat => 选择 V​​erbose。

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

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