Android应用程序在屏幕方向变化时重新启动

12

当我改变屏幕方向时,应用程序会重新启动并且我会丢失当前的数据。 我正在使用一个包含许多活动的活动组,当我从主活动更改方向时,应用程序会重新启动。

有没有可能避免在屏幕方向更改时重新启动应用程序?

如果有人知道,请告诉我。

6个回答

13
如果你的android目标SDK版本为12或更低,需要在android清单文件中添加 android:configChanges="orientation|keyboardHidden" 属性。如果你的android目标SDK版本为13或更高,则需要将 android:configChanges 的值设置为 orientation|keyboardHidden|screenSize。总体上应该像这样:<activity android:name=".MyActivity" android:configChanges="<your value here>">

11

1
我曾经使用过Activity Groups,在每个Activity或Group启动时,我的应用程序会与服务器通信并获取数据。因此,无法处理每个Activity的配置更改。相反,我固定了方向,并使用监听器来检测方向更改,然后使用不同的XML文件来适配横屏和竖屏。这避免了应用程序的重新启动,并保留了我的数据。 - Renuka

3
您可以通过以下方式告诉系统忽略更改:
<activity android:name="SomeActivity" android:configChanges="keyboardHidden|orientation">

但我建议不要这样做,因为这通常是潜在问题尚未出现的迹象。
我的建议是您只需添加一个新的类来处理所有长时间操作或任何活动修改的恢复。

我知道这个答案有点老('10),但它应该是第一个并且被接受的。 - Lorenzo Lapucci

1

这就是它应该工作的方式。有一种方法可以使它不这样做,但你应该遵循生命周期并能够优雅地处理活动重启。这个问题在这里已经被问过很多次。


1

在API文档中有一些关于为什么当前Activity会被销毁和重建的好信息。上次我处理相关问题时,我发现这些信息非常有启发性。

除非您另有指定,否则配置更改(例如屏幕方向的更改[...])将导致当前Activity被销毁,并按照适当的onPause()、onStop()和onDestroy()活动生命周期过程进行。如果该Activity曾经处于前台或对用户可见状态,那么一旦在该实例中调用了onDestroy(),则会创建一个新的Activity实例,其中包含先前实例从onSaveInstanceState(Bundle)生成的任何savedInstanceState。

http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges


0

现在是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


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