轉貼-Symbian 應用程序框架淺析-http://tech.it168.com/a2009/1224/828/000000828702.shtml

Symbian 應用程序框架淺析

IT168技術】S60應用程序的運行依賴於大量的OS組件,例如屏幕繪圖和應用程序數據持久性等,能夠直接使用OS的窗口服務器或者文件服務器便可。html

應用程序核心框架類編程

應用程序框架由一套核心類組成,這些類是全部應用程序框架的基礎。這些類封裝了應用程序和所需OS服務器之間的相互做用。服務器

應用程序核心框架類 第一層:CBase和CActive兩個基類,其中CActive也是派生於CBase,而CActive又被第二層的CConEnv派生網絡

第二層:包含兩個基本組件:AppArc和CONE。AppArc表明「應用程序架構」,這些類提供了基本的應用程序結構、將系統信息提交到應用程序的機制,以及使用文件服務器持久化數據。其中的類在命名時都帶有前綴「*Apa」。CONE是控制環境的縮寫,在這個組件中的類提供用於處理用戶輸入並建立用戶界面的機制--這些類主要用於和窗口服務器進行交互,其中的類在命名時都帶有前綴「*Coe」。這一層中的許多類都是抽象類,僅僅定義了一個API的接口。架構

第三層:Uikon組件。這是具備豐富功能、非抽象框架類的通常性設備無關實現,而且提供了一個在全部symbian OS上公用的UI庫層。一些具體的UI控件(好比列表框和滾動條等)均可以在該層建立,這些控件有時也被稱爲Eikon控件。UIkon組件中的類在命名時都帶有前綴「*Eik」。添加了一個公共的symbian OS實現,和其餘Symbian OS UI平臺共享。框架

第四層:由Avkon類組成,這些類提供了核心的S60 UI功能,例如菜單支持。Avkon控件的類在命名時都帶有前綴「*Akn」。在框架上添加S60特有的實現。函數

第五層:針對應用程序的層,設計本身的應用程序,添加自定義應用程序實現。spa

以上提到的這些類簡單來講就是:視圖(View)、文檔(Document)、應用程序(Application)、應用程序UI(Application UI)。那麼一個S60 UI應用程序是如何用這些類來實現其有機程序呢,這個就涉及到一個應用程序框架的初始化問題。設計

應用程序框架初始化指針

必須建立下面的每一個方法,才能提供最小的S60應用程序:

a、 框架入口:全部S60 UI都實現一個全局函數E32DLL()(非UI類的全局入口函數爲E32Main),當應用程序啓動時,框架將首先調用該函數,該函數也稱爲DLL入口點,應用程序必須存在該函數。每一個S60 UI 應用程序都是一個多態DLL。

b、新建應用程序實例:讓框架調用NewApplication(),該函數是由DLL導出的惟一函數,負責建立應用程序類的一個實例,並返回它的指針,之後框架使用該指針完成應用程序的建立。這裏在堆上建立應用程序實例使用的是「new」方法而不是Symbian OS常見的「new (ELeave)」方法,這是由於TRAP harness(陷阱捕捉)這時尚未創立。若是系統不能爲新的實例分配內存,那返回的指針就是NULL,應用程序框架可以檢查到並處理這個問題。

c、返回UID:由框架調用AppDllUid()返回應用程序的UID。該函數必須返回在.mmp文件中指定的UID值,該值可用於肯定應用程序的實例是否正在運行。若是一個應用程序正在運行,而要啓動這個程序的另外一個實例,這時該運行的程序就會被切換到前臺,而不是從新生成一個。

d、新建文檔實例:框架經過框架調用應用程序類實例的CreateDocumentL()函數獲取指向新建立的Document類實例的指針。經過文檔實例指針,框架就能夠調用文檔實例的某些功能,同時文檔實例也經過調用自身的NewL()和NewLC()雙重靜態構造函數(爲何是雙重構造,這跟Symbian的異常處理機制有關,而之因此設計成靜態函數我如今也還不是很清楚)來建立本身。

