Android系统自动转屏流程(二)

来源:互联网 发布:淘宝十大人气主播 编辑:程序博客网 时间:2024/06/06 03:27


10、如果UserRotationMode的配置有变,由于需要传感器信息的配合,还需调用updateOrientationListenerLp()来设置或取消监听传感器。

 

11、假设手机设置为自动旋转,那么PhoneWindowManager会通过MyOrientationListener来监听传感器信息。MyOrientationListenerWindowOrientationListener的继承类,WindowOrientationListenerenable()函数中调用SensorManager提供的registerListener()接口来设置Sensor信息的listener

 

 

12、接下来我们重点分析有关传感器部分的流程。

 

该图的大图请看文档后的附图。

调用SensorManager提供的registerListener()接口设置Sensor信息的listener

 

调用SystemSensorManagerregisterListenerImpl注册监听器,当Sensor数据有改变的时候将会回调SensorEventListeneronSensorChanged方法

 

手机开机后会创建SystemSensorManager的实例,在其构造函数中,主要做了四件事情:

1)初始化JNI:调用JNI函数nativeClassInit()进行初始化。

2)初始化Sensor列表:调用JNI函数sensors_module_init,对Sensor模块进行初始化,创建了nativeSensorManager的实例。

3)获取Sensor列表:调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在sHandleToSensor列表中

4)构造SensorThread类:构造线程的类函数,并没有启动线程,当有应用注册的时候才会启动线程。

当有应用程序调用registerListenerImpl()方法注册监听的时候,会调用SensorThread.startLoacked()启动线程。线程只会启动一次,并调用enableSensorLocked()接口对指定的sensor使能,并设置采样时间。SensorThreadRunnable实现了Runnable接口,在SensorThread类中被启动。

 

 

 

 

 

 

 

 

首先,registerListenerImpl()中创建SensorEventQueue对象(基类为BaseEventQueue),它是传感器事件的队列,记录需要监听哪些传感器信息。同时也负责与SensorService的连接和通信,可以说是SensorEventListenerSensorService间的桥梁。SensorEventListenerSensorEventQueue之间是1:1的关系,它们的映射关系保存在成员mSensorListeners中。如果这里注册的SensorEventListener还没有相应的SensorEventQueue,则新建一个,然后通过addSensor()方法将要关注的传感器进行注册。这个过程中addSensor()调用了enableSensor(),它最终是通过SensorServiceenableDisable()方法来完成注册工作的。这样,SensorService就开始监听该Sensor,当底层有传感器数据来时,SensorService主线程中会调用相应SensorEventConnectionsendEvents()将底层传感器传回的数据发给对应的Client。前面初始化SensorEventQueue时会创建Receiver,它是一个Looper的回调对象,在Client端收到从SensorService来的数据后被回调。当有数据收到时ReceiverhandleEvent()被调用,继而通过JNI调用到SystemSensorManager::dispatchSensorEvent()。接着就调到了WindowOrientationListeneronSensorChanged()函数。该函数将计算是否需要转屏。如果需要转屏,将计算结果传给MyOrientationListeneronProposedRotationChanged()

13回到PhoneWindowManagerupdateSettings()流程。最后如果检测到UserRotationUserRotationMode有更新,会调用updateRotation(),继而调用WMSupdateRotation()保证当前的屏幕方向是一致的。

 

 

 

 

 

如果手机现在转了屏幕,期望转屏事件发生。如前面所说,onProposedRotationChanged()被调用,其中调用updateRotation()函数,随之的updateRotationUncheckedLocked()就是真正执行转屏的地方了。当然除了上面这条种情况会进行转屏,还有其它情况可能会触发转屏,比如应用请求转屏。例如需要横屏的游戏(通过updateOrientationFromAppTokensLocked()方法)。updateRotation()中主要是执行两个函数:updateRotationUncheckedLocked()sendNewConfiguration()。前者执行转屏动作,包含转屏动画等。后者使AMS获取当前新的configuration,并且广播该事件给所有相应的listener

原创粉丝点击