微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

消息的变迁

Windows SDK

消息在主应用中堵塞读取,然后由同一的回调进行处理

while (GetMessage(&msg,...)) {
TranslateMessage(&msg); //转换键盘消息(虚拟到字符)
dispatchMessage(&msg); // 分派消息
}

LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WParaM wParam,
LParaM lParam)

 

MFC

封装的SDK,增加映射表进行

struct MSGMAP_ENTRY {
UINT nMessage;
LONG (*pfn)(HWND,UINT,WParaM,LParaM);
};

struct MSGMAP_ENTRY _messageEntries[] =
{
WM_CREATE,OnCreate,
WM_PAINT,OnPaint,
WM_SIZE,OnSize,
WM_COMMAND,OnCommand,
WM_SETFOCUS,OnSetFocus,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy,
} ;

对具体的回调,比如command,再加了一层包装

struct MSGMAP_ENTRY _commandEntries =
{
IDM_ABOUT,OnAbout,
IDM_FILEOPEN,OnFileOpen,
IDM_SAVEAS,OnSaveAs,
} ;

 

附:

PostMessage 和 SendMessage

核心对象:

event CreateEvent
mutex CreateMutex
semaphore CreateSemaphore
file CreateFile
file-mapping CreateFileMapping
process CreateProcess
thread CreateThread

消息流是冒泡

 

 

WinForm & Silverlight

对对应的回调增加委托

其中Silverlight的网络操作都是异步的,而且刷新页面必须在主线程中

 

Html javascript

冒泡&捕获,先捕获后冒泡

 

Flex

发送字符串的事件,冒泡

 

JAVA

Java1.0 事件模型 :

dispatchEvent()-postEvent()-handleEvent()


Java 2 事件处理模型 :

Java2 处理事件时,没有采用 dispatchEvent()-postEvent()-handleEvent() 方式,采用了监听器类,每个事件类都有相关联的监听器接口。事件从事件源到监听者的传递是通过对目标监听者对象的 Java 方法调用进行的。(必须实现对应的接口)

 

Android的事件模型: 

跟JAVA2一样,增加了indent的概念

Indent,可指定本地类,也可由系统进程进行选址

Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。比如说调用 startActivity()来启动一个activity,或者由broadcaseIntent()来传递给所有感兴趣的 broadcaseReceiver,再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的 activity 或者service,所以可以将intent理解成activity之间的粘合剂。

对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”。对于没有明确指出目标组件名称的Intent,则称之为“隐式 Intent”。Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。

广播接收器,可以拦截短信,然后返回true,系统认SMS应用的回调将不会被调用

内部也有Looper+消息接收器,对消息接收器发送消息,如果没有指定looper,将在该对象所处的activity线程中执行。

this.post(new Runnable(){
            public void run(){
               在主线程中更新ui
            }
        });

public void setResult(Object obj,int key) {         if(obj!=null){             netHandler.setResult(obj,key);             Message msg=netHandler.obtainMessage();             msg.setTarget(netHandler);             msg.sendToTarget();         }     }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