android 屏幕旋转机制与使用说明
一 Overview
在开发android应用的时候,有可能需要让应用程序随着系统设置而进行调整,比如判断系统的屏幕方向、判断系统方向的方向导航设备等。除此之外,还需要让应用程序监听系统设置的更改,对系统设置的更改作出响应。
如果系统需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged()方法,该方法是一个基于回调的事件处理方法;当系统的设置发生更改时,该方法会被自动触发。查阅AndroidAPI可以得知配置信息android:ConfigChanged实际对应的是Activity里的onConfigurationChanged()方法。
在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android:configChanges属性来实现这点。你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调它的onConfigurationChanged()方法。如果改变的配置中包含了你所无法处理的配置(在android:configChanges并未声明),你的activity仍然要被重新启动,onConfigurationChanged()将不会被调用。
android:configChanges=""中可以用的值,请查询具体的androidAPI。
本文主要是站在App的角度,分析屏幕旋转处理的一般使用方法和注意事项。然后简要介绍framework中的实现细节。
二 屏幕旋转状态监测
屏幕旋转处理的关键为获取屏幕旋转的信息,因此系统中就需要有一种机制,可以实时监测当前系统的屏幕角度。所以,首先,我们就关注一下Framework是如何实现实时监控系统中的oritentation状态的。
1.Orientation状态初始化与设置
setting设置
在Android的Settings->Display中有Orientation这一设置项。当选中时,屏幕会随设备旋转。
settings设置是在文件DisplaySettings.java中,该项对应的键字符串为:
private static final String KEY_ACCELEROMETER = "accelerometer";
其默认值保存在xml文件中,默认是Enable。UI程序初始化时会根据其值是否在复选框中打勾(代码在onCreate函数中):
public void onCreate(Bundle savedInstanceState)
{
Accelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
mAccelerometer.setPersistent(false);
}
保存setting更改
当用户改变了Android的Settings-> Display中有Orientation这一设置项时,会保存起来:public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { if (preference == mAccelerometer) { RotationPolicy.setRotationLockForAccessibility( getActivity(), !mAccelerometer.isChecked()); } else if (preference == mNotificationPulse) { boolean value = mNotificationPulse.isChecked(); Settings.System.putInt(getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE, value ? 1 : 0); return true; }
监听setting的变化
在文件frameworks/policies/base