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