当我改变屏幕方向时,应用程序会重新启动并且我会丢失当前的数据。 我正在使用一个包含许多活动的活动组,当我从主活动更改方向时,应用程序会重新启动。
有没有可能避免在屏幕方向更改时重新启动应用程序?
如果有人知道,请告诉我。
当我改变屏幕方向时,应用程序会重新启动并且我会丢失当前的数据。 我正在使用一个包含许多活动的活动组,当我从主活动更改方向时,应用程序会重新启动。
有没有可能避免在屏幕方向更改时重新启动应用程序?
如果有人知道,请告诉我。
android:configChanges="orientation|keyboardHidden"
属性。如果你的android目标SDK版本为13或更高,则需要将 android:configChanges
的值设置为 orientation|keyboardHidden|screenSize
。总体上应该像这样:<activity android:name=".MyActivity" android:configChanges="<your value here>">
。默认情况下,Android在方向改变时会重新启动活动。
在Android销毁活动之前,您需要通过调用onSaveInstanceState()
来保存数据/状态。
请看这里:处理运行时更改
这个SO问题也是一个很好的阅读材料,可以帮助理解如何处理它。
您可以通过将android:configChanges="orientation"
添加到AndroidManifest文件中的活动中来防止此问题。
来源:http://developer.android.com/guide/topics/manifest/activity-element.html#config
<activity android:name="SomeActivity" android:configChanges="keyboardHidden|orientation">
但我建议不要这样做,因为这通常是潜在问题尚未出现的迹象。这就是它应该工作的方式。有一种方法可以使它不这样做,但你应该遵循生命周期并能够优雅地处理活动重启。这个问题在这里已经被问过很多次。
在API文档中有一些关于为什么当前Activity会被销毁和重建的好信息。上次我处理相关问题时,我发现这些信息非常有启发性。
除非您另有指定,否则配置更改(例如屏幕方向的更改[...])将导致当前Activity被销毁,并按照适当的onPause()、onStop()和onDestroy()活动生命周期过程进行。如果该Activity曾经处于前台或对用户可见状态,那么一旦在该实例中调用了onDestroy(),则会创建一个新的Activity实例,其中包含先前实例从onSaveInstanceState(Bundle)生成的任何savedInstanceState。
http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
现在是2022年,我在这个问题上。我只是想为所有其他答案增加一些内容,以便现在在这里的其他人有更多的例子。我发现将配置更改添加到清单中是处理应用程序在方向更改时重置自身的最佳方法。我最喜欢@Vuk的答案,因为它展示了如何将其添加到清单中。
我在AndroidManifest.xml中有这个。我包括screenLayout和screenSize以适应旧版本的Android:
<activity
android:name=".MainActivity"
android:configChanges="screenLayout|orientation|screenSize"
android:exported="true">
</activity>
当您将配置更改添加到清单中时,可以手动处理配置更改。以下是在MainActivity.kt中添加的示例代码,用于处理屏幕方向更改。这只是显示了一个弹出式消息,但您可以根据需要进行处理。
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
//override stuff with orientation change, etc.
// 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()
}
}
参考资料:https://developer.android.com/guide/topics/resources/runtime-changes