Android rotation 转屏过程分析

本文详细分析了Android系统中屏幕转屏的过程,从Sensor事件触发到WindowManagerService更新rotation,再到 AMS配置变更及窗口重新布局。转屏涉及的关键步骤包括:rotation计算、通知AMS、更新配置、窗口重新布局及动画播放。主要涉及的类有WindowOrientationListener、PhoneWindowManager、WindowManagerService和ActivityManagerService。
摘要由CSDN通过智能技术生成

最近刚好解了几个转屏的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值