我已经覆盖了方法onStart()
, onResume()
, onStop()
, onPause()
in MainActivity
。我正在使用log.d()
命令来监视何时调用这些方法。
当我android:configChanges="orientation|screenSize"
在清单中使用时,不会调用我的重写方法。为什么会这样?
我已经覆盖了方法onStart()
, onResume()
, onStop()
, onPause()
in MainActivity
。我正在使用log.d()
命令来监视何时调用这些方法。
当我android:configChanges="orientation|screenSize"
在清单中使用时,不会调用我的重写方法。为什么会这样?
有两种方法可以处理运行时更改。
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 开发者
这是因为android:configChanges="orientation|screenSize"
在清单中指示不要在方向或屏幕尺寸更改时重新创建活动。
onConfigurationChanged
如果您需要对方向更改做一些事情,您可以覆盖您的活动方法。
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
如果您确实想在方向和屏幕尺寸更改时重新启动活动,则必须android:configChanges="orientation|screenSize"
从清单中删除。
清单活动元素的摘录
android:configChanges
列出活动将自行处理的配置更改。当运行时发生配置更改时,默认情况下会关闭并重新启动 Activity,但使用该属性声明配置会阻止 Activity 重新启动。相反,活动保持运行并onConfigurationChanged()
调用其方法。