• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            franksunny的個(gè)人技術(shù)空間
            獲得人生中的成功需要的專注與堅(jiān)持不懈多過天才與機(jī)會(huì)。 ——C.W. Wendte

            本文檔我上傳過程中圖片沒有粘貼上來,為此如果有人感興趣,請(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)用程序核心框架類

            第一層:CBaseCActive兩個(gè)基類,其中CActive也是派生于CBase,而CActive又被第二層的CConEnv派生

            第二層:包含兩個(gè)基本組件:AppArcCONEAppArc代表應(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)用程序UIApplication 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 新建AppUiView實(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)用ViewDraw()函數(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í)例通過AppUiAddToStackL()函數(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ā)

            常用鏈接

            留言簿(13)

            隨筆分類

            個(gè)人其它博客

            基礎(chǔ)知識(shí)鏈接

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久天天躁狠狠躁夜夜96流白浆| 国产成人精品三上悠亚久久| 色综合久久88色综合天天| 久久精品国产99国产精品澳门 | 2021国产精品久久精品| 久久婷婷午色综合夜啪| 久久丫精品国产亚洲av不卡| 精品免费久久久久国产一区| 久久久久久久97| 久久精品国产精品国产精品污| 日韩一区二区三区视频久久| 精品久久久久久无码专区不卡| 久久精品国产WWW456C0M| 久久这里只有精品18| 青青青青久久精品国产h久久精品五福影院1421 | 99久久综合狠狠综合久久止| 亚洲日韩欧美一区久久久久我| 99久久99久久| 久久精品人人做人人爽97| 亚洲伊人久久综合影院| 国产亚州精品女人久久久久久 | 无码任你躁久久久久久老妇| 99久久精品影院老鸭窝| 亚洲人成网亚洲欧洲无码久久| 久久无码国产| 成人精品一区二区久久久| 亚洲午夜久久久影院伊人| 麻豆精品久久久久久久99蜜桃| 韩国三级中文字幕hd久久精品| 国内精品伊人久久久久AV影院| 久久天天躁狠狠躁夜夜avapp| 性做久久久久久免费观看| 久久亚洲精品无码播放| 久久av免费天堂小草播放| 日本免费久久久久久久网站| 99久久免费国产精精品| 精品久久久久中文字幕日本| 精品久久久久久亚洲精品 | 久久有码中文字幕| 精品国产婷婷久久久| 久久涩综合|