Android系统自动转屏流程(二)
来源:互联网 发布:淘宝十大人气主播 编辑:程序博客网 时间:2024/06/06 03:27
10、如果UserRotationMode的配置有变,由于需要传感器信息的配合,还需调用updateOrientationListenerLp()来设置或取消监听传感器。
11、假设手机设置为自动旋转,那么PhoneWindowManager会通过MyOrientationListener来监听传感器信息。MyOrientationListener是WindowOrientationListener的继承类,WindowOrientationListener的enable()函数中调用SensorManager提供的registerListener()接口来设置Sensor信息的listener。
12、接下来我们重点分析有关传感器部分的流程。
该图的大图请看文档后的附图。
调用SensorManager提供的registerListener()接口设置Sensor信息的listener。
调用SystemSensorManager,registerListenerImpl注册监听器,当Sensor数据有改变的时候将会回调SensorEventListener的onSensorChanged方法。
手机开机后会创建SystemSensorManager的实例,在其构造函数中,主要做了四件事情:
(1)初始化JNI:调用JNI函数nativeClassInit()进行初始化。
(2)初始化Sensor列表:调用JNI函数sensors_module_init,对Sensor模块进行初始化,创建了native层SensorManager的实例。
(3)获取Sensor列表:调用JNI函数sensors_module_get_next_sensor()获取Sensor,并存在sHandleToSensor列表中
(4)构造SensorThread类:构造线程的类函数,并没有启动线程,当有应用注册的时候才会启动线程。
当有应用程序调用registerListenerImpl()方法注册监听的时候,会调用SensorThread.startLoacked()启动线程。线程只会启动一次,并调用enableSensorLocked()接口对指定的sensor使能,并设置采样时间。SensorThreadRunnable实现了Runnable接口,在SensorThread类中被启动。
首先,registerListenerImpl()中创建SensorEventQueue对象(基类为BaseEventQueue),它是传感器事件的队列,记录需要监听哪些传感器信息。同时也负责与SensorService的连接和通信,可以说是SensorEventListener与SensorService间的桥梁。SensorEventListener和SensorEventQueue之间是1:1的关系,它们的映射关系保存在成员mSensorListeners中。如果这里注册的SensorEventListener还没有相应的SensorEventQueue,则新建一个,然后通过addSensor()方法将要关注的传感器进行注册。这个过程中addSensor()调用了enableSensor(),它最终是通过SensorService的enableDisable()方法来完成注册工作的。这样,SensorService就开始监听该Sensor,当底层有传感器数据来时,SensorService主线程中会调用相应SensorEventConnection的sendEvents()将底层传感器传回的数据发给对应的Client。前面初始化SensorEventQueue时会创建Receiver,它是一个Looper的回调对象,在Client端收到从SensorService来的数据后被回调。当有数据收到时Receiver的handleEvent()被调用,继而通过JNI调用到SystemSensorManager::dispatchSensorEvent()。接着就调到了WindowOrientationListener的onSensorChanged()函数。该函数将计算是否需要转屏。如果需要转屏,将计算结果传给MyOrientationListener的onProposedRotationChanged()。
13、回到PhoneWindowManager的updateSettings()流程。最后如果检测到UserRotation或UserRotationMode有更新,会调用updateRotation(),继而调用WMS的updateRotation()保证当前的屏幕方向是一致的。
如果手机现在转了屏幕,期望转屏事件发生。如前面所说,onProposedRotationChanged()被调用,其中调用updateRotation()函数,随之的updateRotationUncheckedLocked()就是真正执行转屏的地方了。当然除了上面这条种情况会进行转屏,还有其它情况可能会触发转屏,比如应用请求转屏。例如需要横屏的游戏(通过updateOrientationFromAppTokensLocked()方法)。updateRotation()中主要是执行两个函数:updateRotationUncheckedLocked()和sendNewConfiguration()。前者执行转屏动作,包含转屏动画等。后者使AMS获取当前新的configuration,并且广播该事件给所有相应的listener。
- Android系统自动转屏流程(二)
- Android系统自动转屏流程(一)
- 自动问答系统流程
- 自动问答系统流程
- Android系统启动流程(二)
- Android源码阅读与理解(二):Android系统Build流程详解
- Android编译系统详解(二)——命令执行流程
- Android编译系统详解(二)——命令执行流程
- Android编译系统详解(二)——命令执行流程
- Android系统应用框架篇:Activity启动流程(二)
- Android源码解析(二十六)-->截屏事件流程
- 【转】Android的Audio系统(二)
- Android中AppWidget加载流程(二)
- Android音频流程二(Binder部分)
- Android中AppWidget加载流程(二)
- android -- phone (二) 去电流程
- Android 浅谈Sensor工作流程(二)
- Android音频流程二(Binder部分)
- 快速排序总结
- isPrime
- Android系统自动转屏流程(一)
- linux下调用opencv接口函数在指定图片上面画几何图形
- shiro 减少用redis实现的自定义SessionDAO的doUpdate的调用次数
- Android系统自动转屏流程(二)
- Python UnitTest 文档中文翻译-2-3(渣翻自娱)
- 反向代理概念
- Android混淆心得
- foreach 简单使用
- windows禁用笔记本自带键盘办法
- 课程学习3
- java基础教程:常用对象之Object(20)
- 一次外场宕机引发对linux内存管理的进一步思考--Linux虚拟地址空间如何分布