Android 消息系统

转载 2012年03月28日 09:49:50

http://www.eoeandroid.com/thread-112878-1-1.html


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

  消息系统的基本原理
  从一般的系统设计来讲,一个消息循环系统的建立需要有以下几个要素:
  消息队列
  发送消息
  消息读取
  消息分发
  消息循环线程

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

12.png


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


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


13.jpg


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


14.jpg


       Android的消息模型


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


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


15.jpg


       Android消息系统消息分发框架


16.jpg


       Looper,Handler详解


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


17.jpg


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

  l 从线程上下文取得Looper.

  l 通过Looper获取到消息队列并记录在自己的成员mQueue变量中

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

  l 通过  post(Runnable r)发送.Runnable是消息处理的回调函数,通过该消息的发送,引起Runable 的回调运行,Post消息放置消息队列的前面.Message.callback=Runable.

  l 通过 sendMessage发送.放置在所有的Post消息之后,sendMessage发送消息.

  l dispatchMessage分发消息.消息带有回调函数,则执行消息回调函数,如何没有则使用默认处理函数: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

  ….



android学习之六·是用系统nofity实现系统消息推送

 文/bywinkey 整理时间:2015年1月7日22:26:44 前言:本来这一节要学习继承TabActivity实现TabHost的,我找了大量的资料,都没有实现出来,估计本人...
  • GeBuLin_MeiYouYanLei
  • GeBuLin_MeiYouYanLei
  • 2015年01月07日 22:56
  • 1460

Android开发之接收系统广播消息

BroadcastReceiver除了接收用户所发送的广播消息之外,还有一个重要的用途:接收系统广播。如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。Android的大量系统事件...
  • fengyuzhengfan
  • fengyuzhengfan
  • 2014年08月08日 15:01
  • 5566

Android开发之接收系统广播消息

BroadcastReceiver除了接收用户所发送的广播消息之外,还有一个重要的用途:接收系统广播。如果应用需要在系统特定时刻执行某些操作,就可以通过监听系统广播来实现。Android的大量系统事件...
  • ACM_TH
  • ACM_TH
  • 2015年10月24日 22:11
  • 1270

android系统模拟点击事件发送QQ消息

  • 2014年05月26日 12:39
  • 1.89MB
  • 下载

android消息系统处理框架解析

  • 2011年11月03日 17:18
  • 18KB
  • 下载

android系统通知栏提示消息

  • 2015年06月24日 19:32
  • 1.68MB
  • 下载

Android View系统源码分析(四)—— 各种消息监测的基本实现方法&View.dispatchTouchEvent()

Android View系统源码分析(四)—— 各种消息监测的基本实现方法&View.dispatchTouchEvent()...
  • u014608640
  • u014608640
  • 2016年07月04日 10:12
  • 288

Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

在Android手机上,如QQ、微信当有未读消息的时候、我们可以看到在应用的启动图标的右上角会有一个红色圈圈、且圈圈里会动态显示未读消息的数目,如下图显示:  那么该功能是怎么实现的呢?  ...
  • cc20032706
  • cc20032706
  • 2016年07月07日 14:07
  • 436

Android系统 应用图标显示未读消息数(BadgeNumber) 桌面app图标的角标显示

参考: http://my.oschina.net/ososchina/blog/352286?p=1#comments http://www.voidcn.com/blog/kongbaid...
  • u013334392
  • u013334392
  • 2017年01月05日 09:19
  • 7592

Android系统 小米/三星/索尼 应用启动图标未读消息数(BadgeNumber)动态提醒

Logo上有未读数据:http://blog.csdn.net/janice0529/article/details/44344169 在了解了实现原理之后、我们大概明白整个流程是这样的(原生系统...
  • ShareUs
  • ShareUs
  • 2016年05月30日 15:21
  • 1029
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 消息系统
举报原因:
原因补充:

(最多只允许输入30个字)