Android 平台下:
MessageLoop::Run
|MessagePump(this)::Run
|
MessagePumpAndroid(UI线程) MessagePumpLibevent(IO线程) MessagePumpDefault(其他线程)
(自定义task和UI消息) (自定义task和IO消息) (自定义task)
|
|
DoWork
DoDelayedWork
DoIdleWork
1. 自定义task
MessageLoop::PostTask(task)
|
| ---> incoming_queue_.push(task) (自定义task queue)
|
| ---> message_loop_->ScheduleWork() | ---> MessagePumpAndroid::ScheduleWork ---> Java_SystemMessageHandler_setTimer()
| ---> MessagePumpLibevent::ScheduleWork ---> write(wakeup_pipe_in_, &buf, 1)
| ---> MessagePumpDefault::ScheduleWork ---> WaitableEvent.Signal()
2. render进程向browser进程发消息
bool RenderWidget::Send(IPC::Message* msg)
|
RenderThreadImpl::Send(IPC::Message* msg)
|
ChildThread::Send(IPC::Message* msg)
|
SyncChannel::Send(IPC::Message* msg)
|
ChannelProxy::Send(msg)
3. browser进程向render进程发消息
bool RenderWidgetHostImpl::Send(IPC::Message* msg)
|
bool RenderProcessHostImpl::Send(IPC::Message* msg)
|
|
ipc_task_runner()->PostTask(ChannelProxy::Context::OnSendMessage)
|
ChannelProxy::Context::OnSendMessage
|
bool Channel::ChannelImpl::Send(Message* message)
|
| ---> output_queue_.push(message)
|
| ---> Channel::ChannelImpl::ProcessOutgoingMessages() ---> write(pipe_, out_bytes, amt_to_write)
本文深入解析了Android平台下消息循环机制(MessageLoop)、任务泵(MessagePump)及其在UI线程、IO线程和其他线程中的运行方式。详细介绍了自定义任务的调度流程以及消息在不同进程间传递的机制,如渲染进程向浏览器进程发送消息及反之的情况。文章还探讨了消息循环如何在不同场景下执行工作,包括立即执行、延迟执行和空闲时执行的任务。最后,通过实例展示了消息循环如何处理来自不同进程的消息。

6351

被折叠的 条评论
为什么被折叠?



