原文地址:http://blog.csdn.net/maxleng/article/details/5552976

AndroidGWES Android 消息系统

Looper Handler View

我们要理解 Android 的消息系统, Looper Handle View 等概念还是需要从消息系统的基本原理及其构造这个源头开始。从这个源头,我们才能很清楚的看到 Android 设计者设计消息系统之意图及其设计的技术路线。

消息系统的基本原理

从一般的系统设计来讲,一个消息循环系统的建立需要有以下几个要素:

  • 消息队列
  • 发送消息
  • 消息读取
  • 消息分发
  • 消息循环线程

首先来研究一下消息驱动的基本模型,我使用如下的图形来表示一个消息系统最基本构成:

上面的模型代表应用程序一直查询自己的消息队列 , 如果有有消息进来 , 应用 消息处理函数中根据消息类型及其参数来作相应的处理。

消息系统要运作起来 , 必定有消息的产生和消费。我们可以从下图看到消息生产和消费的一个基本的链条,这是一个最基本的,最简单的消息系统。

Android核心分析 之十一-------Android GWES之消息系统

生产线程将消息发送到消息队列,消息消费者线程从消息队列取出消息进行相应的处理。但是这样简单的模型对实际运行的系统来 说是不够的,例如对系统资源的消耗等不能很好的处理,我们就需要一个有旗语的消息系统模型,在上面的消息系统模型中加入了一个旗语,让消息消费者线程在没 有消息队列为空时,等待旗语,进入到挂起状态,而有消息到达时,才被唤醒继续运行。当然生产者同时也可以是消费者。

Android核心分析 之十一-------Android GWES之消息系统

2Android的消息模型

Android要建立一个消息系统使用了 Looper MessageQueue,Handler 等概念,从上节的原理我们可以知道这些都是概念包装 , 本质的东西就是消息队列中消息的分发路径的和消息分发处理方式的设计。 Android 巧妙的利用了对象抽象技术抽象出了 Looper Handler 的概念。Looper Handler 两个概念的基础上 , 通过 View 的处理函数框架, Android 十分完美的达到消息分发的目的。

参照基本消息系统描述模型,我给出了Android 消息系统整体框架,表示如下:

Android核心分析 之十一-------Android GWES之消息系统

Android消息系统消息分发框架

Android核心分析 之十一-------Android GWES之消息系统

3Looper,Handler详解

Looper 只是产生一个消息循环框架,首先 Looper 创建了消息队列并把它挂接在 Linux 的线程上下文中,进入到取消息,并分发消息的循环当中。 Handler 对象在同一个线程上下文中取得消息队列,对消息队列进行封装操作,最主要的就是 SendMessage 和担当起 dispatchMessage 这个实际工作。外部系统需要向某个 Android 线程发送消息,必须通过属于该 AndroidThread Handler 这个对象进行。



Android核心分析 之十一-------Android GWES之消息系统

Handler 属于某个线程,取决 Handlerd 对象在哪个线程中建立。 Handler 在构建时做了如下的默认动作:

  • l从线程上下文取得 Looper
  • l通过 Looper 获取到消息队列并记录在自己的成员 mQueue 变量中

Handler 使用消息队列进行对象封装,提供如下的成员函数:

  • l通过 post(Runnabler) 发送。 Runnable 是消息处理的回调函数,通过该消息的发送,引起 Runable 的回调运行,Post消息放置消息队列的前面。 Message.callback=Runable.
  • l通过 sendMessage 发送。 放置在所有的 Post 消息之后, sendMessage 发送消息 .
  • ldispatchMessage分发消息。消息带有回调函数,则执行消息回调函数,如何没有则使用默认处理函数: handleMessage 。而 handleMessage 往往被重载成某个继承 Handler 对象的新的特定的 handleMessage

几乎所有的 Message 发送时,都指定了 target Message.target=(this).

Looper 运行在 Activity 何处?我们现在可以从代码堆栈中纵观一下 Looper 的位置。

NaiveStart.main()

ZygoteInit.main

ZygoteInit$MethodAndArgsCall.run

Method.Invoke

method.invokeNative

ActivityThread.main()

Looper.loop()

ViewRoot$RootHandler().dispatch()

handleMessage

....

更多相关文章

  1. 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程
  2. Android消息推送MQTT
  3. 调用android系统图标
  4. android答题系统(三):答题部分的实现
  5. Android重启应用程序 && 不重启应用不改变系统语言改变 Android
  6. 分析:Android和Linux正在合并为一种操作系统
  7. Linux/Android——Input系统之InputReader (七)

随机推荐

  1. Android编程心得---捕捉Home键事件的完美
  2. ANDROID笔记:shape的简单使用
  3. Android如何用checkBox实现单选
  4. Android 使用 ToneGenerator 编写按键发
  5. 【Android】setHapticFeedbackEnabled 设
  6. get screen size of android device in o
  7. Android上获取打开apk默认关联的图标.
  8. android小片段
  9. g_senser frameworks 层转屏数据流程
  10. android中关于dip和px以及转换的总结