1

我已经覆盖了方法onStart(), onResume(), onStop(), onPause()in MainActivity。我正在使用log.d()命令来监视何时调用这些方法。

当我android:configChanges="orientation|screenSize"在清单中使用时,不会调用我的重写方法。为什么会这样?

4

2 回答 2

2

有两种方法可以处理运行时更改。

1. Retain an object during a configuration change
2. Handle the configuration change yourself

1. 在配置更改期间保留对象

如果您在配置更改期间保留一个对象,Android 会重新启动正在运行的 Activity 并被onDestroy()调用,然后是onCreate()所有其他对象:onStart(), onResume(), onStop(),onPause()

但是如果你想自己处理配置,第二种方法是:

2.自行处理配置变更

在这里,如果您的应用程序在特定配置更改期间不需要更新资源,并且您有性能限制要求您避免重新启动活动,那么您可以声明您的活动自己处理配置更改,从而防止系统重新启动你的活动。

当您在清单android:configChanges属性中包含一个代表您要处理的配置的值时,就会发生这种情况。

例如:

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden"
          android:label="@string/app_name">

现在,当这些配置之一发生更改时,MyActivity 不会重新启动。相反,MyActivity 会收到对 onConfigurationChanged()的调用。此方法传递一个配置对象,该对象指定新的设备配置

例如,以下onConfigurationChanged()实现检查当前设备方向:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

有关更多信息,您可以继续阅读Android 开发者

于 2015-07-01T18:03:33.780 回答
1

这是因为android:configChanges="orientation|screenSize"在清单中指示不要在方向或屏幕尺寸更改时重新创建活动。

onConfigurationChanged如果您需要对方向更改做一些事情,您可以覆盖您的活动方法。

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
}

如果您确实想在方向和屏幕尺寸更改时重新启动活动,则必须android:configChanges="orientation|screenSize"从清单中删除。


清单活动元素的摘录

android:configChanges

列出活动将自行处理的配置更改。当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用该属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并onConfigurationChanged()调用其方法。

于 2015-07-01T14:42:13.770 回答