向应用程序通知状态变化的灵活体系结构的制作方法

文档序号:6434993阅读:153来源:国知局
专利名称:向应用程序通知状态变化的灵活体系结构的制作方法
相关申请本实用专利要求序号为60/513,723,在2003年10月23日提交的美国临时专利申请符合35USC119(e)的优先权。
背景技术
当今,移动设备被设计成运行各种应用程序,并保持用户能获得最新的当前信息。这些设备的某些包括个人数字助理、无线电话和电子邮件设备。移动设备现在能通过各种装置连接到因特网和其它网络,并从而能通过网络交换信息。这些移动设备能更新应用程序,并发送和接收信息,如电子邮件、电子邮件附件和网页内容。提供所有这些功能需要移动设备上的应用程序收到各种事件的通知,如当新的电子邮件可用时、当设备的屏幕被激活时、当收到电话时等。然而,访问与该设备关联的所有不同状态变化是困难的。

发明内容
简言之,本发明是针对在各设备间统一状态和通知的体系结构。
按本发明的一方面,客户机向通知代理程序(broker)注册以接收对状态属性改变的通知。当注册的状态属性改变时,通知代理程序确定向哪一客户机通知状态改变,并为客户机提供关于该变化的通知。例如,客户机能注册以接收关于电池强度变化、网络连接性、存储器使用等的通知。每当这些注册的态属性之一改变时,通知代理程序向客户机发通知消息。
按本发明另一方面,每当状态改变,当状态改变满足预定条件时,或根据一时间表来通知客户机。按本发明的又一方面,响应于状态改变或时间表能装入应用程序。例如,客户机能注册,以当发生某个事件时,如移动设备接收到定向到要装入的应用程序的消息时,启动该应用程序。也能根据客户机配置的时间表来启动应用程序。
按本发明的再一方面,提供一种应用编程接口(API),它针对提供一种在设备内不同组件之间访问状态变化信息的统一方法。例如,应用程序能使用同一函数调用来访问由设备内的不同组件设置的状态属性。
按本发明的还有一个方面,注册状态属性能跨设备重起而保持不变。