e、是否裝入文件:框架從新調用AppDllUid()來觀察是否要從文件系統中裝入一個文件。(彷佛這裏跟某些永久存儲信息有關,目前項目還沒用到這個功能,我也不知道這個該怎麼用)

f、 新建AppUi和View實例:框架經過調用文檔對象的CreateAppUiL()方法生成了一個AppUi實例並獲取指向它的指針。此處AppUi實例建立自身時使用的是C++的默認構造函數並返回實例的指針,以後框架經過這個指針調用AppUi實例的ConstructL()函數來完成構造。而在這個ConstructL()函數中首先調用的是AppUi基類的BaseContructL()函數,處理了讀入與該程序相關的資源的事宜,其次是新建須要加載的View類的實例(經過雙重構造),若是不止一個View的狀況下須要調用AddViewL()函數將新建的View實例加載進來,最後若是是多個View時經過SetDefaultViewL()函數設置缺省的默認視圖。如讀入一個與該程序相關的資源文件AppUi調用了AppView類的NewL函數來生成其實例,這裏也是用的雙重構造

g、 View的重繪:經過以上的建立過程,框架已經擁有了View的無限調度權利,此時若是有通常的system事件框架就能夠經過窗口服務器調用View的Draw()函數,至於這些System事件通常指程序啓動、應用程序得到焦點或者選項菜單消失等等。在這裏須要注意的是編程開發者並不能直接調用Draw,它要求在調用前系統的graphics context處於激活狀態,若是編程開發者但願進行屏幕的重繪,則只能調用DrawNow()方法。還有就是Draw函數是不能異常退出的,這是由於該函數能被框架直接調用,而框架是不知道如何處理可能發生的異常的。所以Draw本身須要捕捉和處理可能發生的錯誤。

h、 處理命令:完成以上步驟後,用戶能夠經過好比菜單選項之類的交互UI使框架調用HandleCommandL()函數,並傳遞一個參數aCommand,它指明瞭用戶所選擇的命令,HandleCommandL()會據此來判斷不一樣的命令以分別調度執行。在此處還有一個必須注意的地方是若是要程序的View實例也迴應用戶的按鍵,則必須將View實例經過AppUi的AddToStackL()函數加入到AppUi實例的控件堆棧(control stack)中。具體的調用方式實現以按鍵來解釋以下流程所示:

對於上面的調用方式實現說明,我的以爲有必要再將AppUi的幾個重要事件處理方法羅列一下:

HandleWsEventL()用於處理窗口服務器傳遞的事件,它的做用使框架調用下面這些具體事件處理方法;

HandKeyEvent()用於處理用戶按鍵事件(此函數在控件堆棧爲空時調用,不然框架將會調用OfferKeyEventL()函數);

HandleForegroundEventL()當應用程序切換到前臺或從前臺切換到後臺時調用該函數,默認的實現能夠處理鍵盤焦點的改變;

HandleSystemEventL()用於處理由窗口服務器生成的事件;

HandleApplicationSpecificEventL()用於處理本身定義的自定義事件。默認的實現能夠處理顏色方案改變的通知;

HandleCommandL()用於處理用戶選擇的菜單項;

HandleSwitchOnEventL()用於處理像設備切換之類的特定切換事件;

HandleMessageReadyL()用於處理窗口服務器產生的消息事件。

在以上各函數處理事件中,除了第一個HandleWsEventL()函數外,其它函數默認都是純虛函數,須要重載才能用。

經過以上對應用程序框架初始化步驟後,一個完整的框架就建立完畢了,其具體過程能夠由一個圖來形象作結。

本文中參考了網絡上的一些文章連接以下:

Symbian程序框架研究http://www.sf.org.cn/Article/lumen/200607/18837.html

Symbian開發初級手冊http://www.sf.org.cn/Article/lumen/200508/34.html

相關文章
相關標籤/搜索