午夜毛片免费看,老师老少妇黄色网站,久久本道综合久久伊人,伊人黄片子

向應(yīng)用程序通知狀態(tài)變化的靈活體系結(jié)構(gòu)的制作方法

文檔序號:6434993閱讀:182來源:國知局
專利名稱:向應(yīng)用程序通知狀態(tài)變化的靈活體系結(jié)構(gòu)的制作方法
相關(guān)申請本實用專利要求序號為60/513,723,在2003年10月23日提交的美國臨時專利申請符合35USC119(e)的優(yōu)先權(quán)。
背景技術(shù)
當今,移動設(shè)備被設(shè)計成運行各種應(yīng)用程序,并保持用戶能獲得最新的當前信息。這些設(shè)備的某些包括個人數(shù)字助理、無線電話和電子郵件設(shè)備。移動設(shè)備現(xiàn)在能通過各種裝置連接到因特網(wǎng)和其它網(wǎng)絡(luò),并從而能通過網(wǎng)絡(luò)交換信息。這些移動設(shè)備能更新應(yīng)用程序,并發(fā)送和接收信息,如電子郵件、電子郵件附件和網(wǎng)頁內(nèi)容。提供所有這些功能需要移動設(shè)備上的應(yīng)用程序收到各種事件的通知,如當新的電子郵件可用時、當設(shè)備的屏幕被激活時、當收到電話時等。然而,訪問與該設(shè)備關(guān)聯(lián)的所有不同狀態(tài)變化是困難的。

發(fā)明內(nèi)容
簡言之,本發(fā)明是針對在各設(shè)備間統(tǒng)一狀態(tài)和通知的體系結(jié)構(gòu)。
按本發(fā)明的一方面,客戶機向通知代理程序(broker)注冊以接收對狀態(tài)屬性改變的通知。當注冊的狀態(tài)屬性改變時,通知代理程序確定向哪一客戶機通知狀態(tài)改變,并為客戶機提供關(guān)于該變化的通知。例如,客戶機能注冊以接收關(guān)于電池強度變化、網(wǎng)絡(luò)連接性、存儲器使用等的通知。每當這些注冊的態(tài)屬性之一改變時,通知代理程序向客戶機發(fā)通知消息。
按本發(fā)明另一方面,每當狀態(tài)改變,當狀態(tài)改變滿足預定條件時,或根據(jù)一時間表來通知客戶機。按本發(fā)明的又一方面,響應(yīng)于狀態(tài)改變或時間表能裝入應(yīng)用程序。例如,客戶機能注冊,以當發(fā)生某個事件時,如移動設(shè)備接收到定向到要裝入的應(yīng)用程序的消息時,啟動該應(yīng)用程序。也能根據(jù)客戶機配置的時間表來啟動應(yīng)用程序。
按本發(fā)明的再一方面,提供一種應(yīng)用編程接口(API),它針對提供一種在設(shè)備內(nèi)不同組件之間訪問狀態(tài)變化信息的統(tǒng)一方法。例如,應(yīng)用程序能使用同一函數(shù)調(diào)用來訪問由設(shè)備內(nèi)的不同組件設(shè)置的狀態(tài)屬性。
按本發(fā)明的還有一個方面,注冊狀態(tài)屬性能跨設(shè)備重起而保持不變。


