本文檔我上傳過程中圖片沒有粘貼上來,為此如果有人感興趣,請(qǐng)下載word文檔,地址是http://m.shnenglu.com/Files/franksunny/Symbian應(yīng)用程序框架淺析.rar,歡迎大家給我指點(diǎn)。
Symbian 應(yīng)用程序框架淺析
S60應(yīng)用程序的運(yùn)行依賴于大量的OS組件,例如屏幕繪圖和應(yīng)用程序數(shù)據(jù)持久性等,可以直接使用OS的窗口服務(wù)器或者文件服務(wù)器即可。
應(yīng)用程序核心框架類
應(yīng)用程序框架由一套核心類組成,這些類是所有應(yīng)用程序框架的基礎(chǔ)。這些類封裝了應(yīng)用程序和所需OS服務(wù)器之間的相互作用。
應(yīng)用程序核心框架類
第一層:CBase和CActive兩個(gè)基類,其中CActive也是派生于CBase,而CActive又被第二層的CConEnv派生
第二層:包含兩個(gè)基本組件:AppArc和CONE。AppArc代表“應(yīng)用程序架構(gòu)”,這些類提供了基本的應(yīng)用程序結(jié)構(gòu)、將系統(tǒng)信息提交到應(yīng)用程序的機(jī)制,以及使用文件服務(wù)器持久化數(shù)據(jù)。其中的類在命名時(shí)都帶有前綴“*Apa”。CONE是控制環(huán)境的縮寫,在這個(gè)組件中的類提供用于處理用戶輸入并創(chuàng)建用戶界面的機(jī)制--這些類主要用于和窗口服務(wù)器進(jìn)行交互,其中的類在命名時(shí)都帶有前綴“*Coe”。這一層中的許多類都是抽象類,僅僅定義了一個(gè)API的接口。
第三層:Uikon組件。這是具有豐富功能、非抽象框架類的一般性設(shè)備無關(guān)實(shí)現(xiàn),并且提供了一個(gè)在所有symbian OS上公用的UI庫(kù)層。一些具體的UI控件(比如列表框和滾動(dòng)條等)都可以在該層創(chuàng)建,這些控件有時(shí)也被稱為Eikon控件。UIkon組件中的類在命名時(shí)都帶有前綴“*Eik”。添加了一個(gè)公共的symbian OS實(shí)現(xiàn),和其他Symbian OS UI平臺(tái)共享。
第四層:由Avkon類組成,這些類提供了核心的S60 UI功能,例如菜單支持。Avkon控件的類在命名時(shí)都帶有前綴“*Akn”。在框架上添加S60特有的實(shí)現(xiàn)。
第五層:針對(duì)應(yīng)用程序的層,設(shè)計(jì)自己的應(yīng)用程序,添加自定義應(yīng)用程序?qū)崿F(xiàn)。
以上提到的這些類簡(jiǎn)單來說就是:視圖(View)、文檔(Document)、應(yīng)用程序(Application)、應(yīng)用程序UI(Application UI)。那么一個(gè)S60 UI應(yīng)用程序是如何用這些類來實(shí)現(xiàn)其有機(jī)程序呢,這個(gè)就涉及到一個(gè)應(yīng)用程序框架的初始化問題。
應(yīng)用程序框架初始化
必須創(chuàng)建下面的每個(gè)方法,才能提供最小的S60應(yīng)用程序:
a、 框架入口:所有S60 UI都實(shí)現(xiàn)一個(gè)全局函數(shù)E32DLL()(非UI類的全局入口函數(shù)為E32Main),當(dāng)應(yīng)用程序啟動(dòng)時(shí),框架將首先調(diào)用該函數(shù),該函數(shù)也稱為DLL入口點(diǎn),應(yīng)用程序必須存在該函數(shù)。每個(gè)S60 UI 應(yīng)用程序都是一個(gè)多態(tài)DLL。
b、新建應(yīng)用程序?qū)嵗?/span>讓框架調(diào)用NewApplication(),該函數(shù)是由DLL導(dǎo)出的唯一函數(shù),負(fù)責(zé)創(chuàng)建應(yīng)用程序類的一個(gè)實(shí)例,并返回它的指針,以后框架使用該指針完成應(yīng)用程序的創(chuàng)建。這里在堆上創(chuàng)建應(yīng)用程序?qū)嵗褂玫氖?#8220;new”方法而不是Symbian OS常見的“new (ELeave)”方法,這是因?yàn)?span lang=EN>TRAP harness(陷阱捕捉)這時(shí)還沒有創(chuàng)立。如果系統(tǒng)不能為新的實(shí)例分配內(nèi)存,那返回的指針就是NULL,應(yīng)用程序框架能夠檢查到并處理這個(gè)問題。
c、返回UID:由框架調(diào)用AppDllUid()返回應(yīng)用程序的UID。該函數(shù)必須返回在.mmp文件中指定的UID值,該值可用于確定應(yīng)用程序的實(shí)例是否正在運(yùn)行。如果一個(gè)應(yīng)用程序正在運(yùn)行,而要啟動(dòng)這個(gè)程序的另一個(gè)實(shí)例,這時(shí)該運(yùn)行的程序就會(huì)被切換到前臺(tái),而不是重新生成一個(gè)。
d、新建文檔實(shí)例:框架通過框架調(diào)用應(yīng)用程序類實(shí)例的CreateDocumentL()函數(shù)獲取指向新創(chuàng)建的Document類實(shí)例的指針。通過文檔實(shí)例指針,框架就可以調(diào)用文檔實(shí)例的某些功能,同時(shí)文檔實(shí)例也通過調(diào)用自身的NewL()和NewLC()雙重靜態(tài)構(gòu)造函數(shù)(為什么是雙重構(gòu)造,這跟Symbian的異常處理機(jī)制有關(guān),而之所以設(shè)計(jì)成靜態(tài)函數(shù)我現(xiàn)在也還不是很清楚)來創(chuàng)建自己。
e、是否裝入文件:框架重新調(diào)用AppDllUid()來觀察是否要從文件系統(tǒng)中裝入一個(gè)文件。(似乎這里跟某些永久存儲(chǔ)信息有關(guān),目前項(xiàng)目還沒用到這個(gè)功能,我也不知道這個(gè)該怎么用)
f、 新建AppUi和View實(shí)例:框架通過調(diào)用文檔對(duì)象的CreateAppUiL()方法生成了一個(gè)AppUi實(shí)例并獲取指向它的指針。此處AppUi實(shí)例創(chuàng)建自身時(shí)使用的是C++的默認(rèn)構(gòu)造函數(shù)并返回實(shí)例的指針,之后框架通過這個(gè)指針調(diào)用AppUi實(shí)例的ConstructL()函數(shù)來完成構(gòu)造。而在這個(gè)ConstructL()函數(shù)中首先調(diào)用的是AppUi基類的BaseContructL()函數(shù),處理了讀入與該程序相關(guān)的資源的事宜,其次是新建需要加載的View類的實(shí)例(通過雙重構(gòu)造),如果不止一個(gè)View的情況下需要調(diào)用AddViewL()函數(shù)將新建的View實(shí)例加載進(jìn)來,最后如果是多個(gè)View時(shí)通過SetDefaultViewL()函數(shù)設(shè)置缺省的默認(rèn)視圖。如讀入一個(gè)與該程序相關(guān)的資源文件AppUi調(diào)用了AppView類的NewL函數(shù)來生成其實(shí)例,這里也是用的雙重構(gòu)造
g、 View的重繪:通過以上的創(chuàng)建過程,框架已經(jīng)擁有了View的無限調(diào)度權(quán)利,此時(shí)如果有一般的system事件框架就可以通過窗口服務(wù)器調(diào)用View的Draw()函數(shù),至于這些System事件一般指程序啟動(dòng)、應(yīng)用程序獲得焦點(diǎn)或者選項(xiàng)菜單消失等等。在這里需要注意的是編程開發(fā)者并不能直接調(diào)用Draw,它要求在調(diào)用前系統(tǒng)的graphics context處于激活狀態(tài),如果編程開發(fā)者希望進(jìn)行屏幕的重繪,則只能調(diào)用DrawNow()方法。還有就是Draw函數(shù)是不能異常退出的,這是因?yàn)樵摵瘮?shù)能被框架直接調(diào)用,而框架是不知道如何處理可能發(fā)生的異常的。因此Draw自己需要捕捉和處理可能發(fā)生的錯(cuò)誤。
h、 處理命令:完成以上步驟后,用戶可以通過比如菜單選項(xiàng)之類的交互UI使框架調(diào)用HandleCommandL()函數(shù),并傳遞一個(gè)參數(shù)aCommand,它指明了用戶所選擇的命令,HandleCommandL()會(huì)據(jù)此來判斷不同的命令以分別調(diào)度執(zhí)行。在此處還有一個(gè)必須注意的地方是如果要程序的View實(shí)例也回應(yīng)用戶的按鍵,則必須將View實(shí)例通過AppUi的AddToStackL()函數(shù)加入到AppUi實(shí)例的控件堆棧(control stack)中。具體的調(diào)用方式實(shí)現(xiàn)以按鍵來解釋如下流程所示:
對(duì)于上面的調(diào)用方式實(shí)現(xiàn)說明,個(gè)人覺得有必要再將AppUi的幾個(gè)重要事件處理方法羅列一下:
HandleWsEventL()用于處理窗口服務(wù)器傳遞的事件,它的作用使框架調(diào)用下面這些具體事件處理方法;
HandKeyEvent()用于處理用戶按鍵事件(此函數(shù)在控件堆棧為空時(shí)調(diào)用,否則框架將會(huì)調(diào)用OfferKeyEventL()函數(shù));
HandleForegroundEventL()當(dāng)應(yīng)用程序切換到前臺(tái)或從前臺(tái)切換到后臺(tái)時(shí)調(diào)用該函數(shù),默認(rèn)的實(shí)現(xiàn)可以處理鍵盤焦點(diǎn)的改變;
HandleSystemEventL()用于處理由窗口服務(wù)器生成的事件;
HandleApplicationSpecificEventL()用于處理自己定義的自定義事件。默認(rèn)的實(shí)現(xiàn)可以處理顏色方案改變的通知;
HandleCommandL()用于處理用戶選擇的菜單項(xiàng);
HandleSwitchOnEventL()用于處理像設(shè)備切換之類的特定切換事件;
HandleMessageReadyL()用于處理窗口服務(wù)器產(chǎn)生的消息事件。
在以上各函數(shù)處理事件中,除了第一個(gè)HandleWsEventL()函數(shù)外,其它函數(shù)默認(rèn)都是純虛函數(shù),需要重載才能用。
通過以上對(duì)應(yīng)用程序框架初始化步驟后,一個(gè)完整的框架就創(chuàng)建完畢了,其具體過程可以由一個(gè)圖來形象做結(jié)。
本文中參考了網(wǎng)絡(luò)上的一些文章鏈接如下:
Symbian程序框架研究http://www.sf.org.cn/Article/lumen/200607/18837.html
Symbian開發(fā)初級(jí)手冊(cè)http://www.sf.org.cn/Article/lumen/200508/34.html
posted on 2007-09-21 06:56
frank.sunny 閱讀(3853)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
symbian 開發(fā)