1. Activity 的启动
(1) startActivity 方 式 : abstract class Context 的 startActivity 其 实 现 是 ContextImpl 的
startActivity然后通过 ContextImpl 的 Instrumentation 来尝试启动 Activity(跨进程)它会调用 ams
的 startActivity 方法,当 ams 校验完 activity 的合法性后,会通过 ApplicationThread 回调到我们的进
程,这也是一次跨进程过程,而 applicationThread 就是一个 binder,回调逻辑是在 binder 线程池中完
成 的 , 所 以 需 要 通 过 Handler 将 其 切 换 到 ui 线 程 , 第 一 个 消 息 是 LAUNCH_ACTIVITY , 它 对 应
handleLaunchActivity,在这个方法里完成了 Activity 的创建和启动,接着,在 activity 的 onResume
中,activity 的内容将开始渲染到 window 上,然后开始绘制直到我们看见。
(2) launch 方式
2. Handle & HandleThread
(1) Handle:当我们调用 handler.sendMessage(msg)方法发送一个 Message 时,实际上这个 Message 是发送
到与当前线程绑定的一个 MessageQueue 中,然后与当前线程绑定的 Looper 将会不断的从 MessageQueue
中 取 出 新 的 Message , 调 用 msg.target.dispathMessage(msg) 方 法 将 消 息 分 发 到与 Message 绑 定 的
handler.handleMessage()方法中。
Target 的赋值:sendMessageAtTime()->enqueueMessage()->msg.target = this
(2) 处理消息时,判断 callback 是否为空。if (msg.callback != null) { handleCallback(msg);}
一个 Thread 对应多个 Handler 。一个 Thread 对应一个 Looper 和 MessageQueue,Handler 与 Thread 共
享 Looper 和 MessageQueue 。 Message 只 是 消 息 的 载 体 , 将 会 被 发 送 到 与 线 程 绑 定 的 唯 一 的
MessageQueue 中,并且被与线程绑定的唯一的 Looper 分发,被与其自身绑定的 Handler 消费。
匿名内部类的方法写 handler 会造成内存泄露:非静态内部类和匿名类内部类都会潜在持有它们所属的外部类的引用,
评论0
最新资源