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

37

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


1
http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges - Marcin Gil
1
如果我添加android:configChanges="orientation",整个活动将不会重新启动,而是调用onConfigurationChanged()方法? - Nikola Despotoski
请记住,您可以为纵向和横向拥有不同的布局 - 这样您的活动需要重新创建/填充。 - Marcin Gil
@Marcin Gil,我有一个地图,并在用户位置上绘制了图形,但当方向发生变化时,图形会被删除。我想保留它。我创建了reDraw()方法来重新绘制位置,但应用程序重新启动整个活动... - Nikola Despotoski
请查看此处:http://developer.android.com/resources/articles/faster-screen-orientation-change.html - Marcin Gil
2个回答

45

有趣的问题...

默认情况下,活动在XML中声明了onResume()

根据stackoverflow上的问题答案所述:

屏幕方向更改

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

切换到第二个活动

  • onSaveInstanceState
  • onPause

在第二个活动中更改屏幕方向

  • onStop
  • onCreate
  • onStart

从第二个活动返回

  • onResume

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

因此,如果您想在onSaveInstanceState中使用Bundle保存自己的数据,则需要在您的onCreate(在Activity 1中)中添加额外的逻辑来处理您自己的数据(以及在onRestoreInstanceState中有条件地这样做)。

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


6
实际上,屏幕方向变化会导致以下生命周期方法的调用顺序:onPause -> onSave... -> onStop -> onCreate -> onStart -> onResume。请注意,这里只是翻译原文,没有添加额外的解释或信息。 - Max
1
是的,在所有情况下,onPause 都会先执行,然后才是 onSaveInstanceState - Max Ivashkevich
2
根据Android文档,没有人能够预测onSaveInstanceState在onPause之前还是之后被调用。我们只能确定的是onSaveInstanceState会在onStop之后被调用。 - Abhinav Arora
3
这不正确。我们只能说onSaveInstanceState方法会在停止前被调用 -> "如果被调用,此方法将在onStop()之前发生。无法保证它会在onPause()之前或之后发生。" - marko.petrovic
6
在我的情况下,当旋转屏幕时 onDestroy 方法也会被调用。 - Vivek Mishra
1
屏幕方向变化 = onPause() -> onSaveInstanceState() -> onStop() -> onDestroy() -> onCreate() -> onStart() -> onRestoreInstanceState() -> onResume() - Shlomi Fresko

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");
}

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

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

我希望这种替代方法能够更好地了解活动生命周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接