Activity启动之后创建消息机制和运行消息机制流程
2018-09-29 10:46:05 4 举报
Activity启动之后Looper的启动流程
作者其他创作
大纲/内容
Looper.loop
Looper.prepareMainLooper
在looper的构造函数中,创建了MessageQueue并放入成员函数mQueue,并将该Looper所在的线程放入mThread中
NativeMessageQueue.NativeMessageQueue
android_os_MessageQueue.pollOnce
android_os_MessageQueue.android_os_MessageQueue_nativeInit
使用epoll来监听IO读写事件,如果没有发生IO读写事件则进入睡眠,等待时间由之前的传入的时间确定有事件了就循环检查哪个文件描述符发生了IO读写事件,找到了对应的文件描述符就调用下面的方法
android_os_MessageQueue.gMessageQueueClassInfo
调用JNI的nativeInit方法,并将返回的NativeMessageQueue的地址值
启动一个Looper并把这个实例放入sMainLooper成员变量中
在这个构造函数中先判断了有没有已经有Native的Looper,如果没有则创建一个
android_os_MessageQueue.nativePollOnce
先查看ThreadLocal中是否已经有looper存在,如果有则报错,没有则创建一个looper并放入ThreadLocal中
Looper.pollInner
ActivityThread.main
Looper.Looper
创建一个无限循环,不断的调用返回一个int值的pollInner,当返回的int值不为0时跳出循环
android_os_MessageQueue.android_os_MessageQueue_setNativeMessageQueue
将JAVA层的MessageQueue和MessageQueue的mPtr变量放入一个struct中
MessageQueue.MessageQueue
Message.next
Looper.pollOnce
Looper.awoken
创建一个无限循环,在开始查看MessageQueue的next方法,如果不为空,则说明有消息需要处理。否则当前进程就会在MessageQueue的成员函数next就会进入睡眠等待状态
Looper.prepare
1.构造函数中会创建一个管道(pipe),并将读写文件描述符分别放入成员变量中2.创建一个epoll实例,并放入成员变量中,然后把读端文件描述符放入epoll中,以便可以对它所描述的管道的写操作进行监听
通过JAVA层传入的mPtr拿到NativeMessageQueue,再调用下面的方法
0 条评论
下一页