首先,ActivityThread从main()函数开始执行,调用prepareMainLooper为UI线程创建一个消息队列(MessageQueue)。
然后创建一个ActivityThread对象,ActivityThread的初始化过程会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象。Binder对象负责接收远程Ams的IPC调用,接收到消息后,通过Handler对象将消息发送到队列,UI线程则会异步的在队列中取出消息并执行响应操作。
ActivityThread main方法 ActivityThread属性的初始化 H类 H(handler)类处理消息 Application类及其方法然后UI主线程会调用Looper.loop()方法进入循环体,然后就在MessageQueue中不断的去除并处理消息。
当ActivityThread接收到Ams发送start某个Activity时,会指定创建Activity对象。Activity会创建PhoneWindow类->DecorView类->创建响应的ViewGroup或View。创建完后,Activity调用WindowManager将创建好的界面显示到屏幕上,WindowManager则会创建一个ViewRoot对象和W(Binder)对象。创建好ViewRoot类后,WindowManager再调用Wms提供的远程接口完成添加一个窗口并显示到屏幕上。
接下来,用户开始操作手机屏幕。KeyQ线程会不断的把用户消息存储到QueueEvent队列中,InputDispatcherThread则逐个将消息取出,然后调用WmS的相应方法处理消息。但Wms发现一个消息属于某个客户端窗口时,就对调用该窗口的W类接口。
前面说到W类是一个Binder,负责接受WmS的IPC调用,并把消息传给ViewRoot,ViewRoot再把消息传递给UI主线程的ActivityThread,最后ActivityThread解析并处理消息。
在客户端中,首先处理消息的事DecorView,如果DecorView不处理消息,则将消息传递给其内部包含的ViewGroup或View。如果还没有处理,则交给PhoneWindow处理,最火传递给Activity。
未完待续......
网友评论