消息的变迁

来源:互联网 发布:淘宝店铺模块 编辑:程序博客网 时间:2024/05/22 22:26

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();
        }
    }

 

原创粉丝点击