1

我是一名安卓初学者。根据 android 应用程序的生命周期,当屏幕方向改变时,会调用以下方法:

onPause()
onStop()
onDestroy()
OnCreate()
onStart()
onResume()

但是我现在已经onConfigChanged在我的 XML 文件中添加了。当活动开始时onCreateonStartonResume被调用。但是当我的屏幕方向改变时,只有onConfigurationChanged方法被调用,上面提到的方法没有被调用,如下所示:

截屏

这有什么原因吗?

提前致谢。

4

2 回答 2

4

通常,当一个方向,语言,...发生变化时,活动会被销毁并重新启动并从头开始生命周期,除非您覆盖 onConfigurationChanged 函数。

来自 Android 文档的更多详细信息:

配置更改

如果设备的配置(由 Resources.Configuration 类定义)发生更改,则显示用户界面的任何内容都需要更新以匹配该配置。因为 Activity 是与用户交互的主要机制,所以它包括对处理配置更改的特殊支持。

除非您另有说明,否则配置更改(例如屏幕方向、语言、输入设备等的更改)将导致您当前的活动被破坏,并通过 onPause()、onStop() 和onDestroy() 视情况而定。如果活动在前台或对用户可见,则在该实例中调用 onDestroy() 后,将创建该活动的新实例,使用前一个实例从 onSaveInstanceState(Bundle) 生成的 saveInstanceState。

这样做是因为任何应用程序资源(包括布局文件)都可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局、可绘制对象和字符串。因为活动必须已经知道如何保存它们的状态并从该状态重新创建自己,所以这是一种使用新配置重新启动活动的便捷方式。

在某些特殊情况下,您可能希望根据一种或多种类型的配置更改绕过重新启动活动。这是通过清单中的 android:configChanges 属性完成的。对于您说您在那里处理的任何类型的配置更改,您将收到对当前活动的 onConfigurationChanged(Configuration) 方法的调用,而不是重新启动。但是,如果配置更改涉及您未处理的任何内容,则活动仍将重新启动,并且不会调用 onConfigurationChanged(Configuration)。

于 2014-02-27T16:07:50.543 回答
3

只调用 onConfigurationChanged() 并更改方向是一件非常好的事情。它实际上是首选,因为这意味着您在 onCreate() 中的初始化不必再次发生——您可以在 onConfigurationChanged() 中重新绑定的新视图中重用它们。这导致更快的应用程序使用更少的内存并且不那么笨重。

一个例子:

你有一个 ListView。该 ListView 使用 ArrayAdapter。在 onCreate() 中,您使用 findViewById(R.id.xxx) 找到 listView,然后创建一个新的 ArrayAdapter 并为该 listView 设置它。如果每次在方向改变时调用 onCreate() ,那么每次方向改变时都会创建一个新的 ArrayAdapter 。想象一下切换方向 3 次 - 多么浪费!

像这样,您可以在 onCreate() 中创建 ArrayAdapter,一次,永远(当您的应用程序创建时)。当方向改变时,在 onConfigurationChanged() 中,只需使用 findViewById(R.id.xxxx) 为您再次拾取的新 ListView 重置 ArrayAdapter。完毕。仅创建了 1 个 ArrayAdapter,并且它的数据保持不变以适应新的方向。

美丽的!:)

于 2014-02-27T16:54:49.587 回答