Android笔记之:onConfigurationChanged详解
从事Android开发,免不了会在应用里嵌入一些广告SDK,在嵌入了众多SDK后,发现几乎每个要求在AndroidManifest.xml申明Activity的广告SDK都会要求加上注明这么一句属性: 代码如下:android:configChanges=”orientation|keyboard|keyboardHidden” 通过查阅Android API可以得知android:onConfigurationChanged实际对应的是Activity里的onConfigurationChanged()方法。在AndroidManifest.xml中添加上诉代码的含义是表示在改变屏幕方向、 在Android开发中,`onConfigurationChanged()` 是一个关键的方法,它与`android:configChanges`属性紧密相关。这个属性在`AndroidManifest.xml`文件中用于指定应用程序如何处理配置更改,如屏幕方向变化、键盘可用性调整等。当指定的配置发生变化时,系统会决定是否需要重新创建Activity。 在默认情况下,当设备的配置发生变化(例如,用户旋转设备改变屏幕方向),Android系统会销毁当前的Activity并重新创建它,以确保Activity能够适应新的配置。在这个过程中,`onCreate()` 和 `onStart()` 方法会被再次调用,可能导致重复的初始化工作,并可能引起数据丢失。 然而,通过在`AndroidManifest.xml`中为Activity添加`android:configChanges="orientation|keyboard|keyboardHidden"`,我们可以告诉系统在这些特定配置变更时不要销毁Activity,而是调用`onConfigurationChanged()` 方法。这样,我们可以在不破坏Activity状态的情况下,处理配置变更。 下面是一些关于`onConfigurationChanged()` 的重要知识点: 1. **配置变化**:`orientation` 指屏幕方向变化(横屏到竖屏或反之),`keyboard` 表示物理键盘的出现或消失,`keyboardHidden` 是指软键盘的隐藏或显示状态。这些变化可能导致UI布局需要调整。 2. **避免重建Activity**:通过声明`android:configChanges`,我们可以控制Activity生命周期,防止不必要的`onCreate()` 调用,提高性能并保持数据的一致性。 3. **处理配置变化**:在`onConfigurationChanged()` 方法中,我们需要根据新的配置`newConfig`更新UI布局或资源。例如,对于屏幕方向变化,可能需要调整布局的方向。 4. **super调用**:在自定义的`onConfigurationChanged()` 方法中,必须调用 `super.onConfigurationChanged(newConfig)`,否则会抛出 `android.app.SuperNotCalledException` 异常。这是因为在父类中可能有一些必要的处理逻辑。 5. **注意事项**:并非所有配置变化都适合在`onConfigurationChanged()` 中处理。例如,语言或区域设置的改变可能需要重新加载资源,这种情况下最好让系统默认处理。 6. **避免滥用**:虽然`onConfigurationChanged()` 可以避免Activity重建,但过度使用可能导致代码复杂度增加,因为需要手动处理所有配置变更。在某些情况下,让系统自动处理可能是更好的选择。 7. **动态监听**:除了在`AndroidManifest.xml`中声明,还可以在代码中使用`registerConfigChangeReceiver()` 和 `unregisterConfigChangeReceiver()` 方法动态地监听和处理配置变化。 理解`onConfigurationChanged()` 和 `android:configChanges` 属性对于优化Android应用的性能和用户体验至关重要。它们允许开发者更精确地控制Activity生命周期,从而避免不必要的初始化和数据丢失。在处理屏幕旋转、键盘显示等特定配置变化时,正确使用这两个特性可以显著提升应用的响应性和稳定性。