当android:configChanges =“orientation | screenSize”在清单文件中时,为什么不调用生命周期活动方法

时间:2015-07-01 14:33:56

标签: android android-manifest android-lifecycle android-configchanges onstart

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

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

2 个答案:

答案 0 :(得分:2)

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

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

<强> 1。在配置更改期间保留对象

如果您在配置更改期间保留对象,Android会重新启动正在运行的活动并调用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()。此方法传递给Configuration   指定新设备配置的对象

例如,以下 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 Developers

答案 1 :(得分:1)

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

如果您需要对方向更改执行某些操作,则可以覆盖活动的onConfigurationChanged方法。

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

如果确实需要重新开始定位和屏幕尺寸更改的活动,则必须从清单中删除android:configChanges="orientation|screenSize"

摘自manifest activity element

android:configChanges

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