最近刚好解了几个转屏的bug。刚好将转屏的这一部分代码简单分析了一下,
转屏的代码逻辑主要在WMS(窗口管理)这一块。
整个转屏过程可以分为以下几个步骤:
1。计算出屏幕的下一个rotation;
2。window 重新布局计算
3。
下面是调用的流程图
一开始当然是Sensor 从驱动传上来值,然后上层来判断要不要转屏, 这部分代码位WindowOrientationListener, WindowOrientationListener是一个抽象类。在他的内部有一个SensorEventListenerImpl 实现了SensorEventListener 用于监听Sensor
private WindowOrientationListener(Context context, Handler handler, int rate) {
mHandler = handler;
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mRate = rate;
mSensor = mSensorManager.getDefaultSensor(USE_GRAVITY_SENSOR
? Sensor.TYPE_GRAVITY : Sensor.TYPE_ACCELEROMETER);
if (mSensor != null) {
// Create listener only if sensors do exist
mSensorEventListener = new SensorEventListenerImpl();
}
}
private WindowOrientationListener(Context context, Handler handler, int rate) {
mHandler = handler;
mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
mRate = rate;
mSensor = mSensorManager.getDefaultSensor(USE_GRAVITY_SENSOR
? Sensor.TYPE_GRAVITY : Sensor.TYPE_ACCELEROMETER);
if (mSensor != null) {
// Create listener only if sensors do exist
mSensorEventListener = new SensorEventListenerImpl();
}
}
其中USE_GRAVITY_SENSOR 等于false ,也就是说目前我们手机里转屏用的Sensor 是加速度传感器,并非重力感应器
mSensorEventListener 的 registerListener 和 unregisterListener 分别位于WindowOrientationListener的enable() 和 disable ()方法中。
1. public void enable() {
2. synchronized (mLock) {
3. if (mSensor == null) {
4. Log.w(TAG, "Cannot detect sensors. Not enabled");
5. return;
6. }
7. if (mEnabled == false) {
8. if (LOG) {
9. Log.d(TAG, "WindowOrientationListener enabled");
10. }
11. mSensorEventListener.resetLocked();
12. mSensorManager.registerListener(mSensorEventListener, mSensor, mRate, mHandler);
13. mEnabled = true;
14. }
15. }
16. }
17.
18. /**
19. * Disables the WindowOrientationListener.
20. */
21. public void disable() {
22.
23. synchronized (mLock) {
24. if (mSensor == null) {
25. Log.w(TAG, "Cannot detect sensors. Invalid disable");
26. return;
27. }
28. if (mEnabled == true) {
29. if (LOG) {
30. Log.d(TAG, "WindowOrientationListener disabled");
31. }
32. mSensorManager.unregisterListener(mSensorEventLi