图1示出一个示例性计算设备;图2示出一个示例性移动设备;图3示出一个示例性状态管理和通知系统;图4示出用于状态变化通知系统的过程;以及图5示出按本发明的各方面处理状态变化信息的过程。
具体实施例方式
简言之,本发明针对提供一种用于存储设备、应用程序和服务状态的统一机制的方法和系统,以及一种丰富的通知代理体系结构。一般而言,客户机向通知代理程序注册,以便在某些状态属性改变时接收通知。当注册的状态属性改变时,通知代理程序判断向哪一客户机通知该状态变化,并向该客户机提供关于此变化的通知。每当状态改变,当状态变化满足预定条件时,或根据一时间表来通知客户机。也可响应于状态变化或时间表来装入应用程序。也提供了一种应用编程接口(API),它针对提供一种在设备内不同组件之间访问状态变化的统一方法。
在整个说明书和权利要求书中,下列术语至少采取明确与此处相关的意义,除非上下文清楚地另外要求。下面标识的意义并不意味着局限这些术语,而仅提供这些术语的说明性示例。“一”,“一个”和“该”的意义包括多个引用,“在……中”的意义包括“在……内”和“在……上”。
术语“状态属性”指的是向通知系统注册并存储的“状态”变量,用于维护和改变通知。
术语“通知请求”指的是来自要向其通知状态变化的客户机的请求。
术语“通知列表”指的是已注册状态属性变化通知的客户机的集合。
术语“通知代理程序”指的是负责从数据存储中添加、更新和移除数据的底层驱动程序。
术语“状态改变组件”指的是添加,更新,或通常维护数据存储中的状态属性的任何组件。
术语“客户机”指的是注册状态属性改变通知的任何组件。客户机可以是状态改变组件,状态改变组件也可以是客户机。
术语“状态属性标识符”指的是状态属性的“友好”串(名)的表示。此标识符能是分层的,并是唯一的。
术语“条件通知”指的是当状态属性改变且状态属性的新值满足通知请求中规定的条件时所发出的通知。
说明性操作环境参考图1,用于实现本发明的示例性系统包括诸如计算设备100的计算设备。计算设备100能被配置成客户机或服务器。在很基本的配置中,计算设备100通常包括至少一个处理单元102和系统存储器104。按照计算设备的确切配置和类型,系统存储器104能是易失(如RAM)、非易失(如ROM,闪存等)或两者的某种组合。系统存储器104通常包括操作系统105、一个或多个程序模块106,并能包括程序数据107。在图1中,这些基本配置由在虚线108中的那些组件示出。
计算设备100能具有附加特征或功能。例如,计算设备100还能包括另外的数据存储设备(可移动和/或不可移动的),如磁盘、光盘或磁带。在图1中,这些另外的存储用可移动存储109和不可移动存储110示出。计算机存储介质能包括以用于存储如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方法或技术实现的易失和非易失、可移动和不可移动介质。系统存储器104,可移动存储109,和不可移动存储110均是计算机存储介质之例。计算机存储介质包括但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光存储、盒式磁带、磁带、磁盘存储或其它磁存储设备,或能用于存储希望的信息并能由计算设备100访问的其它介质。任何那样的计算机存储介质能是设备100的部分。计算设备100还能具有输入设备112,如键盘、鼠标、输入笔、语音输入设备、触摸输入设备等。还能包括如显示器、扬声器、打印机等输出设备。
计算设备100还包含通信连接,它允许该设备如经过网络与其它计算设备118通信。通信连接116是通信媒体的例子。通信媒体通常在如载波或其它传输机制的已调制数据信号包含计算机可读指令、数据结构、程序模块或其它数据,并包括任何信息传送媒体。术语“已调制数据信号”意为以如在信号中编码信息的方式设置或改变其一个或多个特征的信号。作为示例而非局限,通信媒体包括如有线网络或直线连接的有线媒体,如声音、RF、红外和其它无线媒体的无线媒体。这里使用的术语计算机可读媒质包括存储介质和通信媒体。
参考图2,用于实现本发明的一个示例性系统包括如移动设备200的移动设备。移动设备200具有处理器260、存储器262、显示器228和小键盘232。存储器262一般包括易失存储器(如RAM)和非易失存储器(如ROM、闪存等)。移动设备200包括操作系统264,如微软公司的Windows CE操作系统或其它操作系统,它们驻留在存储器262中,并在处理器260上执行。小键盘232可以是压键数字拨号盘(象典型的电话)、多键键盘(如传统的键盘)。显示器228能是液晶显示器,或在移动设备中常用的任何其它类型显示器。显示器228能是触敏的,因而能用作输入设备。
一个或多个应用程序能加载到存储器262中,并在操作系统264上运行。应用程序的示例包括电话拨号程序、电子邮件程序、时间表程序、PIM(个人信息管理)程序、文字处理程序、电子表格程序、因特网浏览器程序等。应用程序266能使用共用的API,以在与设备关联的状态属性上执行动作。例如,电话拨号程序能向通知系统注册,以接收关于对信号强度、电话状态、电池强度的改变的通知。移动计算设备200在存储器262中还包括非易失存储268。非易失存储268可用于存储永久性信息,它在移动计算设备200掉电时也不会丢失。应用程序266能使用和储存存储器268中的信息,如电子邮件或由电子邮件应用程序使用的其它消息、由PIM使用的联系人信息、由时间表程序使用的约会信息、由文字处理程序使用的文档等。
移动计算设备200具有实现为一个或多个电池的电源270。电源还能包括外接电源,如AC适配器或补充或重充电电池的电源连接座。
移动计算设备200还能包括外部通知机制,如LED(未示出)和音频接口274。这些设备能直接耦合到电源270,使得在激活时,即使关闭处理器260和其它组件来节省电池功率,它们仍按通知机制所指示的在一段时间内保持打开。音频接口274用于向用户提供音频信号并从用户接收音频信号。例如,音频接口274能耦合至扬声器以提供音频输出,并耦合至麦克风以接收听觉输入以便于电话对话。
移动计算设备200还能包含通信连接240,它允许设备如经无线网络与其它计算设备进行通信。移动计算设备200还包括无线电接口层272,它执行发送和接收射频通信的功能。无线电接口层272通过通信载波或服务提供商方便了在移动计算设备200和外部世界之间的无线连接。到无线电接口层272的来回发送在操作系统264的控制下进行。换言之,由无线电接口层272和通信连接240接收的通信能通过操作系统传播到应用程序,反之亦然。
说明性状态变化通知系统图3按本发明的诸方面示出了示例状态管理和通知系统。通知系统300包括状态改变组件310、客户机315和320、通知代理程序335和数据存储330。按一个实施例,通知代理程序335还维护通知列表340、高速缓存属性345和调度程序350。
如客户机315或320那样的客户机向通知代理程序335注册来接收关于对状态属性的变化的通知。一般而言,每当状态属性改变,当变化满足一条件时或根据一时间表,客户机用注册该客户机以接收通知的通知代理程序335作出通知请求。通知能是永久的或暂时的通知。
永久的通知被保存在数据存储(320)中。按照一个实施例,永久的通知保存在如注册表的后端数据存储中,因而跨重起是“持久不变的”。因为这些通知是持久的,这些类型的状态属性在软复位(或关闭)之前具有与重起(或起动)之后相同的值。。按照一个实施例,状态属性默认地是持久的。
暂时通知不是永久的,因而跨重起是不持久保持的。换言之,若软复位(或重起)设备,从通知列表340中删除通知请求。为了恢复暂时通知,客户机重新注册(向通知代理程序335发送另一通知请求)以接收关于对状态属性的变化的通知。
客户机还能注册,使在发生状态改变时和/或按时间表装入应用程序。通常,如果当状态改变或已调度的时间出现时客户机所指定的应用程序尚未运行,则通知代理程序335发出命令以启动该应用程序。按一个实施例,客户机能指定当装入时发送给该应用程序的命令行参数。若装入的进程创建一窗口,则向该窗口发送表示该通知的消息。若目标进程已在客户机上运行,则客户机仅接收通知消息。
发送给客户机的通知也能分批处理。分批的状态属性供经常经常发生值变化的状态属性使用。设定允许使状态属性值“稳定”的预定的时间周期。按一个实施例,预定周期设成200ms。若在预定期间未向状态属性值作出改变,则将该通知传送给注册的客户机。分批预定周期是可配置的,并存储在数据存储330中。
数据存储330被配置成存储注册的状态属性,以及其它信息。按一个实施例,数据存储330是操作系统提供的注册表,如由微软公司的Windows XP操作系统提供的注册表。数据存储330也能是在其中能设置和访问信息的其它类型的数据存储。数据存储330还能包括在通知系统300的各种位置上维护的一个或多个数据存储。
数据存储330也能用可由客户机315和320访问的状态属性的默认设置预加载。预加载状态属性数据使许多状态属性可用,而客户机不必添加状态属性。例如,按一个实施例,下面状态对客户机可用而不必注册该状态显示校准(分辨率,亮度)、不消除的提醒(计数、主题、日期、时间、位置)、不消除的警告(计数、描述、日期、时间)、电池(剩余电量的%、状态)、后备电池(剩余电量的%、状态)、存储器(空闲的程序存储器、已使用的程序存储器、空闲的存储存储器、已使用的存储存储器)、存储卡(总的空闲存储器、总的已使用存储器)、硬件(按下电话状态(开/关)、启用键盘、启用Wifi、启用蓝牙、头戴式耳机存在、相机存在)、消息(未读计数、总计数、草稿计数、发件箱计数)、任务(高优先级计数、今天的任务计数、已过期计数)、日程表(下次约会、名字、位置、日期、时间、POOM ID)、白天的约会(名字、位置、日期、时间、POOM ID)、当前约会(名字、位置、日期、时间、POOM ID);当前空闲/忙碌状态、即时消息(状态、在线联系人计数、离线联系人计数)、连接性(速度、Wifi、接入点、信号强度、连接名、连接到(工作,互联网)、状态)、媒体播放器(状态、播放列表(名称、模式(重复,随机)、音轨记数、总持续时间)、音轨(类型(音频、视频)、名称、专辑、艺术家、音轨数、流派、年、持续时间、播放演位置、文件名、比特率)、同步状态、电话(操作员、信号强度、电话状态、概览、漫游、无线电状态、有效呼叫(呼叫者名、呼叫者号码)、未接呼叫计数、SIM工具组消息。如能看到,状态覆盖了许多不同的应用程序。
按一个实施例,状态属性数据被组织成一层次结构。该层次结构使客户机能通过参照其父属性来规定一组状态属性。状态属性能设置成如串、整型、浮点型等数据类型。
客户机能通过状态属性的“友好”串(名)表示来标识状态属性。例如,“battery\a”参照在父“battery(电池)”之下的状态属性“a”,同样,“battery\b”能是在父“battery”之下的状态属性“b”。当参照共同的父之下的一组状态属性时,能使用父标识符。例如,为接收基于对所有电池状态的变化的通知,在注册表中提供“battery”,从而使用单个名字参照所有电池状态属性。
代理程序335能被配置成控制对数据存储330中设置/调节/移除状态属性类型的访问。例如,能在状态属性上加上限制,它将从通知系统中的删除属性局限到预定的客户机的列表上。当删除状态属性时,向已注册关于该属性的通知的客户机通知这一删除。
如上讨论,客户机315和320注册他们在接收关于这些状态属性何时改变的通知时所感兴趣的的状态属性。客户机能注册,以每当他们所注册的状态改变时,当施加到状态值的条件满足一条件时,或在预定时间表到达时接收通知。条件通知可基于许多不同的条件。按一个实施例,条件包括所有、等于、不等于、大于、大于或等于、小于或等于、小于、包含、以……开始、以……结束。例如,客户机315能向通知代理程序335注册,以当未接呼叫计数状态属性大于15时,和当呼叫者的名字包含“Ja”时接收通知。加条件使客户机能接收他们关注的状态改变信息而不必处理他们无关心的状态改变信息。
注册来接收关于对状态属性的改变的通知的客户机在通知列表340中维护。通知代理程序335访问通知列表340,以便当注册的状态属性改变时确定应接收通知的客户机。
调度程序350可被配置成根据时间表通知和/或激活客户机。调度的激活通知模式允许客户机根据向通知代理程序335注册的简化的循环时间表接收通知。时间表能被配置成以任意的时间间隔发生,如按秒、分、小时、天、星期、或月的度量。按一个实施例,时间表由第一次出现的日期/时间和两次出现的时间量来定义。此外,可不以循环时间间隔来定义时间表。当不提供循环时间间隔时,通知只发送一次,然后从通知列表中移除该注册。此外,当通知到达时,若未能找到指定的(在通知请求期间提供的)应用程序路径,则从通知列表340移除该已调度的通知注册。
当状态改变时,状态变化组件310在数据存储330中更新该状态属性的值。状态变化组件310能直接在数据存储330中更新状态,或通过通知代理程序335来更新。当通过数据存储330更新状态时,数据存储330向通知代理程序335传递此变化。当通过通知代理程序335更新状态时,通知代理程序335在数据存储330中更新状态。在任一情况下,通知代理程序335根据状态变化确定应通知哪些客户机。通知代理程序335分析通知列表340,并确定已注册了关于该状态变化的通知的客户机。通知代理程序335向已经改变的状态属性值施加任何条件,并在条件满足时通知客户机。当不存在与该状态变化关联的条件时,向该客户机通知该状态变化。
当如客户机315和320那样的客户机从通知代理程序335接收通知时,客户机能调用公用API中的功能(见下面讨论)来检索该状态属性的新状态。可选地,可将该属性信息连同通知一起直接传送到客户机。当用户对接收有关特定状态属性的通知不再感兴趣时,客户机能从接收关于该状态属性的改变通知撤消其本身的注册。客户机315和320也能在任何时刻使用公用API直接查询代理程序335,以找到状态属性的状态。
状态属性值也能由通知代理程序335高速缓存在高速缓存属性345中。状态属性值能根据许多不同理由高速缓存。例如,状态属性值能被高速缓存,使得可将状态属性的先前值与该状态属性的当前值进行比较。此外,高速缓存能帮助便于请求状态属性值的快速重复查找。
按一个实施例,通知系统300支撑.NET(管理的)客户机,以向存储添加和改变通知注册。
以下是进一步表明状态管理通知系统300的某些示例性场景。
例1ISV服务网络新手Norm构建了C#应用程序,它保持了当前赛季棒球的统计数据(如,队、队员、得分、状态等)的完整数据库。他还构建了简单的XML Web-服务客户机,它能连接到体育网站并下拉出已更新的日统计。因为该应用存储的数据量相当大,Norm仅希望其应用程序在设备(如PPC)上的“粗管道(fat pipe)”(如802.1x)可用时同步数据。然后Norm通过向通知代理程序335发送对当高带宽连接可用时的通知的请求来注册其应用程序。Norm在通知请求中另外规定,当高带宽连接可用时装入其应用程序的请求。当与连接关联的状态变化组件更新该连接状态时,若状态表明它是高速连接,则通知代理程序335激活Norm的应用程序。
例2LOB公司(商务线)应用程序企业开发者Elph构建了基于现场服务形式的VB.Net应用程序,供保险精算人使用。该应用程序允许保险调停者查找零件数和价格、作出注释、检索汽车的原理图等。每天,保险精算人在现场拿出他的移动设备为客户机服务。该应用程序在数据存储中本地持久保存今天的操作的所有数据。Elph希望每当连接上设备时,该应用程序将离线存储与公司主服务器同步。因而,Elph注册其应用程序以接收通知同步连接事件的通知。每当连接上设备时,向该应用程序通知,且该应用程序同步其数据。
例3电话游戏电话游戏开发者Golem正在构建下一代电话多游戏者RPG。他希望该游戏是非常普及的,使得它一次能持续数周和数月。Golem主要关心的一个问题是没有用户的干预游戏状态的持久性。该游戏的纯粹特征之一是在电话电池耗尽之前保存当前的状态,并确保用户永不丢失任何数据的能力。Golem注册他的应用程序来接收电量不足的通知,以确保在设备电池耗尽前保存游戏信息。
例4设备管理客户机应急企业管理客户机开发者Eric寻求创建下一代移动计算设备和电话管理客户机;能够处理客户机更新、病毒扫描、政策实施及其它更多的功能。他使用C#已构建了强有力的设备方客户机,它能基于服务器驱动的命令处理诸请求。每天凌晨3点,Eric希望他的应用程序“醒来”,使他能联系服务器来寻找已更新的政策、病毒扫描器的签名等。为此,他简单地向通知代理程序335注册其应用程序以接收已调度的通知(每天凌晨3点)。Eric现能确保他的应用程序在指定时间运行。
图4示出按本发明的诸方面用于状态变化通知系统的过程。在开始块之后,过程400前进到块410,其中,客户机注册以获得对至少一个状态属性的改变的通知。若该状态属性不是已由另一客户机监控,则将该状态属性添加到可用状态属性的列表中。如上讨论,可用属性的列表被预加载到通知系统。客户机能注册以接收关于对该属性作出的所有变化、满足条件的变化的通知,以及按时间表来通知。
移到块420,向通知系统注册回叫,使得当对注册的状态属性作出变化时,令通知系统知道该变化。按一个实施例,通知代理程序向操作系统注册表注册对状态属性值作出的变化的回叫。
前进到块430,将该客户机添加到通知列表,以接收关于该装态属性的通知消息。包括在通知列表中的客户机接收关于对注册的状态属性的变化的通知。
移到块440,当对任何注册的状态属性作出变化时,接收回叫。按一个实施例,回叫包括标识状态属性变化的标识符和状态属性的当前值。
移到块450,处理状态变化信息。一般而言,处理状态变化信息包括判断是否向每一对改变的状态属性已注册的客户机应用了任何条件、时间表、分批处理或应用程序装入条件(见图5及有关讨论)。
图5示出按本发明的诸方面处理状态改变信息的过程。在开始块500之后,过程前进到块510,其中,访问注册接收有关改变的状态属性的状态变化的通知用户。按一个实施例,访问通知表以确定对已改变的状态属性已注册的客户机。
移到判断块520,在通知客户机之前判断该客户机是否已规定要应用到该状态属性的任何条件。
当条件表达式与通知请求关联时,过程前进到块530,其中,判断条件是否满足。当条件满足,或当客户机未规定任何条件时,过程前进到判断块540,其中,判断客户机是否规定响应于状态属性的变化而装入应用程序。当客户机规定装入应用,过程前进到块550,其中,若应用程序尚未运行,则装入该应用程序。当客户机未规定装入应用程序,或在块550该应用程序已经被装入,则过程移到块560,向客户机通知状态变化。
然后,过程前进到判断块570,判断是否有更多的注册来接收关于对该状态属性变化的通知的客户机。当存在另一客户机时,过程返回到块510。当不存在其它客户机,则过程移到结束块并返回以处理其它行动。
状态属性类型和模式按本发明的一个实施例,能使用两个API来访问通知系统中的状态信息。提供一本机或底层API,并向客户机提供已管理的API。已管理的API访问本机API以执行其操作。
下面是按本发明的诸方面的示例性本机API<pre listing-type="program-listing"><![CDATA[ #define E_ALREADY_REGISTERED ERROR_ALREDAY_REGISTERED#define E_DATATYPE_MISMATCH ERROR_DATETYPE_MISMATCH#define E_INSUFFICIENT_BUFFERERROR_INSUFFICIENT_BUFFER#define E_INVALID_HANDLE ERROR_INVALID_HANDLE#define E_NOT_FOUND ERROR_NOT_FOUND#define E_NOT_READY ERROR_NOT_READYDECLARE_HANDLE(HREGNOTIFY);//暂时通知句柄//**************************************************************//枚举名REG_COMPARISONTYPE//目的用于定义应当如何将状态属性值与条件变化通知的目标值相比较。当执行//REG_COMPARISONTYPE时,改变的值用作1-值,即,REG_CT_LESS指如果//改变的值小于目标值,则激发通知。//描述//以下示出了当完成比较时哪一命题为真。大小写敏感的CompareString用于比较//串,以下信息用于阐明REG COMPARISONTYPE值的目的。//假设“cv”表示改变的值,“psz”或“dw”表示NOTIFICATIONCONDITION//结构中指定的TargetValue(目标值)。设“l”表示psz中指定的串的长度(wcslen(psz)),“cvl”表示改变的值的串长度(wcslen(cv))。// REG_SZREG_DWORD//REG_CT_EQUAL |(0==strcmp(cv,psz)) |(cv==dw)|//REG_CT_NOT_EQUAL |(0!=strcmp(cv,psz)) |(cv!=dw)|//REG_CT_GREATER |(0<strcmp(cv,psz)) |(cv>dw)|//REG_CT_GREATER_OR_EQUAL|(0<=strcmp(cv,psz)) |(cv>=dw)|//REG_CT_LESS|(0>strcmp(cv,psz)) |(cv<dw)|//REG_CT_LESS_OR_EQUAL |(0>=strcmp(cv,psz)) |(cv<=dw)|//REG_CT_CONTAINS|(0!=strstr(cv,psz)) |N/A|//REG_CT_STARTS_WITH |(0==strncmp(cv,psz,l)) |N/A|//REG_CT_END_WITH|(0==strcmp(cv+cvl-1,psz))|N/A|//*************************************************typedef enum tagREG_COMPARISONTYPE{REG_CT_EQUAL,REG_CT_NOT_EQUAL,   REG_CT_GREATER,   REG_CT_GREATER_OR_EQUAL,   REG_CT_LESS,   REG_CT_LESS_OR_EQUAL,   REG_CT_CONTAINS,   REG_CT STARTS_WITH.   REG_CT_ENDS_WITH  }REG_COMPARISONTYPE;  //*******************************************************  //结构名NOTIFICATIONCONDITION  //  //目的用于定义若符合则应当激发属性状态变化通知的条件  //  //描述  // REG_COMPARISONTYPE ctComparisonType—如何将改变的值与TargetValue  // (目标值)中指定的值进行比较  // DWORD dwMask—如果该值不设为0,则将TargetValue解释为DWORD。该  // 在比较完成之前应用到改变的DWORD值,该标记不应用到TargetValue。  // 如果该值设为0,则将TargetValue解释为串。  //union TargetValue—如果dwMask设为0,则在psz和改变的值之间完成比较。如  // dwMask设为不同于0的任何值,则在dw和加表征码(见dwMask)的改  // 变值之间完成比较。如果改变的值既不是类型REG_SZ也不是  // REG_DWORD,或者改变的值是类型REG_DWORD并且dwMask设为0,  // 或者改变的值是类型REG_SZ且dwMask不设为0,则忽略通知。如果改  // 变的值被删除并且对照dw完成了比较,则0用作改变的值,且比较照常进  // 行。如果值被删除且对照psz完成了比较,则NULL用作改变的值,且仅  // 由比较处理REG_CT_EQUAL和REG_CT_NOT_EQUAL,如果使用了任何  // 其它的ctComparisonType,则忽略删除通知。  ////**********************************************************  typedef struct tagNOTIFICATIONCONDITION  {  REG_COMPARISONTYPE ctComparisonType;  DWORD dwMask;  union  {   LPCTSTR psz;    DWORD dw;   }TargetValue;  }NOTIFICATIONCONDITION  //函数原型REGISTRYNOTIFYCALLBACK  //  //目的定义RegisterNotifyCallback使用的回叫的原型  //  //自变量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,这是从  // RegistryNotifyCallback返回的同一句柄  // IN DWORD dwUserData—传递到RegistryNotifyCallback的用户数据  // IN const PBYTE pData—到该值的新值的指针,如果该值被删除,则将其设为  // NULL  // IN const UINT cbData—由pData指出的字节数,如果该值被删除,则将该值设  //为0  //  //描述  //该回叫用于通知使用RegistryNotifyCallback注册了通知的客户机。如果不再需要  //任何通知,则可以安全地从该回叫内调用RegistryCloseNotification。  //  //****************************************************************** typedef void(*REGISTRYNOTIFYCALLBACK)(HREGNOTIFY hNotify  DWORD dwUserData,  const PBYTE pData,  const UINT cbData);  //******************************************************************  //函数名RegistryGetDWORD  //  //目的用于读取REG_DWORD注册表值  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义的根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在该hKey中)  // IN LPCTSTR pszValueName—要检索的值的名字(可以为NULL以检索默认值)  // OUT DWORD*pdwData—到接收与同该值关联的数据的缓冲器的指针  //  //返回值  // HRESULT  // S_OK—数据复制到缓冲器  // E_INVALIDARG-hKey或pdwData无效  // E_DATATYPE_MISMATCH—非REG_DWORD类型的值  // 被包装成FACILITY_WIN32 HRESULT的从RegOpenKeyEx或  // RegQueryValueEx返回的错误值  //  //结果  // SUCCEEDED-pData指向与该值关联的数据  // FAILED—未改变  //  //描述  // 与该值关联的DWORD被复制到由pData指向的缓冲器中。如果由// hKey+pszSubKey指向的键不存在,则RegistryGetDWORD失败,因为它使用  // RegOpenKey来访问该键  //  //*************************************************************  HRESULT WINAPI RegistryGetDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD*pdwData);  //*************************************************************  //函数名RegistryGetString  //  //目的用于读取REG_SZ注册表键  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义的根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要检索的值的名字(可以为NULL,以检索默认  // 值)  // OUT LPTSTR pszData—到接收与该值关联的数据的缓冲器的指针  // IN UINT cchData—到以字符计算的长度为由pData指向的缓冲器的变量的指针  //  //返回值  // HRESULT  // S_OK—数据复制到缓冲器  // E_INVALIDARG-hKey或pszData无效  // E_DATATYPE_MISMATCH—该值不是REG_SZ类型  // E_INSUFFICIENT_BUFFER—如cchData确定的由pszData指向的缓冲器的大  // 小不够大来保留该串  // 被包装为FACILITY_WIN32 HRESULT的从RegOpenKeyEx或// RegQueryValueEx返回的错误值  //  //结果  // SUCCEED-pData指向与该值关联的数据  // FAILED—没有变化  //  //描述  //  // 与该值关联的串被复制到由pData指向的缓冲器。如果由hKey+pszSubKey指  // 向的键不存在,则RegsitryGetString将失败,因为它使用了RegOpenKey来访  // 问该键  //  //******************************************************************  HRESULT WINAPI RegistryGetString(HKEY hKey,  LPCTSTR pszSubKey,  LPCTSTR pszValueName,  LPTSTR pszData,  UINT cchData);  //************************************************************  //函数名RegistrySetDWORD  //  //目的用于设置REG_DWORD注册表值  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义的根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要设置的值的名字(可以为NULL,以设置默认  // 值)  // IN DWORD dwData—新值//  //返回值  // HRESULT  // S_OK-pszValueName的值变为dwData中的值  // E_INVALIDARG-hKey无效  // E_DATATYPE_MISMATCH—值不是REG_DWORD类型  // 被包装成FACILITY_WIN32 HRESULT的从RegOpenKeyEx或  // RegQueryValueEx返回的错误值  //  //结果  // SUCCEEDED—与该值关联的数据改变  // FAILED—不改变  //  //描述  // 与该值关联的数据改变成新值。如果由hKey+PszSubKey指向的键不存在,则  // RegistrySetDWORD失败,因为它使用RegOpenKey来访问该键  //  //****************************************************************  HRESULT WINAPI RegistrySetDWORD(HKEY hKey,  LPCTSTR pdzSubKey,  LPCTSTR pszValueName,  DWORD dwData);  //****************************************************************  //函数名RegistrySetString  //  //目的用于设置REG_SZ注册表值  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName// 在hKey下)  // IN LPCTSTR pszValueName—要设置的值的名字(可以为NULL,以设置默认  // 值)  // IN LPCTSTR pszData—新值。该串以空结束。  //  //返回值  // HRESULT  // S_OK-pszValueName的数据值变为pszData中的值  // E_INVALIDARG-hKey或pszData无效  // E_DATATYPE_MISMATCH—值不是REG SZ类型  // 被包装成FACILITY_WIN32 HRESULT的从RegOpenKeyEx或  // RegQueryValueEx返回的错误值  // 从StringCbLength返回的错误HRESULT  //  //结果  // SUCCEEDED—与该值关联的数据改变  // FAILED—不改变  //  //描述  // 与该值关联的数据变为新值。如果由hKey+pszSubKey指向的键不存在,则  // RegistrySetString失败,因为它使用RegOpenKey来访问该键  //  //******************************************************************  HRESULT WINAPI RegistrySetString(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszData);  //******************************************************************  //函数名RegistryTestExchangeDWORD  ////目的用于基于条件原子地设置值  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下  // IN LPCTSTR pszValueName—要设置的值的名字(可以为NULL,以设置默认  // 值)  // IN DWORD dwOldValue—要对照来检查的值  // IN DWORD dwNewValue—要有条件地设置的值  //  //返回值  // HRESULT  // S_OK—数据值变为dwNewValue  // S_FALSE—目标值未设为dwNewValue,因为与pdsValueName关联的DWORD  // 值不等于dwOldValue  // E_INVALIDARG—传递的句柄或指针之一无效  // E_DATATYPE MISMATCH—值不是REG DWORD类型  // E_NOT_FOUND—值无法在指定的键下找到  // 被包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—与pszData关联的数据值曾经是dwOldValue,现在是  // dwNewValue  // FAILED—不改变  //  //描述  // 该函数是联锁(interlocked)函数—换言之,它可以被认为是原子的。它检查  // 与pszValueName关联的DWORD值是否等于OldValue。如果是,则它将目标  // 设为NewValue,否则失败。//  //**************************************************************  HRESULT WINAPI RegistryTestExchangeDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD dwOldValue,   DWORD dwNewValue);  //**************************************************************  //函数名RegistryNotifyAppp  //  //目的用于请求当指定的值改变时装入或通知应用程序  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTRpszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上请求了变化通知的值的名字(可以为  // NULL,以指示默认值)  // IN LPCTSTR pszName—表示通知请求的用户定义的串,当不再需要通知时,  // 该串应当被传递到RegistryStopNotification  // IN LPCTSTR pszApp—到作为到要装入的可执行码的路径的串的指针  // IN LPCTSTR pszClass—一旦装入了可执行码,或者如果它已运行,则具有该窗  // IN LPCTSTRpszWindow 口名和类类型的窗口位于该进程内,并且向其传  // 递通知。如果这两个参数都为空,该函数将仅装入应用程序。  // IN UINT msg—传递到窗口的消息  // IN NOTIFICATIONCONDITION*pCondition—当与新注册表值的比较为TRUE  // 时应当发送变化通知的条件(可以为NULL,以指示任何变化应当导致通知)  //  //返回值  // HRESULT// S_OK—对通知的请求被添加到通知列表  // E_INVALIDARG-hKey、pszApp或pszName无效  // E_ALTRADY_REGISTERED—名字等于由pszName执行的名字的通知已存在  // 包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—现在每次当对该值作出改变时将通知调用者  // FAILED—不改变  //  //描述  // 通知请求被添加到通知列表。调用者调用RegistryStopNotification来停止进一  // 步的通知。该通知请求类型是永久的,即,即使设备复位时通知请求也是活动  // 的。在通知时,该函数通过在pszClass和pszWindow指定的类名和窗口名上作  // 出FindWind来确定是否已运行了具有pszApp中指定的名字的可执行码,如果  // 没有,则它装入该应用程序。传递到应用程序的命令行应当在pszApp串中指  // 定,除用户指定的任何命令行之外,添加以下内容  // /notify″pszName″  // pszName—传递到pszName参数中的函数的句柄串  // 在装入应用程序之后,完成FindWindow,以查找具有pszClass和pszWindow  // 中指定的类名和窗口名的窗口。如果找到该窗口,则如在RegistryNotifyWindow  // 窗口中一样通过PostMessage标帖由msg指定的消息。PostMessage的参数如下  // WPRAM—对于类型REG_DWORD的值,如果值已被删除,则它是新值或  // 0;对于所有其它类型,该值为0  // LPARAM-0  // 该消息参数应当对RegistryNotifyApp的每一调用都是唯一的,使得客户机可在  // 多个通知之间区分。当添加或改变值时通知客户机。当通知到达时,如果由  // pszApp指向的应用程序无法被装入,或无法找到具有类型pszClass的类的窗  // 口,或PostMessage失败,则从通知列表中移除通知。  //  //*******************************************************************HRESULT WINAPI RegistryNotifyApp(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszName,   LPCTSTR pszApp,   LPCTSTR pszClass,   LPCTSTR pszWindow,   UINT msg,   NOTIFICATIONCONDITION*pCondition);  //***************************************************************  //函数名RegistryNotifyWindow  //  //目的用于请求当指定值改变时通知窗口  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上请求了变化通知的值的名字(可以为  // NULL,以指示默认值)  // IN HWND hWnd—向其发送消息的窗口的句柄  // IN UINT msg—传递到窗口的消息  // IN DWORD dwUserData—用通知传递回用户的用户数据  // IN NOTIFICATION CONDITION*pCondition—当与新注册表值的比较为  // TRUE时应当发送变化通知的条件(可以为NULL,以指示任何变化应当  // 导致通知)  // OUT HREGNOTIFY*phNotify—接收到通知请求的句柄。当该键上的通知不再  // 需要时,应当使用RegistryCloseNotification关闭该句柄。  //  //返回值// HRESULT  // S_OK—对通知的请求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或hWnd无效  // 被包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—每次当对该值作出变化时将通知调用者  // FAILED—不改变  //  //描述  // msg参数应当对RegistryNotifyWindow的每一调用都唯一,使得客户机可在多  // 个通知之间区分。通知请求被添加到通知列表。调用者调用  // RegistryCloseNotification来停止进一步的通知,并关闭通知句柄。该通知请求  // 类型是暂时的,即,如果设备复位,则通知请求不再存在。当由pszValueName  // 指定的值改变时,通过PostMessage通知客户机。如果PostMessage失败,或  // 由hWnd指定的窗口不再有效,则从通知队列中移除通知请求,并且关闭  // phNotify中返回的句柄。  // 传递到PostMessage的参数如下  // WPARAM—对于类型REG_DWORD的值,如果该值已被删除,则它是新  //值或0;对于所有的其它类型,该值为0  // LPARAM-dwUserData上传递的数据  // 当调用RegsitryNotifyWindow时如果该值不再存在,则当添加该值时通知客户  // 机。  //  //***************************************************************  HRESULT WINAPI RegistryNotifyWindow(HKEY hKey,   LPCTSTR pszValueName,   HWND hWnd,   UINT msg,   DWORD dwUserData,NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //***************************************************************  //函数名RegistryNotifyMsgQueue  //  //目的用于请求当指定的值改变时通知消息队列  //  //自变量  // IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上请求变化通知的值的名字(可以为NULL,  // 以指示默认值)  // IN LPCTSTR pszMsgQueue—到作为要通知的消息队列的名字的串的指针。如  // 果该消息队列尚未创建,则RegistryNotifyMsgQueue将创建它。  // IN DWORD dwUserData—将用通知传递回用户的用户数据  // IN NOTIFICATIONCONDITION*pCondition—当与新注册表值的比较为TRUE  // 时应当发送变化通知的条件(可以为NULL,以指示任何变化应当导致通  // 知)  // OUT HREGNOTIFY*phNotify—接收到通知请求的句柄。当该键上的通知不再  // 需要时,应当用RegistryCloseNotification关闭该句柄。  //  //返回值  // HRESULT  // S_OK—对通知的请求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pszMsgQueue无效  // 被包装成FACILITY_WIN32 HRESULT的错误结果  //  //结果  // SUCCEEDED—每次当对该值作出变化时将通知调用者// FAILED—不改变  //  //描述  // 通知请求被添加到通知列表。调用者调用RegistryCloseNotification来停止进一  // 步的通知,并关闭通知句柄。该通知请求类型是暂时的,即,如果设备复位,  // 则通知请求不再存在。通过消息队列通知客户机。一旦通知了客户机,可使用  // ReadMsgQueue函数来检索关于改变的键的信息。返回的数据为以下格式  // |HREGNOTIFY hNotify|DWORD dwUserData|UINT字节级数|BYTE[]新值  // |  // hNotify—与phNotify中所返回的一样的hNotify  // dwUserData—作为dwUserData传递的用户数据  // 字节计数—随后的字节数(对于删除,该值为0)  // 新值—pszValueName的新值  // 如果当调用RegistryNotifyMsgQueue时该值不存在,则当添加该值时通知客户  // 机。  //  //******************************************************************  HRESULT WINAPI RegistryNotifyMsgQueue(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszMsgQueue,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //*******************************************************************  //函数名RegistryNotifyCallback  //  //目的用于请求当指定的值改变时通知回叫  //  //自变量// IN HKEY hKey—到当前打开的键的句柄,或预定义根值  // IN LPCTSTR pszSubKey—储存值的键(如果该值为空,则假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上请求的变化通知的值的名字(可以为  // NULL,以指示默认值)  // IN REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback—到当通知到达  // 时将回叫的函数的指针  // IN DWORD dwUserData—用通知传递回用户的用户数据  // IN NOTIFICATIONCONDITION*pCondition—当与新值的比较为TRUE时应  // 当发送变化通知的条件(可以为NULL,以指示任何变化应当导致通知)  // OUT HREGNOTIFY*phNotify—接收到通知请求的句柄。当该键上的通知不再  需要时,应当使用RegistryCloseNotificaion关闭该句柄。  //  //返回值  // HRESULT  // S_OK—对通知的请求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pfnRegistryNotifyCallback无效  // 被包装成FACILITY_WIN32 HRESULT的错误结果  //  //结果  // SUCCEEDED—每次当对该值作出变化时通知调用者  // FAILED—不改变  //  //描述  // 通知请求被添加到通知列表。调用者调用RegistryCloseNotificaion来停止进一  // 步的通知,并关闭通知句柄。该通知请求的类型是暂时的,即,如果设备复位,  // 则通知请求不再存在。通过回叫向客户机通知变化。如果当调用  // RegistryNotifyCallback时该值不存在,则当添加该值时通知客户机。  //  //******************************************************************HRESULT WINAPI RegistryNotifyCallback(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //******************************************************************  //函数名RegistryCloseNotification  //  //目的用于从通知列表中移除通知请求,并关闭通知句柄  //  //自变量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,必须已返回  // RegistryNotify*函数之一  //  //返回值  // HRESULT  // S_OK—通知请求从通知列表中移除  // E_INVALID_HANDLE-hNotify无效  // 被包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—通知请求已被移除,hNotify现在是无效句柄  // FAILED—不改变  //  //描述  // 搜索通知列表以查找对hNotify的参照,如果找到,将其从队列中移除,并且  // 释放与hNotify关联的存储器。尚未分派给客户机的任何通知将丢失。  ////***************************************************************  HRESULT WINAPI RegistryCloseNotification(HREGNOTIFY hNotify);  //***************************************************************  //函数名RegistryStopNotification  //  //目的用于从通知列表中移除对永久通知的请求  //  //自变量  // IN LPCTSTR pszName—表示已注册的永久通知的串  //  //返回值  // HRESULT  // S_OK—通知已从列表中移除  // E_INVALIDARG-pszName无效  // 被包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—通知请求已被移除  // FAILED—不改变  //  //描述  // 搜索通知列表以查找对通知的参照,如果找到,从队列中移除它们。尚未分派  // 给客户机的任何通知将丢失。  //  //*****************************************************************  HRESULT WINAPI RegistryStopNotification(LPCTSTR pszName);  //*****************************************************************  //函数名RegistryBatchNotification  //  //目的用于分批处理频繁出现的通知//  //自变量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,已返回  // RegistryNotify*函数之一  // IN DWORD dwMillisecondsIdle—在通知被激发之前应当值保持不变的毫秒数  // IN DWORD dwMillisecondsMax—第一个变化发生和发送通知之间的时间的最  // 大毫秒数  //  //返回值  // HRESULT  // S_OK—通知已从列表中移除  // E_INVALIDARG-dwMillisecondIdle被设为INFINITE  // E_INVALID_HANDLE-hNotify无效  // 被包装成FACILITY_WIN32 HRESULT的错误值  //  //结果  // SUCCEEDED—设置了新的分批处理时间  // FAILED—不改变  //  //描述  // 当值改变时,通知系统等候dwMillisecondsIdle毫秒,然后发送通知。如果在  // 此等候期间发生另一变化,则复位定时器,通知系统将等候另一  // dwMillisecondsIdle毫秒以发送通知。为确保dwMillisecondsIdle不阻止发送通  // 知,使用dwMillisecondsMax。dwMillisecondsMax是可从第一个通知到达的时  // 间推移到发送通知的时间的最大毫秒数。如果dwMillisecondsMax被设为  // INFINITE,则分批处理通知直到该值为空闲。dwMillisecondsIdle不可以是  // INFINITE。  //  //**************************************************************  HRESULT WINAPI RegistryBatchNotification(HREGNOTIFY hNotify,DWORD dwMillisecondsIdle,   DWORD dwMillisecondsMax);  HRESULT WINAPI RegistryScheduleNotifications(SYSTEMTIME*pstStart,  DWORD dwIntervalMinutes,  RSN_BEHAVIOR rsnbehavior,  LPCTSTR pszName,  LPCTSTR pszApp,  LPCTSTR pszClass,  LPCTSTR pszWindow,  UINT msg);]]></pre>已管理API<pre listing-type="program-listing"><![CDATA[  以下是示例性已管理API  名字空间A.Mobile  {  ///用于指定当设备待命时当出现事件时应当发生什么   public enum StandbyBehavior   {   ///不要引发任何事件   Ignore,   ///将设备带离待命状态并引发事件    Wake,   ///一旦设备由其它事情唤醒就引发事件   Delay  }  public interface IAppLaunchable  {   ///该通知的唯一名字   public string appLaunchId{get;}///对特定的可执行码和命令行参数注册该通知  ///在被调用之前,该通知不活动  ///<param name=″appLaunchID″>  ///该通知的唯一标识符。  ///用于当应用程序关闭/重起时再次打开它  ///如果该ID已被使用,则抛出异常  ///</param>  ///param name=″filename″>  ///当引发通知时装入的应用程序。  ///如果为空,则使用调用的可执行码  ///</param>  ///<param name=″parameters″>发送到应用程序的命令行参数</param>  void EnableAppLaunch(string appLaunchId,string filename,stringparameters);  ///对不具有命令行的特定可执行码注册该通知  ///在被调用之前,该通知不活动  ///<param name=″appLaunchId″>  ///该通知的唯一标识符。  ///用于当应用程序关闭/重起时再次打开它  ///如果该ID已被使用,则抛出异常  ///</param>  ///<param name=″filename″>当引发通知时要装入的应用程序</param>  void EnableAppLaunch(string appLaunchId,string filename);  ///对没有参数的调用可执行码注册该通知  ///在被调用之前,该通知不活动  ///  ///如果从DLL而非EXE调用,则抛出异常///DLL用于调用其它超负载之一   ///<param name=″appLaunchId″>   ///该通知的唯一标识符   ///用于当应用程序关闭/重起时再次打开它   ///如果该ID已被使用,则抛出异常   ///</param>   void EnableAppLaunch(string appLaunchId);   ///解除通知的注册   ///用于停止通知不再被激发   void DisableAppLaunch();  }  ///在已调度的基础上引发的通知   public class ScheduledNotificationILaunchable  {   //该通知的下一次出现被调度在何时出现   public DateTime NextOccurrence{get;set}   ///在通知的出现之间过去了多少时间   ///忽略秒和毫秒   public TimeSpan Interval{get;set}   ///当出现过程中设备待命时该通知应当如何行动   ///忽略、唤醒设备、等候直到其它事情唤醒设备。   ///默认值是Wake(唤醒)   public StandbyBehavior StandbyBehavior{get;set}   ///确定是否注册了命名的通知   ///<param name=″appLaunchId″>通知名</param>   ///<returns>如果已注册了通知则为真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}public event EventHandler Occured;   ///用给定名字创建新的持久通知   ///<param name=″nextOccurrence″>下一次出现是何时</param>   ///<param name=″interval″>出现之间的时间多长。忽略秒和毫秒  </param>   public ScheduledNotification(Datetime nextOccurrence,TimeSpan  interval){}   //加载先前注册的通知的构造函数   ///<param name=″existingAppLaunchId″>先前注册的通知的名字  </param>   public ScheduledNotification(string existingAppLaunchId)   {  if(!AppLaunchIdExists(name))   throw new ArgumentException();   }   }  }   名字空间A.Mobile.Status   {   ///用于有条件的变化通知指定应当如何将新值与期望值相比较   public enum StateComparisonType   {   ///不论值如何都引发事件,这是默认的   All,   Equal,   Greater,   GreaterOrEqual,   LessOrEqual,   Less,Contains,  StartsWith,  EndsWith  }  ///表示可被查询并可被倾听的所有系统状态的枚举  public abstract class StateBaseILaunchable  {   ///对于有条件的通知,如何将新值与TargetValue进行比较   public ComparisonType Comparisontype{get;set}   ///将新值与什么比较。仅当比较为真时引发通知   public object ComparisonValue{get;set}   ///该系统属性的当前值   public object CurrentValue{get;}   public event ChangeNotificationEventHandlerChanged;  }  ///当系统定义的属性改变时引发的暂时通知  public class SystemStateStateBase  {   ///获取指定的系统属性的值   ///<param name=″property″>要获取值的属性</param>   ///<returns></returns>   public static object GetValue(SystemProperty property){}   ///要监控的系统属性   public SystemProperty Property{get;}   ///确定是否已注册了命名的通知   ///<param name=″appLaunchId″>通知名</param>///<returns>如果通知已注册则为真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}   ///没有条件的构造函数(永远引发事件)   ///<param name=″property″></param>   public SystemState(SystemProperty property){}   ///为何时引发事件设置条件的构造函数   ///<param name=″property″>要监视的属性</param>   ///<param name=″comparisonType>如何比较</param>   ///<param name=″comparisonValue>比较什么</param>   public SystemState(SystemProperty property,ComparisonTypecomparisonType,object comparisonValue){}   ///加载先前注册的通知的构造函数   ///<param name=″existingAppLaunchId″>先前注册的通知名</param>   public SystemState(string existingAppLaunchId)   {   if(!AppLaunchIdExists(name))   throw new ArgumentException();   }  }  ///当注册表值改变时引发的暂时通知  public class RegistryValueStateBase  {   ///要监控的注册表键   public RegistryKey Key{get;}   ///要监控的注册表键中的值的名字   public string ValueName{get;}///确定是否注册了命名的通知  ///<param name=″appLaunchId″>通知名</param>  ///<returns>如果通知已注册则为真</returns>  public static bool AppLaunchIdExists(string appLaunchId){}  ///没有条件的构造函数(永远引发事件)  ///<param name=″key″>要监视的注册表键</param>  ///<param name=″valueName″>要监视的注册表键中的注册表值的名字</param>  public RegistryValue(RegistryKey key,string valueName){}  ///为何时应当引发事件设置条件的构造函数  ///<param name=″key″>要监视的注册表键</param>  ///<param name=″valueName″>要监视的注册表键中的注册表值的名字</param>  ///<param name=″comparisonType″>如何比较</param>  ///<param name=″comparisonValue″>比较什么</param>  public RegistryValue(RegistryKey key,string valueName,ComparisonType comparisonType,object comparisonValue){}  ///加载先前注册的通知的构造函数  ///<param name=″existingAppLaunchId″>先前注册的通知的名字</param>  public RegistryValue(string existingAppLaunchId)  {   if(!AppLaunchIdExists(name))  throw new ArgumentException();  }   }   public delegate void ChangeNotificationEventHandler(object sender,ChangeNotificationEventArgs e);   public class ChangeNotificationEventArgsEventArgs   {   public object CurrentValue{get;}   }   }]]></pre>已管理API的示例使用<pre listing-type="program-listing"><![CDATA[  //查询系统属性  int signal=SystemState.PhoneSignalStrength;  //或者……  int signal=(int)SystemState.GetValue(SystemProperty.PhoneSignalStrength);  //或者……  SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);  int signal=(int)state.CurrentValue;  //注册暂时通知  SystemState state=new SystemState(SystemProperty.PhoneSignalStrength);  state.Changed+=new ChangeNotificationEventHandler(…);  //注册有条件的持久通知  SystemState state;  if(SystemState.AppLaunchIdExists(″MyApp.GoodSignal″))  {   state=new SystemState(″MyApp.GoodSignal″);  }  else  {   state=new SystemState(SystemProperty.PhoneSignalStrength,ComparisonType.Greater,75);   state.EnableAppLaunch(″MyApp.GoodSignal″);  }  state.Changed+=new ChangeNotificationEventHandler(…);  //注册已调度的通知  ScheduledNotification daily;  if(ScheduledNotification.AppLaunchIdExists(″MyApp.Daily″))  {   daily=new ScheduledNotification(″MyApp.Daily″);  }  else  {   daily=new ScheduledNotification(DateTime.Now,new TimeSpan(24,0,0));   daily.EnableAppLaunch(″MyApp.Daily″);  }   daily.Occurred+=new EventHandler(…);]]></pre>上述说明,示例和数据提供了本发明的组成的制作和使用的完整描述。因为能在不脱离本发明的精神和范围的情况下作出许多本发明的实施例,因此本发明蕴含在所附权利要求书中。
权利要求
1.一种用于响应于状态属性改变向客户机提供通知的方法,其特征在于,它包括从客户机接收一响应于与状态属性关联的变化接收通知的通知请求;确保所述状态属性向通知系统注册,其中,所述通知系统至少包括由设备中不同组件更新的部分状态属性;确定所述状态属性何时改变;确定所述客户机何时应接收所述状态属性变化的通知;以及在确定之后向所述客户机通知所述状态属性的变化。
2.如权利要求1所述的方法,其特征在于,它还包括利用API来执行涉及所述状态属性的行动,其中,所述行动包括以下的至少一个注册状态属性、查询所述状态属性和设置所述状态属性。
3.如权利要求2所述的方法,其特征在于,确定所述客户机何时应接收所述通知包括对所述状态属性应用条件表达式,并在所述条件满足时向所述客户机通知所述状态属性的变化。
4.如权利要求3所述的方法,其特征在于,所述条件表达式包括以下条件的至少一个所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……开始和以……结束。
5.如权利要求2所述的方法,其特征在于,它还包括响应于以下的至少一个起动所述客户机状态属性改变和已排定事件。
6.如权利要求2所述的方法,其特征在于,它还包括响应于由所述客户机确定的时间表通知所述客户机。
7.如权利要求2所述的方法,其特征在于,确定所述状态属性何时改变还包括在发生在预定时间周期内的对所述状态属性的变化上执行分批处理操作。
8.如权利要求1所述的方法,其特征在于,从所述客户机接收响应于与所述状态属性关联的变化而接收所述通知的通知请求还包括,当与所述请求关联的标识符标识一类状态属性时,将一组状态属性与来自所述客户机的所述通知请求关联,其中,所述状态属性在所述通知系统中排列成层次结构。
9.如权利要求2所述的方法,其特征在于,它还包括跨越设备的重启而持久保存所述通知请求。
10.一种用于状态管理和通知的系统,其特征在于,它包括一数据存储,被安排来存储涉及状态属性的信息,其中,所述状态属性的至少部分由不同的组件修改;一API,被配置成执行涉及所述状态属性的操作;客户机,被配置成注册通知请求并响应于它们所注册的状态属性的变化接收通知,其中,通知请求表明,响应于与所述状态属性关联的变化,客户机应当何时接收通知;一通知列表,被安排来存储已注册来接收通知请求的所述客户机;一通知代理程序,耦合至所述数据存储、所述通知列表和所述客户机,其中,所述通知代理程序包括一被配置成执行以下行动的应用程序接收将至少一个客户机添加到所述通知列表的通知请求;将所述至少一个客户机添加到所述通知列表;以及确定注册的状态属性何时改变,并且当所述状态属性改变时,确定要接收通知的客户机,并向所确定的客户机通知所述状态属性变化。
11.如权利要求10所述的系统,其特征在于,所述API还被配置成执行以下行动的至少一个注册状态属性、查询所述状态属性和设置所述状态属性。
12.如权利要求11所述的系统,其特征在于,确定要接收所述通知的客户机包括向所述状态属性应用条件表达式,并在所述条件满足时向所述客户机通知所述状态属性。
13.如权利要求12所述的系统,其特征在于,所述条件表达式包括以下条件的至少一个所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……开始和以……结束。
14.如权利要求11所述的系统,其特征在于,它还包括响应于状态属性变化和已排定事件的至少一个起动所述客户机。
15.如权利要求11所述的系统,其特征在于,它还包括响应于由所述客户机确定的时间表通知所述客户机。
16.如权利要求11所述的系统,其特征在于,确定所述状态属性何时改变还包括在发生在预定时间周期内的对所述状态属性的变化上执行分批处理操作。
17.如权利要求10所述的系统,其特征在于,所述状态属性被排列成一层次结构。
18.如权利要求10所述的系统,其特征在于,所述数据存储中的内容跨越设备重启而持久保存。
19.一种具有用于在状态属性上执行操作的计算机可执行指令的计算机可读媒质,其特征在于,所述操作包括接收标识一组状态参数中的至少一个状态属性的标识符参数,其中,所述状态参数组中的某些状态参数由设备中的不同组件更新;确定执行涉及所述状态参数的操作;以及执行所述操作。
20.如权利要求19所述的计算机可读媒质,其特征在于,所述操作包括以下操作的至少一个注册状态属性、查询所述状态属性、将条件表达式与所述状态参数关联和设置所述状态属性。
21.如权利要求20所述的计算机可读媒质,其特征在于,执行所述操作包括向所述状态属性应用所述条件表达式,并在所述条件满足时向所述客户机通知所述状态属性。
22.如权利要求21所述的计算机可读媒质,其特征在于,所述条件表达式包括以下条件的至少一个所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……开始和以……结束。
23.如权利要求20所述的计算机可读媒质,其特征在于,执行所述操作还包括响应于以下的至少一个起动客户机应用程序所述状态属性变化和已排定事件。
24.如权利要求20所述的计算机可读媒质,其特征在于,执行所述操作还包括响应于由所述客户机确定的时间表通知所述客户机。
25.如权利要求20所述的计算机可读媒质,其特征在于,执行所述操作还包括在发生在预定时间周期间内的对所述状态属性的变化上执行分批处理操作。
全文摘要
描述了一种用于存储设备、应用程序和服务状的统一机制的方法和系统,以及一种丰富的通知代理体系结构。客户机向通知代理程序注册以接收对状态属性变化的通知。当注册的状态属性改变时,通知代理程序确定向哪一客户机通知状态变化,并向客户机提供关于该变化的通知。一旦状态改变,当状态改变满足预定条件时,或根据时间表通知客户机。响应于状态改变也能装入应用程序。提供了一种应用编程接口(API),它提供了一种在设备的不同组件之间访问状态改变信息的统一的方法。
文档编号G06F13/00GK1617501SQ20041008770
公开日2005年5月18日 申请日期2004年10月22日 优先权日2003年10月23日
发明者A·阿拉克, B·克罗斯, J·卡拉恰尔, J·W·福勒, R·里维, Z·科克, O·M·阿米加 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1