App在启动后的运行逻辑

假设一个App被启动了,界面成功显示,那么站在进程的角度去看它后续的运行过程,究竟是怎样的呢?

app运行流程图.png

当App进程启动完成之后,ActivityThread类被创建出来,他的main()方法执行,执行main()方法的这个线程称作UI线程。然后执行Looper.prepareMainLooper(),此时UI线程的消息队列已经准备好,可以通过Handler发送消息到该队列了(后续与AMS的通讯正是通过这种方式执行的)。然后,再执行Looper.loop(),也就是阻塞的从消息队列中去取消息(可以是用户发的消息,也可以是系统发的消息),如果没有,UI线程进入睡眠状态。

UI线程被唤醒的时机:

  1. 用户通过Handler向队列中发送消息,此时queue.next()方法会被重新唤醒,并返回最新的消息

  2. 按键消息,即WMS向ViewRootImpl的内部类W通信,此时该消息会被ViewRootImpl发送到UI线程的消息队列中

3.Binder中断。当应用程序中创建了一个Binder,便会自动创建一个线程用来接收消息,如ApplicationThread用来接收AMS的IPC消息,如果在Binder线程中收到消息后向UI队列中发送一条消息,那么next()方法也会被唤醒。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容