圖1示出一個示例性計算設(shè)備;圖2示出一個示例性移動設(shè)備;圖3示出一個示例性狀態(tài)管理和通知系統(tǒng);圖4示出用于狀態(tài)變化通知系統(tǒng)的過程;以及圖5示出按本發(fā)明的各方面處理狀態(tài)變化信息的過程。
具體實施例方式
簡言之,本發(fā)明針對提供一種用于存儲設(shè)備、應(yīng)用程序和服務(wù)狀態(tài)的統(tǒng)一機制的方法和系統(tǒng),以及一種豐富的通知代理體系結(jié)構(gòu)。一般而言,客戶機向通知代理程序注冊,以便在某些狀態(tài)屬性改變時接收通知。當注冊的狀態(tài)屬性改變時,通知代理程序判斷向哪一客戶機通知該狀態(tài)變化,并向該客戶機提供關(guān)于此變化的通知。每當狀態(tài)改變,當狀態(tài)變化滿足預定條件時,或根據(jù)一時間表來通知客戶機。也可響應(yīng)于狀態(tài)變化或時間表來裝入應(yīng)用程序。也提供了一種應(yīng)用編程接口(API),它針對提供一種在設(shè)備內(nèi)不同組件之間訪問狀態(tài)變化的統(tǒng)一方法。
在整個說明書和權(quán)利要求書中,下列術(shù)語至少采取明確與此處相關(guān)的意義,除非上下文清楚地另外要求。下面標識的意義并不意味著局限這些術(shù)語,而僅提供這些術(shù)語的說明性示例?!耙弧?,“一個”和“該”的意義包括多個引用,“在……中”的意義包括“在……內(nèi)”和“在……上”。
術(shù)語“狀態(tài)屬性”指的是向通知系統(tǒng)注冊并存儲的“狀態(tài)”變量,用于維護和改變通知。
術(shù)語“通知請求”指的是來自要向其通知狀態(tài)變化的客戶機的請求。
術(shù)語“通知列表”指的是已注冊狀態(tài)屬性變化通知的客戶機的集合。
術(shù)語“通知代理程序”指的是負責從數(shù)據(jù)存儲中添加、更新和移除數(shù)據(jù)的底層驅(qū)動程序。
術(shù)語“狀態(tài)改變組件”指的是添加,更新,或通常維護數(shù)據(jù)存儲中的狀態(tài)屬性的任何組件。
術(shù)語“客戶機”指的是注冊狀態(tài)屬性改變通知的任何組件??蛻魴C可以是狀態(tài)改變組件,狀態(tài)改變組件也可以是客戶機。
術(shù)語“狀態(tài)屬性標識符”指的是狀態(tài)屬性的“友好”串(名)的表示。此標識符能是分層的,并是唯一的。
術(shù)語“條件通知”指的是當狀態(tài)屬性改變且狀態(tài)屬性的新值滿足通知請求中規(guī)定的條件時所發(fā)出的通知。
說明性操作環(huán)境參考圖1,用于實現(xiàn)本發(fā)明的示例性系統(tǒng)包括諸如計算設(shè)備100的計算設(shè)備。計算設(shè)備100能被配置成客戶機或服務(wù)器。在很基本的配置中,計算設(shè)備100通常包括至少一個處理單元102和系統(tǒng)存儲器104。按照計算設(shè)備的確切配置和類型,系統(tǒng)存儲器104能是易失(如RAM)、非易失(如ROM,閃存等)或兩者的某種組合。系統(tǒng)存儲器104通常包括操作系統(tǒng)105、一個或多個程序模塊106,并能包括程序數(shù)據(jù)107。在圖1中,這些基本配置由在虛線108中的那些組件示出。
計算設(shè)備100能具有附加特征或功能。例如,計算設(shè)備100還能包括另外的數(shù)據(jù)存儲設(shè)備(可移動和/或不可移動的),如磁盤、光盤或磁帶。在圖1中,這些另外的存儲用可移動存儲109和不可移動存儲110示出。計算機存儲介質(zhì)能包括以用于存儲如計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)等信息的任何方法或技術(shù)實現(xiàn)的易失和非易失、可移動和不可移動介質(zhì)。系統(tǒng)存儲器104,可移動存儲109,和不可移動存儲110均是計算機存儲介質(zhì)之例。計算機存儲介質(zhì)包括但不限于,RAM、ROM、EEPROM、閃存或其它存儲器技術(shù)、CD-ROM、數(shù)字多功能盤(DVD)或其它光存儲、盒式磁帶、磁帶、磁盤存儲或其它磁存儲設(shè)備,或能用于存儲希望的信息并能由計算設(shè)備100訪問的其它介質(zhì)。任何那樣的計算機存儲介質(zhì)能是設(shè)備100的部分。計算設(shè)備100還能具有輸入設(shè)備112,如鍵盤、鼠標、輸入筆、語音輸入設(shè)備、觸摸輸入設(shè)備等。還能包括如顯示器、揚聲器、打印機等輸出設(shè)備。
計算設(shè)備100還包含通信連接,它允許該設(shè)備如經(jīng)過網(wǎng)絡(luò)與其它計算設(shè)備118通信。通信連接116是通信媒體的例子。通信媒體通常在如載波或其它傳輸機制的已調(diào)制數(shù)據(jù)信號包含計算機可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并包括任何信息傳送媒體。術(shù)語“已調(diào)制數(shù)據(jù)信號”意為以如在信號中編碼信息的方式設(shè)置或改變其一個或多個特征的信號。作為示例而非局限,通信媒體包括如有線網(wǎng)絡(luò)或直線連接的有線媒體,如聲音、RF、紅外和其它無線媒體的無線媒體。這里使用的術(shù)語計算機可讀媒質(zhì)包括存儲介質(zhì)和通信媒體。
參考圖2,用于實現(xiàn)本發(fā)明的一個示例性系統(tǒng)包括如移動設(shè)備200的移動設(shè)備。移動設(shè)備200具有處理器260、存儲器262、顯示器228和小鍵盤232。存儲器262一般包括易失存儲器(如RAM)和非易失存儲器(如ROM、閃存等)。移動設(shè)備200包括操作系統(tǒng)264,如微軟公司的Windows CE操作系統(tǒng)或其它操作系統(tǒng),它們駐留在存儲器262中,并在處理器260上執(zhí)行。小鍵盤232可以是壓鍵數(shù)字撥號盤(象典型的電話)、多鍵鍵盤(如傳統(tǒng)的鍵盤)。顯示器228能是液晶顯示器,或在移動設(shè)備中常用的任何其它類型顯示器。顯示器228能是觸敏的,因而能用作輸入設(shè)備。
一個或多個應(yīng)用程序能加載到存儲器262中,并在操作系統(tǒng)264上運行。應(yīng)用程序的示例包括電話撥號程序、電子郵件程序、時間表程序、PIM(個人信息管理)程序、文字處理程序、電子表格程序、因特網(wǎng)瀏覽器程序等。應(yīng)用程序266能使用共用的API,以在與設(shè)備關(guān)聯(lián)的狀態(tài)屬性上執(zhí)行動作。例如,電話撥號程序能向通知系統(tǒng)注冊,以接收關(guān)于對信號強度、電話狀態(tài)、電池強度的改變的通知。移動計算設(shè)備200在存儲器262中還包括非易失存儲268。非易失存儲268可用于存儲永久性信息,它在移動計算設(shè)備200掉電時也不會丟失。應(yīng)用程序266能使用和儲存存儲器268中的信息,如電子郵件或由電子郵件應(yīng)用程序使用的其它消息、由PIM使用的聯(lián)系人信息、由時間表程序使用的約會信息、由文字處理程序使用的文檔等。
移動計算設(shè)備200具有實現(xiàn)為一個或多個電池的電源270。電源還能包括外接電源,如AC適配器或補充或重充電電池的電源連接座。
移動計算設(shè)備200還能包括外部通知機制,如LED(未示出)和音頻接口274。這些設(shè)備能直接耦合到電源270,使得在激活時,即使關(guān)閉處理器260和其它組件來節(jié)省電池功率,它們?nèi)园赐ㄖ獧C制所指示的在一段時間內(nèi)保持打開。音頻接口274用于向用戶提供音頻信號并從用戶接收音頻信號。例如,音頻接口274能耦合至揚聲器以提供音頻輸出,并耦合至麥克風以接收聽覺輸入以便于電話對話。
移動計算設(shè)備200還能包含通信連接240,它允許設(shè)備如經(jīng)無線網(wǎng)絡(luò)與其它計算設(shè)備進行通信。移動計算設(shè)備200還包括無線電接口層272,它執(zhí)行發(fā)送和接收射頻通信的功能。無線電接口層272通過通信載波或服務(wù)提供商方便了在移動計算設(shè)備200和外部世界之間的無線連接。到無線電接口層272的來回發(fā)送在操作系統(tǒng)264的控制下進行。換言之,由無線電接口層272和通信連接240接收的通信能通過操作系統(tǒng)傳播到應(yīng)用程序,反之亦然。
說明性狀態(tài)變化通知系統(tǒng)圖3按本發(fā)明的諸方面示出了示例狀態(tài)管理和通知系統(tǒng)。通知系統(tǒng)300包括狀態(tài)改變組件310、客戶機315和320、通知代理程序335和數(shù)據(jù)存儲330。按一個實施例,通知代理程序335還維護通知列表340、高速緩存屬性345和調(diào)度程序350。
如客戶機315或320那樣的客戶機向通知代理程序335注冊來接收關(guān)于對狀態(tài)屬性的變化的通知。一般而言,每當狀態(tài)屬性改變,當變化滿足一條件時或根據(jù)一時間表,客戶機用注冊該客戶機以接收通知的通知代理程序335作出通知請求。通知能是永久的或暫時的通知。
永久的通知被保存在數(shù)據(jù)存儲(320)中。按照一個實施例,永久的通知保存在如注冊表的后端數(shù)據(jù)存儲中,因而跨重起是“持久不變的”。因為這些通知是持久的,這些類型的狀態(tài)屬性在軟復位(或關(guān)閉)之前具有與重起(或起動)之后相同的值。。按照一個實施例,狀態(tài)屬性默認地是持久的。
暫時通知不是永久的,因而跨重起是不持久保持的。換言之,若軟復位(或重起)設(shè)備,從通知列表340中刪除通知請求。為了恢復暫時通知,客戶機重新注冊(向通知代理程序335發(fā)送另一通知請求)以接收關(guān)于對狀態(tài)屬性的變化的通知。
客戶機還能注冊,使在發(fā)生狀態(tài)改變時和/或按時間表裝入應(yīng)用程序。通常,如果當狀態(tài)改變或已調(diào)度的時間出現(xiàn)時客戶機所指定的應(yīng)用程序尚未運行,則通知代理程序335發(fā)出命令以啟動該應(yīng)用程序。按一個實施例,客戶機能指定當裝入時發(fā)送給該應(yīng)用程序的命令行參數(shù)。若裝入的進程創(chuàng)建一窗口,則向該窗口發(fā)送表示該通知的消息。若目標進程已在客戶機上運行,則客戶機僅接收通知消息。
發(fā)送給客戶機的通知也能分批處理。分批的狀態(tài)屬性供經(jīng)常經(jīng)常發(fā)生值變化的狀態(tài)屬性使用。設(shè)定允許使狀態(tài)屬性值“穩(wěn)定”的預定的時間周期。按一個實施例,預定周期設(shè)成200ms。若在預定期間未向狀態(tài)屬性值作出改變,則將該通知傳送給注冊的客戶機。分批預定周期是可配置的,并存儲在數(shù)據(jù)存儲330中。
數(shù)據(jù)存儲330被配置成存儲注冊的狀態(tài)屬性,以及其它信息。按一個實施例,數(shù)據(jù)存儲330是操作系統(tǒng)提供的注冊表,如由微軟公司的Windows XP操作系統(tǒng)提供的注冊表。數(shù)據(jù)存儲330也能是在其中能設(shè)置和訪問信息的其它類型的數(shù)據(jù)存儲。數(shù)據(jù)存儲330還能包括在通知系統(tǒng)300的各種位置上維護的一個或多個數(shù)據(jù)存儲。
數(shù)據(jù)存儲330也能用可由客戶機315和320訪問的狀態(tài)屬性的默認設(shè)置預加載。預加載狀態(tài)屬性數(shù)據(jù)使許多狀態(tài)屬性可用,而客戶機不必添加狀態(tài)屬性。例如,按一個實施例,下面狀態(tài)對客戶機可用而不必注冊該狀態(tài)顯示校準(分辨率,亮度)、不消除的提醒(計數(shù)、主題、日期、時間、位置)、不消除的警告(計數(shù)、描述、日期、時間)、電池(剩余電量的%、狀態(tài))、后備電池(剩余電量的%、狀態(tài))、存儲器(空閑的程序存儲器、已使用的程序存儲器、空閑的存儲存儲器、已使用的存儲存儲器)、存儲卡(總的空閑存儲器、總的已使用存儲器)、硬件(按下電話狀態(tài)(開/關(guān))、啟用鍵盤、啟用Wifi、啟用藍牙、頭戴式耳機存在、相機存在)、消息(未讀計數(shù)、總計數(shù)、草稿計數(shù)、發(fā)件箱計數(shù))、任務(wù)(高優(yōu)先級計數(shù)、今天的任務(wù)計數(shù)、已過期計數(shù))、日程表(下次約會、名字、位置、日期、時間、POOM ID)、白天的約會(名字、位置、日期、時間、POOM ID)、當前約會(名字、位置、日期、時間、POOM ID);當前空閑/忙碌狀態(tài)、即時消息(狀態(tài)、在線聯(lián)系人計數(shù)、離線聯(lián)系人計數(shù))、連接性(速度、Wifi、接入點、信號強度、連接名、連接到(工作,互聯(lián)網(wǎng))、狀態(tài))、媒體播放器(狀態(tài)、播放列表(名稱、模式(重復,隨機)、音軌記數(shù)、總持續(xù)時間)、音軌(類型(音頻、視頻)、名稱、專輯、藝術(shù)家、音軌數(shù)、流派、年、持續(xù)時間、播放演位置、文件名、比特率)、同步狀態(tài)、電話(操作員、信號強度、電話狀態(tài)、概覽、漫游、無線電狀態(tài)、有效呼叫(呼叫者名、呼叫者號碼)、未接呼叫計數(shù)、SIM工具組消息。如能看到,狀態(tài)覆蓋了許多不同的應(yīng)用程序。
按一個實施例,狀態(tài)屬性數(shù)據(jù)被組織成一層次結(jié)構(gòu)。該層次結(jié)構(gòu)使客戶機能通過參照其父屬性來規(guī)定一組狀態(tài)屬性。狀態(tài)屬性能設(shè)置成如串、整型、浮點型等數(shù)據(jù)類型。
客戶機能通過狀態(tài)屬性的“友好”串(名)表示來標識狀態(tài)屬性。例如,“battery\a”參照在父“battery(電池)”之下的狀態(tài)屬性“a”,同樣,“battery\b”能是在父“battery”之下的狀態(tài)屬性“b”。當參照共同的父之下的一組狀態(tài)屬性時,能使用父標識符。例如,為接收基于對所有電池狀態(tài)的變化的通知,在注冊表中提供“battery”,從而使用單個名字參照所有電池狀態(tài)屬性。
代理程序335能被配置成控制對數(shù)據(jù)存儲330中設(shè)置/調(diào)節(jié)/移除狀態(tài)屬性類型的訪問。例如,能在狀態(tài)屬性上加上限制,它將從通知系統(tǒng)中的刪除屬性局限到預定的客戶機的列表上。當刪除狀態(tài)屬性時,向已注冊關(guān)于該屬性的通知的客戶機通知這一刪除。
如上討論,客戶機315和320注冊他們在接收關(guān)于這些狀態(tài)屬性何時改變的通知時所感興趣的的狀態(tài)屬性??蛻魴C能注冊,以每當他們所注冊的狀態(tài)改變時,當施加到狀態(tài)值的條件滿足一條件時,或在預定時間表到達時接收通知。條件通知可基于許多不同的條件。按一個實施例,條件包括所有、等于、不等于、大于、大于或等于、小于或等于、小于、包含、以……開始、以……結(jié)束。例如,客戶機315能向通知代理程序335注冊,以當未接呼叫計數(shù)狀態(tài)屬性大于15時,和當呼叫者的名字包含“Ja”時接收通知。加條件使客戶機能接收他們關(guān)注的狀態(tài)改變信息而不必處理他們無關(guān)心的狀態(tài)改變信息。
注冊來接收關(guān)于對狀態(tài)屬性的改變的通知的客戶機在通知列表340中維護。通知代理程序335訪問通知列表340,以便當注冊的狀態(tài)屬性改變時確定應(yīng)接收通知的客戶機。
調(diào)度程序350可被配置成根據(jù)時間表通知和/或激活客戶機。調(diào)度的激活通知模式允許客戶機根據(jù)向通知代理程序335注冊的簡化的循環(huán)時間表接收通知。時間表能被配置成以任意的時間間隔發(fā)生,如按秒、分、小時、天、星期、或月的度量。按一個實施例,時間表由第一次出現(xiàn)的日期/時間和兩次出現(xiàn)的時間量來定義。此外,可不以循環(huán)時間間隔來定義時間表。當不提供循環(huán)時間間隔時,通知只發(fā)送一次,然后從通知列表中移除該注冊。此外,當通知到達時,若未能找到指定的(在通知請求期間提供的)應(yīng)用程序路徑,則從通知列表340移除該已調(diào)度的通知注冊。
當狀態(tài)改變時,狀態(tài)變化組件310在數(shù)據(jù)存儲330中更新該狀態(tài)屬性的值。狀態(tài)變化組件310能直接在數(shù)據(jù)存儲330中更新狀態(tài),或通過通知代理程序335來更新。當通過數(shù)據(jù)存儲330更新狀態(tài)時,數(shù)據(jù)存儲330向通知代理程序335傳遞此變化。當通過通知代理程序335更新狀態(tài)時,通知代理程序335在數(shù)據(jù)存儲330中更新狀態(tài)。在任一情況下,通知代理程序335根據(jù)狀態(tài)變化確定應(yīng)通知哪些客戶機。通知代理程序335分析通知列表340,并確定已注冊了關(guān)于該狀態(tài)變化的通知的客戶機。通知代理程序335向已經(jīng)改變的狀態(tài)屬性值施加任何條件,并在條件滿足時通知客戶機。當不存在與該狀態(tài)變化關(guān)聯(lián)的條件時,向該客戶機通知該狀態(tài)變化。
當如客戶機315和320那樣的客戶機從通知代理程序335接收通知時,客戶機能調(diào)用公用API中的功能(見下面討論)來檢索該狀態(tài)屬性的新狀態(tài)??蛇x地,可將該屬性信息連同通知一起直接傳送到客戶機。當用戶對接收有關(guān)特定狀態(tài)屬性的通知不再感興趣時,客戶機能從接收關(guān)于該狀態(tài)屬性的改變通知撤消其本身的注冊??蛻魴C315和320也能在任何時刻使用公用API直接查詢代理程序335,以找到狀態(tài)屬性的狀態(tài)。
狀態(tài)屬性值也能由通知代理程序335高速緩存在高速緩存屬性345中。狀態(tài)屬性值能根據(jù)許多不同理由高速緩存。例如,狀態(tài)屬性值能被高速緩存,使得可將狀態(tài)屬性的先前值與該狀態(tài)屬性的當前值進行比較。此外,高速緩存能幫助便于請求狀態(tài)屬性值的快速重復查找。
按一個實施例,通知系統(tǒng)300支撐.NET(管理的)客戶機,以向存儲添加和改變通知注冊。
以下是進一步表明狀態(tài)管理通知系統(tǒng)300的某些示例性場景。
例1ISV服務(wù)網(wǎng)絡(luò)新手Norm構(gòu)建了C#應(yīng)用程序,它保持了當前賽季棒球的統(tǒng)計數(shù)據(jù)(如,隊、隊員、得分、狀態(tài)等)的完整數(shù)據(jù)庫。他還構(gòu)建了簡單的XML Web-服務(wù)客戶機,它能連接到體育網(wǎng)站并下拉出已更新的日統(tǒng)計。因為該應(yīng)用存儲的數(shù)據(jù)量相當大,Norm僅希望其應(yīng)用程序在設(shè)備(如PPC)上的“粗管道(fat pipe)”(如802.1x)可用時同步數(shù)據(jù)。然后Norm通過向通知代理程序335發(fā)送對當高帶寬連接可用時的通知的請求來注冊其應(yīng)用程序。Norm在通知請求中另外規(guī)定,當高帶寬連接可用時裝入其應(yīng)用程序的請求。當與連接關(guān)聯(lián)的狀態(tài)變化組件更新該連接狀態(tài)時,若狀態(tài)表明它是高速連接,則通知代理程序335激活Norm的應(yīng)用程序。
例2LOB公司(商務(wù)線)應(yīng)用程序企業(yè)開發(fā)者Elph構(gòu)建了基于現(xiàn)場服務(wù)形式的VB.Net應(yīng)用程序,供保險精算人使用。該應(yīng)用程序允許保險調(diào)停者查找零件數(shù)和價格、作出注釋、檢索汽車的原理圖等。每天,保險精算人在現(xiàn)場拿出他的移動設(shè)備為客戶機服務(wù)。該應(yīng)用程序在數(shù)據(jù)存儲中本地持久保存今天的操作的所有數(shù)據(jù)。Elph希望每當連接上設(shè)備時,該應(yīng)用程序?qū)㈦x線存儲與公司主服務(wù)器同步。因而,Elph注冊其應(yīng)用程序以接收通知同步連接事件的通知。每當連接上設(shè)備時,向該應(yīng)用程序通知,且該應(yīng)用程序同步其數(shù)據(jù)。
例3電話游戲電話游戲開發(fā)者Golem正在構(gòu)建下一代電話多游戲者RPG。他希望該游戲是非常普及的,使得它一次能持續(xù)數(shù)周和數(shù)月。Golem主要關(guān)心的一個問題是沒有用戶的干預游戲狀態(tài)的持久性。該游戲的純粹特征之一是在電話電池耗盡之前保存當前的狀態(tài),并確保用戶永不丟失任何數(shù)據(jù)的能力。Golem注冊他的應(yīng)用程序來接收電量不足的通知,以確保在設(shè)備電池耗盡前保存游戲信息。
例4設(shè)備管理客戶機應(yīng)急企業(yè)管理客戶機開發(fā)者Eric尋求創(chuàng)建下一代移動計算設(shè)備和電話管理客戶機;能夠處理客戶機更新、病毒掃描、政策實施及其它更多的功能。他使用C#已構(gòu)建了強有力的設(shè)備方客戶機,它能基于服務(wù)器驅(qū)動的命令處理諸請求。每天凌晨3點,Eric希望他的應(yīng)用程序“醒來”,使他能聯(lián)系服務(wù)器來尋找已更新的政策、病毒掃描器的簽名等。為此,他簡單地向通知代理程序335注冊其應(yīng)用程序以接收已調(diào)度的通知(每天凌晨3點)。Eric現(xiàn)能確保他的應(yīng)用程序在指定時間運行。
圖4示出按本發(fā)明的諸方面用于狀態(tài)變化通知系統(tǒng)的過程。在開始塊之后,過程400前進到塊410,其中,客戶機注冊以獲得對至少一個狀態(tài)屬性的改變的通知。若該狀態(tài)屬性不是已由另一客戶機監(jiān)控,則將該狀態(tài)屬性添加到可用狀態(tài)屬性的列表中。如上討論,可用屬性的列表被預加載到通知系統(tǒng)??蛻魴C能注冊以接收關(guān)于對該屬性作出的所有變化、滿足條件的變化的通知,以及按時間表來通知。
移到塊420,向通知系統(tǒng)注冊回叫,使得當對注冊的狀態(tài)屬性作出變化時,令通知系統(tǒng)知道該變化。按一個實施例,通知代理程序向操作系統(tǒng)注冊表注冊對狀態(tài)屬性值作出的變化的回叫。
前進到塊430,將該客戶機添加到通知列表,以接收關(guān)于該裝態(tài)屬性的通知消息。包括在通知列表中的客戶機接收關(guān)于對注冊的狀態(tài)屬性的變化的通知。
移到塊440,當對任何注冊的狀態(tài)屬性作出變化時,接收回叫。按一個實施例,回叫包括標識狀態(tài)屬性變化的標識符和狀態(tài)屬性的當前值。
移到塊450,處理狀態(tài)變化信息。一般而言,處理狀態(tài)變化信息包括判斷是否向每一對改變的狀態(tài)屬性已注冊的客戶機應(yīng)用了任何條件、時間表、分批處理或應(yīng)用程序裝入條件(見圖5及有關(guān)討論)。
圖5示出按本發(fā)明的諸方面處理狀態(tài)改變信息的過程。在開始塊500之后,過程前進到塊510,其中,訪問注冊接收有關(guān)改變的狀態(tài)屬性的狀態(tài)變化的通知用戶。按一個實施例,訪問通知表以確定對已改變的狀態(tài)屬性已注冊的客戶機。
移到判斷塊520,在通知客戶機之前判斷該客戶機是否已規(guī)定要應(yīng)用到該狀態(tài)屬性的任何條件。
當條件表達式與通知請求關(guān)聯(lián)時,過程前進到塊530,其中,判斷條件是否滿足。當條件滿足,或當客戶機未規(guī)定任何條件時,過程前進到判斷塊540,其中,判斷客戶機是否規(guī)定響應(yīng)于狀態(tài)屬性的變化而裝入應(yīng)用程序。當客戶機規(guī)定裝入應(yīng)用,過程前進到塊550,其中,若應(yīng)用程序尚未運行,則裝入該應(yīng)用程序。當客戶機未規(guī)定裝入應(yīng)用程序,或在塊550該應(yīng)用程序已經(jīng)被裝入,則過程移到塊560,向客戶機通知狀態(tài)變化。
然后,過程前進到判斷塊570,判斷是否有更多的注冊來接收關(guān)于對該狀態(tài)屬性變化的通知的客戶機。當存在另一客戶機時,過程返回到塊510。當不存在其它客戶機,則過程移到結(jié)束塊并返回以處理其它行動。
狀態(tài)屬性類型和模式按本發(fā)明的一個實施例,能使用兩個API來訪問通知系統(tǒng)中的狀態(tài)信息。提供一本機或底層API,并向客戶機提供已管理的API。已管理的API訪問本機API以執(zhí)行其操作。
下面是按本發(fā)明的諸方面的示例性本機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//目的用于定義應(yīng)當如何將狀態(tài)屬性值與條件變化通知的目標值相比較。當執(zhí)行//REG_COMPARISONTYPE時,改變的值用作1-值,即,REG_CT_LESS指如果//改變的值小于目標值,則激發(fā)通知。//描述//以下示出了當完成比較時哪一命題為真。大小寫敏感的CompareString用于比較//串,以下信息用于闡明REG COMPARISONTYPE值的目的。//假設(shè)“cv”表示改變的值,“psz”或“dw”表示NOTIFICATIONCONDITION//結(jié)構(gòu)中指定的TargetValue(目標值)。設(shè)“l(fā)”表示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?。絪trstr(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;  //*******************************************************  //結(jié)構(gòu)名NOTIFICATIONCONDITION  //  //目的用于定義若符合則應(yīng)當激發(fā)屬性狀態(tài)變化通知的條件  //  //描述  // REG_COMPARISONTYPE ctComparisonType—如何將改變的值與TargetValue  // (目標值)中指定的值進行比較  // DWORD dwMask—如果該值不設(shè)為0,則將TargetValue解釋為DWORD。該  // 在比較完成之前應(yīng)用到改變的DWORD值,該標記不應(yīng)用到TargetValue。  // 如果該值設(shè)為0,則將TargetValue解釋為串。  //union TargetValue—如果dwMask設(shè)為0,則在psz和改變的值之間完成比較。如  // dwMask設(shè)為不同于0的任何值,則在dw和加表征碼(見dwMask)的改  // 變值之間完成比較。如果改變的值既不是類型REG_SZ也不是  // REG_DWORD,或者改變的值是類型REG_DWORD并且dwMask設(shè)為0,  // 或者改變的值是類型REG_SZ且dwMask不設(shè)為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  //函數(shù)原型REGISTRYNOTIFYCALLBACK  //  //目的定義RegisterNotifyCallback使用的回叫的原型  //  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,這是從  // RegistryNotifyCallback返回的同一句柄  // IN DWORD dwUserData—傳遞到RegistryNotifyCallback的用戶數(shù)據(jù)  // IN const PBYTE pData—到該值的新值的指針,如果該值被刪除,則將其設(shè)為  // NULL  // IN const UINT cbData—由pData指出的字節(jié)數(shù),如果該值被刪除,則將該值設(shè)  //為0  //  //描述  //該回叫用于通知使用RegistryNotifyCallback注冊了通知的客戶機。如果不再需要  //任何通知,則可以安全地從該回叫內(nèi)調(diào)用RegistryCloseNotification?! ?/  //****************************************************************** typedef void(*REGISTRYNOTIFYCALLBACK)(HREGNOTIFY hNotify  DWORD dwUserData,  const PBYTE pData,  const UINT cbData);  //******************************************************************  //函數(shù)名RegistryGetDWORD  //  //目的用于讀取REG_DWORD注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在該hKey中)  // IN LPCTSTR pszValueName—要檢索的值的名字(可以為NULL以檢索默認值)  // OUT DWORD*pdwData—到接收與同該值關(guān)聯(lián)的數(shù)據(jù)的緩沖器的指針  //  //返回值  // HRESULT  // S_OK—數(shù)據(jù)復制到緩沖器  // E_INVALIDARG-hKey或pdwData無效  // E_DATATYPE_MISMATCH—非REG_DWORD類型的值  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  //  //結(jié)果  // SUCCEEDED-pData指向與該值關(guān)聯(lián)的數(shù)據(jù)  // FAILED—未改變  //  //描述  // 與該值關(guān)聯(lián)的DWORD被復制到由pData指向的緩沖器中。如果由// hKey+pszSubKey指向的鍵不存在,則RegistryGetDWORD失敗,因為它使用  // RegOpenKey來訪問該鍵  //  //*************************************************************  HRESULT WINAPI RegistryGetDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD*pdwData);  //*************************************************************  //函數(shù)名RegistryGetString  //  //目的用于讀取REG_SZ注冊表鍵  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要檢索的值的名字(可以為NULL,以檢索默認  // 值)  // OUT LPTSTR pszData—到接收與該值關(guān)聯(lián)的數(shù)據(jù)的緩沖器的指針  // IN UINT cchData—到以字符計算的長度為由pData指向的緩沖器的變量的指針  //  //返回值  // HRESULT  // S_OK—數(shù)據(jù)復制到緩沖器  // E_INVALIDARG-hKey或pszData無效  // E_DATATYPE_MISMATCH—該值不是REG_SZ類型  // E_INSUFFICIENT_BUFFER—如cchData確定的由pszData指向的緩沖器的大  // 小不夠大來保留該串  // 被包裝為FACILITY_WIN32 HRESULT的從RegOpenKeyEx或// RegQueryValueEx返回的錯誤值  //  //結(jié)果  // SUCCEED-pData指向與該值關(guān)聯(lián)的數(shù)據(jù)  // FAILED—沒有變化  //  //描述  //  // 與該值關(guān)聯(lián)的串被復制到由pData指向的緩沖器。如果由hKey+pszSubKey指  // 向的鍵不存在,則RegsitryGetString將失敗,因為它使用了RegOpenKey來訪  // 問該鍵  //  //******************************************************************  HRESULT WINAPI RegistryGetString(HKEY hKey,  LPCTSTR pszSubKey,  LPCTSTR pszValueName,  LPTSTR pszData,  UINT cchData);  //************************************************************  //函數(shù)名RegistrySetDWORD  //  //目的用于設(shè)置REG_DWORD注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義的根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—要設(shè)置的值的名字(可以為NULL,以設(shè)置默認  // 值)  // IN DWORD dwData—新值//  //返回值  // HRESULT  // S_OK-pszValueName的值變?yōu)閐wData中的值  // E_INVALIDARG-hKey無效  // E_DATATYPE_MISMATCH—值不是REG_DWORD類型  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  //  //結(jié)果  // SUCCEEDED—與該值關(guān)聯(lián)的數(shù)據(jù)改變  // FAILED—不改變  //  //描述  // 與該值關(guān)聯(lián)的數(shù)據(jù)改變成新值。如果由hKey+PszSubKey指向的鍵不存在,則  // RegistrySetDWORD失敗,因為它使用RegOpenKey來訪問該鍵  //  //****************************************************************  HRESULT WINAPI RegistrySetDWORD(HKEY hKey,  LPCTSTR pdzSubKey,  LPCTSTR pszValueName,  DWORD dwData);  //****************************************************************  //函數(shù)名RegistrySetString  //  //目的用于設(shè)置REG_SZ注冊表值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName// 在hKey下)  // IN LPCTSTR pszValueName—要設(shè)置的值的名字(可以為NULL,以設(shè)置默認  // 值)  // IN LPCTSTR pszData—新值。該串以空結(jié)束。  //  //返回值  // HRESULT  // S_OK-pszValueName的數(shù)據(jù)值變?yōu)閜szData中的值  // E_INVALIDARG-hKey或pszData無效  // E_DATATYPE_MISMATCH—值不是REG SZ類型  // 被包裝成FACILITY_WIN32 HRESULT的從RegOpenKeyEx或  // RegQueryValueEx返回的錯誤值  // 從StringCbLength返回的錯誤HRESULT  //  //結(jié)果  // SUCCEEDED—與該值關(guān)聯(lián)的數(shù)據(jù)改變  // FAILED—不改變  //  //描述  // 與該值關(guān)聯(lián)的數(shù)據(jù)變?yōu)樾轮?。如果由hKey+pszSubKey指向的鍵不存在,則  // RegistrySetString失敗,因為它使用RegOpenKey來訪問該鍵  //  //******************************************************************  HRESULT WINAPI RegistrySetString(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszData);  //******************************************************************  //函數(shù)名RegistryTestExchangeDWORD  ////目的用于基于條件原子地設(shè)置值  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下  // IN LPCTSTR pszValueName—要設(shè)置的值的名字(可以為NULL,以設(shè)置默認  // 值)  // IN DWORD dwOldValue—要對照來檢查的值  // IN DWORD dwNewValue—要有條件地設(shè)置的值  //  //返回值  // HRESULT  // S_OK—數(shù)據(jù)值變?yōu)閐wNewValue  // S_FALSE—目標值未設(shè)為dwNewValue,因為與pdsValueName關(guān)聯(lián)的DWORD  // 值不等于dwOldValue  // E_INVALIDARG—傳遞的句柄或指針之一無效  // E_DATATYPE MISMATCH—值不是REG DWORD類型  // E_NOT_FOUND—值無法在指定的鍵下找到  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—與pszData關(guān)聯(lián)的數(shù)據(jù)值曾經(jīng)是dwOldValue,現(xiàn)在是  // dwNewValue  // FAILED—不改變  //  //描述  // 該函數(shù)是聯(lián)鎖(interlocked)函數(shù)—換言之,它可以被認為是原子的。它檢查  // 與pszValueName關(guān)聯(lián)的DWORD值是否等于OldValue。如果是,則它將目標  // 設(shè)為NewValue,否則失敗。//  //**************************************************************  HRESULT WINAPI RegistryTestExchangeDWORD(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   DWORD dwOldValue,   DWORD dwNewValue);  //**************************************************************  //函數(shù)名RegistryNotifyAppp  //  //目的用于請求當指定的值改變時裝入或通知應(yīng)用程序  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTRpszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求了變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN LPCTSTR pszName—表示通知請求的用戶定義的串,當不再需要通知時,  // 該串應(yīng)當被傳遞到RegistryStopNotification  // IN LPCTSTR pszApp—到作為到要裝入的可執(zhí)行碼的路徑的串的指針  // IN LPCTSTR pszClass—一旦裝入了可執(zhí)行碼,或者如果它已運行,則具有該窗  // IN LPCTSTRpszWindow 口名和類類型的窗口位于該進程內(nèi),并且向其傳  // 遞通知。如果這兩個參數(shù)都為空,該函數(shù)將僅裝入應(yīng)用程序?! ?/ IN UINT msg—傳遞到窗口的消息  // IN NOTIFICATIONCONDITION*pCondition—當與新注冊表值的比較為TRUE  // 時應(yīng)當發(fā)送變化通知的條件(可以為NULL,以指示任何變化應(yīng)當導致通知)  //  //返回值  // HRESULT// S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、pszApp或pszName無效  // E_ALTRADY_REGISTERED—名字等于由pszName執(zhí)行的名字的通知已存在  // 包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—現(xiàn)在每次當對該值作出改變時將通知調(diào)用者  // FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調(diào)用者調(diào)用RegistryStopNotification來停止進一  // 步的通知。該通知請求類型是永久的,即,即使設(shè)備復位時通知請求也是活動  // 的。在通知時,該函數(shù)通過在pszClass和pszWindow指定的類名和窗口名上作  // 出FindWind來確定是否已運行了具有pszApp中指定的名字的可執(zhí)行碼,如果  // 沒有,則它裝入該應(yīng)用程序。傳遞到應(yīng)用程序的命令行應(yīng)當在pszApp串中指  // 定,除用戶指定的任何命令行之外,添加以下內(nèi)容  // /notify″pszName″  // pszName—傳遞到pszName參數(shù)中的函數(shù)的句柄串  // 在裝入應(yīng)用程序之后,完成FindWindow,以查找具有pszClass和pszWindow  // 中指定的類名和窗口名的窗口。如果找到該窗口,則如在RegistryNotifyWindow  // 窗口中一樣通過PostMessage標帖由msg指定的消息。PostMessage的參數(shù)如下  // WPRAM—對于類型REG_DWORD的值,如果值已被刪除,則它是新值或  // 0;對于所有其它類型,該值為0  // LPARAM-0  // 該消息參數(shù)應(yīng)當對RegistryNotifyApp的每一調(diào)用都是唯一的,使得客戶機可在  // 多個通知之間區(qū)分。當添加或改變值時通知客戶機。當通知到達時,如果由  // pszApp指向的應(yīng)用程序無法被裝入,或無法找到具有類型pszClass的類的窗  // 口,或PostMessage失敗,則從通知列表中移除通知?! ?/  //*******************************************************************HRESULT WINAPI RegistryNotifyApp(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszName,   LPCTSTR pszApp,   LPCTSTR pszClass,   LPCTSTR pszWindow,   UINT msg,   NOTIFICATIONCONDITION*pCondition);  //***************************************************************  //函數(shù)名RegistryNotifyWindow  //  //目的用于請求當指定值改變時通知窗口  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求了變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN HWND hWnd—向其發(fā)送消息的窗口的句柄  // IN UINT msg—傳遞到窗口的消息  // IN DWORD dwUserData—用通知傳遞回用戶的用戶數(shù)據(jù)  // IN NOTIFICATION CONDITION*pCondition—當與新注冊表值的比較為  // TRUE時應(yīng)當發(fā)送變化通知的條件(可以為NULL,以指示任何變化應(yīng)當  // 導致通知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  // 需要時,應(yīng)當使用RegistryCloseNotification關(guān)閉該句柄?! ?/  //返回值// HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或hWnd無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—每次當對該值作出變化時將通知調(diào)用者  // FAILED—不改變  //  //描述  // msg參數(shù)應(yīng)當對RegistryNotifyWindow的每一調(diào)用都唯一,使得客戶機可在多  // 個通知之間區(qū)分。通知請求被添加到通知列表。調(diào)用者調(diào)用  // RegistryCloseNotification來停止進一步的通知,并關(guān)閉通知句柄。該通知請求  // 類型是暫時的,即,如果設(shè)備復位,則通知請求不再存在。當由pszValueName  // 指定的值改變時,通過PostMessage通知客戶機。如果PostMessage失敗,或  // 由hWnd指定的窗口不再有效,則從通知隊列中移除通知請求,并且關(guān)閉  // phNotify中返回的句柄?! ?/ 傳遞到PostMessage的參數(shù)如下  // WPARAM—對于類型REG_DWORD的值,如果該值已被刪除,則它是新  //值或0;對于所有的其它類型,該值為0  // LPARAM-dwUserData上傳遞的數(shù)據(jù)  // 當調(diào)用RegsitryNotifyWindow時如果該值不再存在,則當添加該值時通知客戶  // 機?! ?/  //***************************************************************  HRESULT WINAPI RegistryNotifyWindow(HKEY hKey,   LPCTSTR pszValueName,   HWND hWnd,   UINT msg,   DWORD dwUserData,NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //***************************************************************  //函數(shù)名RegistryNotifyMsgQueue  //  //目的用于請求當指定的值改變時通知消息隊列  //  //自變量  // IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求變化通知的值的名字(可以為NULL,  // 以指示默認值)  // IN LPCTSTR pszMsgQueue—到作為要通知的消息隊列的名字的串的指針。如  // 果該消息隊列尚未創(chuàng)建,則RegistryNotifyMsgQueue將創(chuàng)建它?! ?/ IN DWORD dwUserData—將用通知傳遞回用戶的用戶數(shù)據(jù)  // IN NOTIFICATIONCONDITION*pCondition—當與新注冊表值的比較為TRUE  // 時應(yīng)當發(fā)送變化通知的條件(可以為NULL,以指示任何變化應(yīng)當導致通  // 知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  // 需要時,應(yīng)當用RegistryCloseNotification關(guān)閉該句柄。  //  //返回值  // HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pszMsgQueue無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤結(jié)果  //  //結(jié)果  // SUCCEEDED—每次當對該值作出變化時將通知調(diào)用者// FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調(diào)用者調(diào)用RegistryCloseNotification來停止進一  // 步的通知,并關(guān)閉通知句柄。該通知請求類型是暫時的,即,如果設(shè)備復位,  // 則通知請求不再存在。通過消息隊列通知客戶機。一旦通知了客戶機,可使用  // ReadMsgQueue函數(shù)來檢索關(guān)于改變的鍵的信息。返回的數(shù)據(jù)為以下格式  // |HREGNOTIFY hNotify|DWORD dwUserData|UINT字節(jié)級數(shù)|BYTE[]新值  // |  // hNotify—與phNotify中所返回的一樣的hNotify  // dwUserData—作為dwUserData傳遞的用戶數(shù)據(jù)  // 字節(jié)計數(shù)—隨后的字節(jié)數(shù)(對于刪除,該值為0)  // 新值—pszValueName的新值  // 如果當調(diào)用RegistryNotifyMsgQueue時該值不存在,則當添加該值時通知客戶  // 機。  //  //******************************************************************  HRESULT WINAPI RegistryNotifyMsgQueue(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   LPCTSTR pszMsgQueue,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //*******************************************************************  //函數(shù)名RegistryNotifyCallback  //  //目的用于請求當指定的值改變時通知回叫  //  //自變量// IN HKEY hKey—到當前打開的鍵的句柄,或預定義根值  // IN LPCTSTR pszSubKey—儲存值的鍵(如果該值為空,則假定pszValueName  // 在hKey下)  // IN LPCTSTR pszValueName—在其上請求的變化通知的值的名字(可以為  // NULL,以指示默認值)  // IN REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback—到當通知到達  // 時將回叫的函數(shù)的指針  // IN DWORD dwUserData—用通知傳遞回用戶的用戶數(shù)據(jù)  // IN NOTIFICATIONCONDITION*pCondition—當與新值的比較為TRUE時應(yīng)  // 當發(fā)送變化通知的條件(可以為NULL,以指示任何變化應(yīng)當導致通知)  // OUT HREGNOTIFY*phNotify—接收到通知請求的句柄。當該鍵上的通知不再  需要時,應(yīng)當使用RegistryCloseNotificaion關(guān)閉該句柄?! ?/  //返回值  // HRESULT  // S_OK—對通知的請求被添加到通知列表  // E_INVALIDARG-hKey、phNotify或pfnRegistryNotifyCallback無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤結(jié)果  //  //結(jié)果  // SUCCEEDED—每次當對該值作出變化時通知調(diào)用者  // FAILED—不改變  //  //描述  // 通知請求被添加到通知列表。調(diào)用者調(diào)用RegistryCloseNotificaion來停止進一  // 步的通知,并關(guān)閉通知句柄。該通知請求的類型是暫時的,即,如果設(shè)備復位,  // 則通知請求不再存在。通過回叫向客戶機通知變化。如果當調(diào)用  // RegistryNotifyCallback時該值不存在,則當添加該值時通知客戶機。  //  //******************************************************************HRESULT WINAPI RegistryNotifyCallback(HKEY hKey,   LPCTSTR pszSubKey,   LPCTSTR pszValueName,   REGISTRYNOTIFYCALLBACK pfnRegistryNotifyCallback,   DWORD dwUserData,   NOTIFICATIONCONDITION*pCondition,   HREGNOTIFY*phNotify);  //******************************************************************  //函數(shù)名RegistryCloseNotification  //  //目的用于從通知列表中移除通知請求,并關(guān)閉通知句柄  //  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,必須已返回  // RegistryNotify*函數(shù)之一  //  //返回值  // HRESULT  // S_OK—通知請求從通知列表中移除  // E_INVALID_HANDLE-hNotify無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—通知請求已被移除,hNotify現(xiàn)在是無效句柄  // FAILED—不改變  //  //描述  // 搜索通知列表以查找對hNotify的參照,如果找到,將其從隊列中移除,并且  // 釋放與hNotify關(guān)聯(lián)的存儲器。尚未分派給客戶機的任何通知將丟失?! ?///***************************************************************  HRESULT WINAPI RegistryCloseNotification(HREGNOTIFY hNotify);  //***************************************************************  //函數(shù)名RegistryStopNotification  //  //目的用于從通知列表中移除對永久通知的請求  //  //自變量  // IN LPCTSTR pszName—表示已注冊的永久通知的串  //  //返回值  // HRESULT  // S_OK—通知已從列表中移除  // E_INVALIDARG-pszName無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—通知請求已被移除  // FAILED—不改變  //  //描述  // 搜索通知列表以查找對通知的參照,如果找到,從隊列中移除它們。尚未分派  // 給客戶機的任何通知將丟失?! ?/  //*****************************************************************  HRESULT WINAPI RegistryStopNotification(LPCTSTR pszName);  //*****************************************************************  //函數(shù)名RegistryBatchNotification  //  //目的用于分批處理頻繁出現(xiàn)的通知//  //自變量  // IN HREGNOTIFY hNotify—到有效HREGNOTIFY的句柄,已返回  // RegistryNotify*函數(shù)之一  // IN DWORD dwMillisecondsIdle—在通知被激發(fā)之前應(yīng)當值保持不變的毫秒數(shù)  // IN DWORD dwMillisecondsMax—第一個變化發(fā)生和發(fā)送通知之間的時間的最  // 大毫秒數(shù)  //  //返回值  // HRESULT  // S_OK—通知已從列表中移除  // E_INVALIDARG-dwMillisecondIdle被設(shè)為INFINITE  // E_INVALID_HANDLE-hNotify無效  // 被包裝成FACILITY_WIN32 HRESULT的錯誤值  //  //結(jié)果  // SUCCEEDED—設(shè)置了新的分批處理時間  // FAILED—不改變  //  //描述  // 當值改變時,通知系統(tǒng)等候dwMillisecondsIdle毫秒,然后發(fā)送通知。如果在  // 此等候期間發(fā)生另一變化,則復位定時器,通知系統(tǒng)將等候另一  // dwMillisecondsIdle毫秒以發(fā)送通知。為確保dwMillisecondsIdle不阻止發(fā)送通  // 知,使用dwMillisecondsMax。dwMillisecondsMax是可從第一個通知到達的時  // 間推移到發(fā)送通知的時間的最大毫秒數(shù)。如果dwMillisecondsMax被設(shè)為  // 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  {  ///用于指定當設(shè)備待命時當出現(xiàn)事件時應(yīng)當發(fā)生什么   public enum StandbyBehavior   {   ///不要引發(fā)任何事件   Ignore,   ///將設(shè)備帶離待命狀態(tài)并引發(fā)事件    Wake,   ///一旦設(shè)備由其它事情喚醒就引發(fā)事件   Delay  }  public interface IAppLaunchable  {   ///該通知的唯一名字   public string appLaunchId{get;}///對特定的可執(zhí)行碼和命令行參數(shù)注冊該通知  ///在被調(diào)用之前,該通知不活動  ///<param name=″appLaunchID″>  ///該通知的唯一標識符?! ?//用于當應(yīng)用程序關(guān)閉/重起時再次打開它  ///如果該ID已被使用,則拋出異常  ///</param>  ///param name=″filename″>  ///當引發(fā)通知時裝入的應(yīng)用程序。  ///如果為空,則使用調(diào)用的可執(zhí)行碼  ///</param>  ///<param name=″parameters″>發(fā)送到應(yīng)用程序的命令行參數(shù)</param>  void EnableAppLaunch(string appLaunchId,string filename,stringparameters);  ///對不具有命令行的特定可執(zhí)行碼注冊該通知  ///在被調(diào)用之前,該通知不活動  ///<param name=″appLaunchId″>  ///該通知的唯一標識符?! ?//用于當應(yīng)用程序關(guān)閉/重起時再次打開它  ///如果該ID已被使用,則拋出異?! ?//</param>  ///<param name=″filename″>當引發(fā)通知時要裝入的應(yīng)用程序</param>  void EnableAppLaunch(string appLaunchId,string filename);  ///對沒有參數(shù)的調(diào)用可執(zhí)行碼注冊該通知  ///在被調(diào)用之前,該通知不活動  ///  ///如果從DLL而非EXE調(diào)用,則拋出異常///DLL用于調(diào)用其它超負載之一   ///<param name=″appLaunchId″>   ///該通知的唯一標識符   ///用于當應(yīng)用程序關(guān)閉/重起時再次打開它   ///如果該ID已被使用,則拋出異?! ?///</param>   void EnableAppLaunch(string appLaunchId);   ///解除通知的注冊   ///用于停止通知不再被激發(fā)   void DisableAppLaunch();  }  ///在已調(diào)度的基礎(chǔ)上引發(fā)的通知   public class ScheduledNotificationILaunchable  {   //該通知的下一次出現(xiàn)被調(diào)度在何時出現(xiàn)   public DateTime NextOccurrence{get;set}   ///在通知的出現(xiàn)之間過去了多少時間   ///忽略秒和毫秒   public TimeSpan Interval{get;set}   ///當出現(xiàn)過程中設(shè)備待命時該通知應(yīng)當如何行動   ///忽略、喚醒設(shè)備、等候直到其它事情喚醒設(shè)備。   ///默認值是Wake(喚醒)   public StandbyBehavior StandbyBehavior{get;set}   ///確定是否注冊了命名的通知   ///<param name=″appLaunchId″>通知名</param>   ///<returns>如果已注冊了通知則為真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}public event EventHandler Occured;   ///用給定名字創(chuàng)建新的持久通知   ///<param name=″nextOccurrence″>下一次出現(xiàn)是何時</param>   ///<param name=″interval″>出現(xiàn)之間的時間多長。忽略秒和毫秒  </param>   public ScheduledNotification(Datetime nextOccurrence,TimeSpan  interval){}   //加載先前注冊的通知的構(gòu)造函數(shù)   ///<param name=″existingAppLaunchId″>先前注冊的通知的名字 ?。?param>   public ScheduledNotification(string existingAppLaunchId)   {  if(!AppLaunchIdExists(name))   throw new ArgumentException();   }   }  }   名字空間A.Mobile.Status   {   ///用于有條件的變化通知指定應(yīng)當如何將新值與期望值相比較   public enum StateComparisonType   {   ///不論值如何都引發(fā)事件,這是默認的   All,   Equal,   Greater,   GreaterOrEqual,   LessOrEqual,   Less,Contains,  StartsWith,  EndsWith  }  ///表示可被查詢并可被傾聽的所有系統(tǒng)狀態(tài)的枚舉  public abstract class StateBaseILaunchable  {   ///對于有條件的通知,如何將新值與TargetValue進行比較   public ComparisonType Comparisontype{get;set}   ///將新值與什么比較。僅當比較為真時引發(fā)通知   public object ComparisonValue{get;set}   ///該系統(tǒng)屬性的當前值   public object CurrentValue{get;}   public event ChangeNotificationEventHandlerChanged;  }  ///當系統(tǒng)定義的屬性改變時引發(fā)的暫時通知  public class SystemStateStateBase  {   ///獲取指定的系統(tǒng)屬性的值   ///<param name=″property″>要獲取值的屬性</param>   ///<returns></returns>   public static object GetValue(SystemProperty property){}   ///要監(jiān)控的系統(tǒng)屬性   public SystemProperty Property{get;}   ///確定是否已注冊了命名的通知   ///<param name=″appLaunchId″>通知名</param>///<returns>如果通知已注冊則為真</returns>   public static bool AppLaunchIdExists(string appLaunchId){}   ///沒有條件的構(gòu)造函數(shù)(永遠引發(fā)事件)   ///<param name=″property″></param>   public SystemState(SystemProperty property){}   ///為何時引發(fā)事件設(shè)置條件的構(gòu)造函數(shù)   ///<param name=″property″>要監(jiān)視的屬性</param>   ///<param name=″comparisonType>如何比較</param>   ///<param name=″comparisonValue>比較什么</param>   public SystemState(SystemProperty property,ComparisonTypecomparisonType,object comparisonValue){}   ///加載先前注冊的通知的構(gòu)造函數(shù)   ///<param name=″existingAppLaunchId″>先前注冊的通知名</param>   public SystemState(string existingAppLaunchId)   {   if(!AppLaunchIdExists(name))   throw new ArgumentException();   }  }  ///當注冊表值改變時引發(fā)的暫時通知  public class RegistryValueStateBase  {   ///要監(jiān)控的注冊表鍵   public RegistryKey Key{get;}   ///要監(jiān)控的注冊表鍵中的值的名字   public string ValueName{get;}///確定是否注冊了命名的通知  ///<param name=″appLaunchId″>通知名</param>  ///<returns>如果通知已注冊則為真</returns>  public static bool AppLaunchIdExists(string appLaunchId){}  ///沒有條件的構(gòu)造函數(shù)(永遠引發(fā)事件)  ///<param name=″key″>要監(jiān)視的注冊表鍵</param>  ///<param name=″valueName″>要監(jiān)視的注冊表鍵中的注冊表值的名字</param>  public RegistryValue(RegistryKey key,string valueName){}  ///為何時應(yīng)當引發(fā)事件設(shè)置條件的構(gòu)造函數(shù)  ///<param name=″key″>要監(jiān)視的注冊表鍵</param>  ///<param name=″valueName″>要監(jiān)視的注冊表鍵中的注冊表值的名字</param>  ///<param name=″comparisonType″>如何比較</param>  ///<param name=″comparisonValue″>比較什么</param>  public RegistryValue(RegistryKey key,string valueName,ComparisonType comparisonType,object comparisonValue){}  ///加載先前注冊的通知的構(gòu)造函數(shù)  ///<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[  //查詢系統(tǒng)屬性  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(…);  //注冊已調(diào)度的通知  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>上述說明,示例和數(shù)據(jù)提供了本發(fā)明的組成的制作和使用的完整描述。因為能在不脫離本發(fā)明的精神和范圍的情況下作出許多本發(fā)明的實施例,因此本發(fā)明蘊含在所附權(quán)利要求書中。
權(quán)利要求
1.一種用于響應(yīng)于狀態(tài)屬性改變向客戶機提供通知的方法,其特征在于,它包括從客戶機接收一響應(yīng)于與狀態(tài)屬性關(guān)聯(lián)的變化接收通知的通知請求;確保所述狀態(tài)屬性向通知系統(tǒng)注冊,其中,所述通知系統(tǒng)至少包括由設(shè)備中不同組件更新的部分狀態(tài)屬性;確定所述狀態(tài)屬性何時改變;確定所述客戶機何時應(yīng)接收所述狀態(tài)屬性變化的通知;以及在確定之后向所述客戶機通知所述狀態(tài)屬性的變化。
2.如權(quán)利要求1所述的方法,其特征在于,它還包括利用API來執(zhí)行涉及所述狀態(tài)屬性的行動,其中,所述行動包括以下的至少一個注冊狀態(tài)屬性、查詢所述狀態(tài)屬性和設(shè)置所述狀態(tài)屬性。
3.如權(quán)利要求2所述的方法,其特征在于,確定所述客戶機何時應(yīng)接收所述通知包括對所述狀態(tài)屬性應(yīng)用條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態(tài)屬性的變化。
4.如權(quán)利要求3所述的方法,其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結(jié)束。
5.如權(quán)利要求2所述的方法,其特征在于,它還包括響應(yīng)于以下的至少一個起動所述客戶機狀態(tài)屬性改變和已排定事件。
6.如權(quán)利要求2所述的方法,其特征在于,它還包括響應(yīng)于由所述客戶機確定的時間表通知所述客戶機。
7.如權(quán)利要求2所述的方法,其特征在于,確定所述狀態(tài)屬性何時改變還包括在發(fā)生在預定時間周期內(nèi)的對所述狀態(tài)屬性的變化上執(zhí)行分批處理操作。
8.如權(quán)利要求1所述的方法,其特征在于,從所述客戶機接收響應(yīng)于與所述狀態(tài)屬性關(guān)聯(lián)的變化而接收所述通知的通知請求還包括,當與所述請求關(guān)聯(lián)的標識符標識一類狀態(tài)屬性時,將一組狀態(tài)屬性與來自所述客戶機的所述通知請求關(guān)聯(lián),其中,所述狀態(tài)屬性在所述通知系統(tǒng)中排列成層次結(jié)構(gòu)。
9.如權(quán)利要求2所述的方法,其特征在于,它還包括跨越設(shè)備的重啟而持久保存所述通知請求。
10.一種用于狀態(tài)管理和通知的系統(tǒng),其特征在于,它包括一數(shù)據(jù)存儲,被安排來存儲涉及狀態(tài)屬性的信息,其中,所述狀態(tài)屬性的至少部分由不同的組件修改;一API,被配置成執(zhí)行涉及所述狀態(tài)屬性的操作;客戶機,被配置成注冊通知請求并響應(yīng)于它們所注冊的狀態(tài)屬性的變化接收通知,其中,通知請求表明,響應(yīng)于與所述狀態(tài)屬性關(guān)聯(lián)的變化,客戶機應(yīng)當何時接收通知;一通知列表,被安排來存儲已注冊來接收通知請求的所述客戶機;一通知代理程序,耦合至所述數(shù)據(jù)存儲、所述通知列表和所述客戶機,其中,所述通知代理程序包括一被配置成執(zhí)行以下行動的應(yīng)用程序接收將至少一個客戶機添加到所述通知列表的通知請求;將所述至少一個客戶機添加到所述通知列表;以及確定注冊的狀態(tài)屬性何時改變,并且當所述狀態(tài)屬性改變時,確定要接收通知的客戶機,并向所確定的客戶機通知所述狀態(tài)屬性變化。
11.如權(quán)利要求10所述的系統(tǒng),其特征在于,所述API還被配置成執(zhí)行以下行動的至少一個注冊狀態(tài)屬性、查詢所述狀態(tài)屬性和設(shè)置所述狀態(tài)屬性。
12.如權(quán)利要求11所述的系統(tǒng),其特征在于,確定要接收所述通知的客戶機包括向所述狀態(tài)屬性應(yīng)用條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態(tài)屬性。
13.如權(quán)利要求12所述的系統(tǒng),其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結(jié)束。
14.如權(quán)利要求11所述的系統(tǒng),其特征在于,它還包括響應(yīng)于狀態(tài)屬性變化和已排定事件的至少一個起動所述客戶機。
15.如權(quán)利要求11所述的系統(tǒng),其特征在于,它還包括響應(yīng)于由所述客戶機確定的時間表通知所述客戶機。
16.如權(quán)利要求11所述的系統(tǒng),其特征在于,確定所述狀態(tài)屬性何時改變還包括在發(fā)生在預定時間周期內(nèi)的對所述狀態(tài)屬性的變化上執(zhí)行分批處理操作。
17.如權(quán)利要求10所述的系統(tǒng),其特征在于,所述狀態(tài)屬性被排列成一層次結(jié)構(gòu)。
18.如權(quán)利要求10所述的系統(tǒng),其特征在于,所述數(shù)據(jù)存儲中的內(nèi)容跨越設(shè)備重啟而持久保存。
19.一種具有用于在狀態(tài)屬性上執(zhí)行操作的計算機可執(zhí)行指令的計算機可讀媒質(zhì),其特征在于,所述操作包括接收標識一組狀態(tài)參數(shù)中的至少一個狀態(tài)屬性的標識符參數(shù),其中,所述狀態(tài)參數(shù)組中的某些狀態(tài)參數(shù)由設(shè)備中的不同組件更新;確定執(zhí)行涉及所述狀態(tài)參數(shù)的操作;以及執(zhí)行所述操作。
20.如權(quán)利要求19所述的計算機可讀媒質(zhì),其特征在于,所述操作包括以下操作的至少一個注冊狀態(tài)屬性、查詢所述狀態(tài)屬性、將條件表達式與所述狀態(tài)參數(shù)關(guān)聯(lián)和設(shè)置所述狀態(tài)屬性。
21.如權(quán)利要求20所述的計算機可讀媒質(zhì),其特征在于,執(zhí)行所述操作包括向所述狀態(tài)屬性應(yīng)用所述條件表達式,并在所述條件滿足時向所述客戶機通知所述狀態(tài)屬性。
22.如權(quán)利要求21所述的計算機可讀媒質(zhì),其特征在于,所述條件表達式包括以下條件的至少一個所有、相等、不等、大于、大于等于、小于等于、小于、包含、以……開始和以……結(jié)束。
23.如權(quán)利要求20所述的計算機可讀媒質(zhì),其特征在于,執(zhí)行所述操作還包括響應(yīng)于以下的至少一個起動客戶機應(yīng)用程序所述狀態(tài)屬性變化和已排定事件。
24.如權(quán)利要求20所述的計算機可讀媒質(zhì),其特征在于,執(zhí)行所述操作還包括響應(yīng)于由所述客戶機確定的時間表通知所述客戶機。
25.如權(quán)利要求20所述的計算機可讀媒質(zhì),其特征在于,執(zhí)行所述操作還包括在發(fā)生在預定時間周期間內(nèi)的對所述狀態(tài)屬性的變化上執(zhí)行分批處理操作。
全文摘要
描述了一種用于存儲設(shè)備、應(yīng)用程序和服務(wù)狀的統(tǒng)一機制的方法和系統(tǒng),以及一種豐富的通知代理體系結(jié)構(gòu)。客戶機向通知代理程序注冊以接收對狀態(tài)屬性變化的通知。當注冊的狀態(tài)屬性改變時,通知代理程序確定向哪一客戶機通知狀態(tài)變化,并向客戶機提供關(guān)于該變化的通知。一旦狀態(tài)改變,當狀態(tài)改變滿足預定條件時,或根據(jù)時間表通知客戶機。響應(yīng)于狀態(tài)改變也能裝入應(yīng)用程序。提供了一種應(yīng)用編程接口(API),它提供了一種在設(shè)備的不同組件之間訪問狀態(tài)改變信息的統(tǒng)一的方法。
文檔編號G06F13/00GK1617501SQ20041008770
公開日2005年5月18日 申請日期2004年10月22日 優(yōu)先權(quán)日2003年10月23日
發(fā)明者A·阿拉克, B·克羅斯, J·卡拉恰爾, J·W·福勒, R·里維, Z·科克, O·M·阿米加 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1