Symbian 入門
這學(xué)期專業(yè)實(shí)踐要做一個(gè)關(guān)于Symbian S60的手機(jī)軟件,所以我選擇了CarbideV1.2 OEM和S60 SDK 3rd FP1來作為自己的開發(fā)環(huán)境,具體的環(huán)境搭配如下:
1.首先安裝Carbide,選擇OEM版本,至于License的話在網(wǎng)上可以查的出來,大家自己去找,然后會(huì)出現(xiàn)release_notes提示安裝Perl和SDK等.
2.安裝Perl,選擇activeperl 5.6.1的版本安裝,否則會(huì)出現(xiàn)下面的網(wǎng)絡(luò)上面常見的問題:
使用Carbide用向?qū)陆薙ymbian OSC++ Project,選擇3rd Ed. GUI Application模版,根據(jù)步 驟建立了工程,選擇Emulator Debug,編譯時(shí)出現(xiàn)下如問題:
make[1]: *** No rule to make target `\Symbian\9.2\S60_3rd_FP1_2\EPOC32\BUILD\Symbian\carbide\workspace\test\group\TEST\WINSCW\TEST.WINSCW'. Stop. test line 0這樣的問題,如果選擇5.6.1 的話就不會(huì)出現(xiàn)上面的問題。(所以軟件不是最新版本就是最好的阿!).
3.安裝SDK最好在他的默認(rèn)目錄,而且這幾個(gè)都是最好在一起,我選擇的是C盤安裝軟件和操作系統(tǒng),給了35G的大小。D盤存取數(shù)據(jù)。所以這些我都是安裝在他的默認(rèn)目錄下面。Carbide和Perl 安裝在C 盤program files.SDK 就直接安裝在了C盤上面了。這樣的話基本上就差不多了。
4.打開Carbide,要將工作的空間選取在和自己安裝carbide的盤符相同的盤下面。否則的話會(huì)出現(xiàn)下面的錯(cuò)誤:
WARNING: EPOCROOT does not specify an existing directory
BLDMAKE ERROR: Directory "\Symbian\9.2\S60_3rd_FP1\EPOC32\" does not exist
上面的是我在配置Symbian開發(fā)環(huán)境時(shí)候的一點(diǎn)經(jīng)驗(yàn)之談,希望能夠?qū)Υ蠹矣幸恍椭?,也歡迎大家給與指教,給我這個(gè)菜鳥一些幫助,在此先感謝大家了。
PS:我是一個(gè)菜鳥,也是剛開始學(xué)習(xí)Symbian開發(fā)相關(guān),所以對(duì)Symbian開發(fā)不太了解,之所以在這里寫博客是我發(fā)現(xiàn)里面有很多Symbian開發(fā)的高手,所以希望大家能夠給與我一些幫助,在此再次感謝了!!~-~
----------------------------------------------------------------------------------------------------
開發(fā)軟件來編譯程序,編寫程序。即Integrated Development Environment (IDE) ,它包括編輯器,編譯器和連接器。
推薦用Nokia’s Carbide.c++ Express Edition (based on the Eclipse IDE)或者Visual Studio .NET 2003。
需要軟件開發(fā)工具包,即Software Development Kit (SDK),它允許你寫,創(chuàng)建程序?yàn)槟愕氖謾C(jī)。
對(duì)N73,需要S60 2nd Edition FP2version 9.1 introduced a complete break from older versions.
To work on Symbian OS version 9.1 or later, applications must be slightly modified andrecompiled.
不同的Symbian os用戶界面user interface (UI)是不一樣的。因此要選擇正確的SDK。
• S60 3rd Edition Feature Pack 1 - Symbian OS v9.2
• S60 3rd Edition - Symbian OS v9.1
• S60 2nd Edition Feature Pack 3 - Symbian OS v8.1
• S60 2nd Edition Feature Pack 2 - Symbian OS v8.0a
• S60 2nd Edition Feature Pack 1 - Symbian OS v7.0s
enhanced
• S60 2nd Edition - Symbian OS v7.0s
• S60 1st Edition - Symbian OS v6.1
由于我們的os是v9.1的,所以需要S60 3rd Edition。
可以在http://developer.symbian.com/main/tools/sdks/s60/index.jsp上下載
下載IDE CodeWarrior Development Studio for Symbian os 3.1(OEM,Professional and Personal)
下載地址為:http://www.forum.nokia.com/info/sw.nokia.com/id/4d2d8611-c490-4f6e-a931-
ea37ba4f040d/CodeWarrior_Development_Studio_for_Symbian_OS_Personal_Edition_Version_3_1.html
安裝其個(gè)人版,可試用90天。
安裝SDK
驗(yàn)證SDK的安裝
1、用devices命令設(shè)置S60 3rd Edition SDK for Symbian OS for C++ 作為默認(rèn)的設(shè)備
例如:devices -setdefault @S60_3rd:com.nokia.S60
2、到包含helloworldbasic的目錄下 默認(rèn)安裝下為cd C:\Symbian\9.1\S60_3rd\S60Ex\helloworldbasic
3、再進(jìn)到group目錄下,該目錄下包含bld.inf和helloworldbasic.mmp文件
4、驗(yàn)證編程環(huán)境
運(yùn)行—〉輸入cmd—〉輸入epoc—〉出現(xiàn)模擬器則表示安裝成功。
注:參看Getting_Started_final.pdf
-------------------------------------------------------------------------------------------------------------------------
Nokia根據(jù)手機(jī)的屏幕大小和價(jià)格高低把手機(jī)分成了多個(gè)系列,現(xiàn)在使用的系列有:Series 40、Series 60、Series 80 和Series 90。60系列
采用Symbian os 6.1,然后又根據(jù)手機(jī)屏幕的特點(diǎn)對(duì)UI做了一些修改,這個(gè)被修改了的Symbian就被稱為Nokia的60系列平臺(tái)。使用60系列的手
機(jī)型號(hào)包括:Nokia 6670、 Nokia 6630、 Nokia 6260 、Nokia N-Gage QD™ 、Nokia 7610 、Nokia 6620 、Nokia 3620 、Nokia 3660 、
Nokia 6600 、Nokia 3600、Nokia 3650、Nokia 7650、Nokia N-Gage™等。
下面我們就以60系列為例,介紹SDK的安裝過程。
2.1.1 安裝SDK
第一步,到Nokia論壇注冊(cè),下載最新的SDK。Nokia 網(wǎng)站提供的Series 60 SDK for Symbian OS Nokia Edition SDK最新版本是v1.2,Series
60 SDK for Symbian OS的最新版本是v2.1。下載網(wǎng)址:http://www.forum.nokia.com/main/0,6566,034-4,00.html
第二步,到http://www.activestate.com 網(wǎng)站下載最新的Active Perl Script 安裝程序。到http://www.java.com/en/download/manual.jsp
下載最新的J2RE。
第三步:安裝SDK,推薦為Symbian開發(fā)單獨(dú)建一個(gè)目錄,例如d:\Symbian而不是使用C:\program files等這樣的目錄。
第四步:安裝Active Perl和J2RE,安裝到默認(rèn)目錄即可。
第五步:檢查環(huán)境變量設(shè)定。打開系統(tǒng)環(huán)境變量tab,然后看看有沒有EPOCROOT,如果有的話,把它手動(dòng)改成“\” 。改完之后應(yīng)該是這個(gè)樣子
的:
EPOCROOT = \
然后,在系統(tǒng)PATH中加入 \epoc32\tools目錄以及\epoc32\gcc\bin目錄就可以了。
實(shí)際上,Symbian SDK根本不用安裝,直接把epoc32目錄拷貝到一個(gè)機(jī)器上,然后照上述方法設(shè)定目錄和環(huán)境變量就可以了。
2.1.2 配置VC
如果我們使用的是VC 6.0,我們要保證系統(tǒng)至少打了SP3補(bǔ)丁,否則系統(tǒng)會(huì)有警告提示。如果我們使用的是VS.NET2003, 我們就只能安裝Series
60 SDK for Symbian OS v2.1,因?yàn)镾eries 60 SDK for Symbian OS Nokia Edition SDK v1.2在VS.NET2003無法正確建立工程。
如果要直接在vc6里創(chuàng)建新項(xiàng)目,要把\Symbian\6.1\Series60\Series60Tools\ Application Wizard目錄下的 AvkonAppWiz.awx和
AVKONAPPWIZ.HLP文件拷貝到vc6的模板目錄C:\Program Files\ Microsoft Visual Studio\ Common\ MSDev98\ Template下。這樣我們就可以
在VC的新建工程中看到Series 60 AppWizard v 1.9這個(gè)選項(xiàng).
填入Project Name 以后,確認(rèn)。
一路“Next”,一個(gè)最簡單的Symbian應(yīng)用程序就建立好了。
如果要將已經(jīng)建立好的工程導(dǎo)入到VC6.0中,比如我們將SDK中的例子HelloWorld轉(zhuǎn)換成一個(gè)VC6的項(xiàng)目,我們首先進(jìn)入\Symbian\6.1\Series60
\Series60Ex\HelloWorld目錄。在這里我們可以看到,在Symbian中,一個(gè)Project通常是按inc, src, group等目錄組織,group目錄里通常放
的是項(xiàng)目文件,所以編譯時(shí)要先到這里。用命令提示符模式進(jìn)入剛才說的那個(gè)目錄下,然后執(zhí)行:
bldmake bldfiles
這個(gè)命令會(huì)在group目錄下生成一個(gè)abld.bat的批處理文件,并且會(huì)在\Symbian \6.1\Series60\Epoc32\BUILD下生成\Symbian\6.1\Series60
\Epoc32\BUILD\SYMBIAN\6.1\ SERIES60\SERIES60EX\HELLOWORLD\GROUP這個(gè)目錄,并在最底層目錄下生成一堆 .make文件。
然后,我們?cè)谕粋€(gè)目錄運(yùn)行剛才生成的abld.bat:
abld makefile vc6
這樣就會(huì)自動(dòng)生成vc6的dsw文件,位置在\Symbian\6.1\Series60\Epoc32\BUILD\ SYMBIAN\6.1\ SERIES60
\SERIES60EX\HELLOWORLD\GROUP\HELLOWORLD\WINS。然后我們就可以在VC6種打開這個(gè)Symbian工程了。
2.2 編譯
我們可以直接使用SDK提供的工具編譯Symbian 工程,也可以使用VC6提供的集成環(huán)境來編譯轉(zhuǎn)化過的Symbian 工程。編譯的結(jié)果存放在
\Symbian\6.1\Series60\Epoc32\ Release\wins\UDEB\Z\SYSTEM\apps目錄中。
2.2.1使用SDK提供的工具編譯Symbian 工程
我們?cè)谏弦还?jié)的那個(gè)位置繼續(xù)輸入:
abld build wins udeb
這個(gè)命令會(huì)編譯我們的程序,最后在\Symbian\6.1\Series60\Epoc32\Release\wins\UDEB目錄下生成我們的helloworld,然后我們可以從開始
菜單里運(yùn)行模擬器的debug版,在模擬其中就可以運(yùn)行helloworld了。
2.2.2 使用VC6編譯Symbian 工程
我們直接打開運(yùn)行abld makefile vc6后生成的dsw文件,VC自動(dòng)裝載轉(zhuǎn)化過的工程。按F7便可以直接編譯工程,編譯結(jié)果同樣放在
\Symbian\6.1\Series60\Epoc32\Release\ wins\UDEB目錄中。然后我們打開模擬器debug 版,就可以看到我們編譯好的工程了。
2.3 打包
我們以SDK 1.2提供的HelloWorld為例,制作可以在手機(jī)中安裝的.SIS文件:
2.3.1.檢查程序
首先,在命令行格式下,進(jìn)入HelloWorld工程mmp文件所在目錄,輸入bldmake bldfiles和abld build wins udeb,然后打開模擬器,檢測程序
有無錯(cuò)誤。
2.3.2.編譯工程
在程序無錯(cuò)誤后,在命令行輸入abld build armi urel 。執(zhí)行這個(gè)命令之后會(huì)在目錄d:\symbian\6.1\series60\epoc32\release\armi\urel生
成HELLOWORLD.APP和HELLOWORLD.RSC兩個(gè)文件。
2.3.3.建立.pkg文件
在d:\Symbian\6.1\Series60\Series60Ex\helloworld\sis 用記事本建立或者修改工程的pkg文件,內(nèi)容如下:
; HelloWorld.pkg
;
;Language - standard language definitions
&EN
; standard SIS file header
#{"HelloWorld"},(0x10005B91),1,0,0
;Supports Series 60 v 1.2
(0x101F8202), 0, 0, 0, {"Series60ProductID"}
;
"d:\symbian\6.1\series60\epoc32\release\armi\urel\HelloWorld.APP"-"!:\system\apps\HelloWorld\HelloWorld.app"
"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"-"!:\system\apps\HelloWorld\HELLOWORLD.rSC"
其中,前面"d:\symbian\6.1\series60\epoc32\release\armi\urel\HELLOWORLD.rSC"是要打包安裝的文
件,"!:\system\apps\HelloWorld\HELLOWORLD.rSC"是安裝的目標(biāo)位置。在其中要注意的是,我們?cè)谀繕?biāo)位置中用“!”代替了實(shí)際的盤符。
這樣做得好處是在用戶安裝的時(shí)候,手機(jī)系統(tǒng)會(huì)提示用戶選擇要安裝的位置,這就給了用戶更大的靈活度。另外,在Symbian 系統(tǒng)中,安裝的
應(yīng)用程序默認(rèn)位置是“!:\system\apps ”。
編輯好pkg文件后,保存至相應(yīng)目錄。
2.3.4.打包程序
在命令行中,轉(zhuǎn)至pkg文件所在目錄,運(yùn)行命令makesis HelloWorld.pkg。之后我們就在同一目錄下得到了打包好的.sis文件。
2.4 手機(jī)測試
將打包好地.sis文件上傳至手機(jī)中,然后在手機(jī)的應(yīng)用程序管理器中就可以看到我們打包好的文件。選擇“安裝”命令,系統(tǒng)會(huì)提示用戶要安
裝的位置,選擇安裝位置后,我們制作的應(yīng)用程序就安裝到手機(jī)中了。
我們回到手機(jī)的主菜單,就會(huì)發(fā)現(xiàn)新安裝的HelloWorld 應(yīng)用程序。打開運(yùn)行,結(jié)果和在模擬器中看到的基本是一樣的。
---------------------------------------------------------------------------------------------------------------------
第一篇:Symbian UI 程序框架
Symbian UI 程序的框架基本上是統(tǒng)一的。大家只要學(xué)習(xí)一種簡單的框架就可以進(jìn)行大部分的Symbian開發(fā)了。我這里先介紹一個(gè)概念。
1.1 MVC 架構(gòu)
Symbian 基本上使用MVC架構(gòu)來搭建控件。Symbian UI程序設(shè)計(jì)主要講究的也是如何使用控件。而No kia沒有做好的一個(gè)方面就是有關(guān)UI
Control的幫助太少了。SDK提供的幫助里面根本就沒有資源文件的寫法。這一張里面我會(huì)介紹一些控件例如Dialog,Text Listbox等等資源文
件的寫法。同時(shí)也會(huì)告訴大家應(yīng)該到SDK的哪里才能找到這些資源的描述。
但是首先,我先介紹一下MVC架構(gòu)。MVC并不是個(gè)新東西。他是Model - View - Control的縮寫。在以前smalltalk中就已經(jīng)開始用了。其主要的
想法是在構(gòu)造類的時(shí)候把顯示,控制以及模型分開。Symbian對(duì)其作了小的改動(dòng)。在Nokia提供的Series 90控件組(就是CKON,以后我再提CKON
的時(shí)候大家要知道指得是S90的控件)中Model主要用來存儲(chǔ)數(shù)據(jù),以及封裝對(duì)數(shù)據(jù)的操作。也就是對(duì)于對(duì)象實(shí)體的操作。View當(dāng)然是負(fù)責(zé)顯示
。Control被抽象成一個(gè)或多個(gè)純虛類(Mixin)其它對(duì)象通過重寫虛函數(shù)來得到對(duì)象內(nèi)部的狀態(tài)以及控制對(duì)象。Series 90的Text Listbox類
CEikTextListBox很好的說明了這個(gè)構(gòu)架。比如你可以調(diào)用CEikTestListBox中的Model()函數(shù)得到一個(gè)Model的指針,然后你就可以訪問其中的
CDesArrayFlat數(shù)組了。
1.2 Symbian的工程文件
1.2.1工程引導(dǎo)文件bld.inf
這個(gè)東東其實(shí)就是一個(gè)腳本,它告訴Build環(huán)境在做Build之前需要準(zhǔn)備或知道一些什么東西。最普通的
一種寫法是:
PRJ_MMPFILES
project.mmp
這是告訴Build環(huán)境:你馬上要處理的工程文件名字叫project.mmp。大家如果做比較復(fù)雜的程序可能需要同時(shí)Build所有的庫,那么就在這里把
你所有需要Build的工程都列出來:
PRJ_MMPFILES
project.mmp
project_lib1.mmp
project_lib2.mmp
另外的一個(gè)常用的標(biāo)記是PRJ_PLATFORMS這個(gè)東東告訴編譯環(huán)境,以下的這些平臺(tái)(Targets)是需要編譯的。你可以在這個(gè)標(biāo)記的下一行列出
需要的平臺(tái)例如:
PRJ_PLATFORMS
WINS ARMI WINSCW
或者直接用
PRJ_PLATFORMS
DEFAULT
注意,如果你不作PRJ_PLATFORMS這個(gè)標(biāo)記其效果等于PRJ_PLATFORMS DEFAULT,所以這個(gè)不是必須
的。
第三個(gè)常用標(biāo)記是PRJ_EXPORTS這個(gè)東西告訴編譯環(huán)境在編譯之前需要把哪些文件先拷貝到指定位置。我舉個(gè)簡單的例子大家就知道什么意思了
。比如你的工程中需要include一個(gè)第三方的*.inl的文件,那么如果編譯之 前這個(gè)文件不存在就會(huì)編譯不過。你可以這么寫:
PRJ_EXPORTS
.\nk_set.inl \epoc32\include
那么在你編譯的時(shí)候,一個(gè)Perl腳本會(huì)先把你工程目錄下的nk_set.inl文件拷貝到\epoc32\include目錄下,然后再 編譯工程。
大多數(shù)工程只要用這三個(gè)標(biāo)記就可以了。還有一點(diǎn)小技巧這個(gè)bld.inf文件中是可以寫#if #else 等等東西的。
比如:
#if defined(WINS)
..... 注意沒有{}
#else
.....
#endif
---------------------------------------------------------------------------------------------------------------------
Avkon Series60 extensions and modifications to Symbian's Uikon and other parts of the Symbian OS Application Framework
Symbian中的應(yīng)用程序通常分為兩個(gè)部分,engine和UI,如此的劃分增加了可維護(hù)性和靈活性,engine就好象是程序的核心,它主要處理運(yùn)算和
數(shù)據(jù),而UI(應(yīng)該是User Interface)主要處理數(shù)據(jù)的顯示和所有行為(操作行為應(yīng)該是)。
engine不談,它是程序起作用的靈魂,這個(gè)是因程序而異的,我們來看應(yīng)用程序外觀,它可以分為三種體系結(jié)構(gòu):
一、傳統(tǒng)的symbianOS控制體系結(jié)構(gòu)
二、基于對(duì)話框的體系結(jié)構(gòu)
三、視圖體系結(jié)構(gòu)
看看好象跟MFC搞的似的,也有個(gè)View和Dialog,不過也是Symbian就是用C++寫的,面向?qū)ο筇匦苑浅:谩?/p>
運(yùn)用什么樣的界面取決于程序和界面布局的需要,就不多說了。只是不管你使用哪種,都是從一個(gè)基類繼承而來的,就好象是CView一樣。
[傳統(tǒng)SymbianOS應(yīng)用程序的體系結(jié)構(gòu)]
傳 統(tǒng)意義上,SymbianOS應(yīng)用程序是在CCoeControl類的基礎(chǔ)上派生出我們自己的view controls,這些都存放在應(yīng)用程序的 control stack中
,也就是我們應(yīng)用程序的視圖。這些controls會(huì)根據(jù)應(yīng)用程序的需要來創(chuàng)建釋放或顯示隱藏,以產(chǎn)生相應(yīng)的操作。
[Dialog體系結(jié)構(gòu)]
如果主體應(yīng)用是對(duì)話框,那我們更應(yīng)該使用這樣的體系結(jié)構(gòu),使用dialogs的好處是我們光可以靠改變r(jià)esource文件來修改內(nèi)容和布局,而不需
要重新編譯那c++代碼。
注意,如果不小心規(guī)劃,那嵌套的對(duì)話框?qū)⒑娜ゴ罅康亩褩?臻g。
另外,如果dialog體系結(jié)構(gòu)被用于主要視圖,那建議講其設(shè)計(jì)為非模態(tài)對(duì)話框。(它不壟斷用戶的輸入,用戶打開非模態(tài)對(duì)話框后,仍然可以與
其它界面進(jìn)行交互。)如果你要生成一個(gè)主界面對(duì)話框,要求是滿屏,并提供多頁設(shè)計(jì),那應(yīng)該包括如下features:
RESOURCE DIALOG r_dlgapp_main_dialog
{
flags = EEikDialogFlagNoDrag | EEikDialogFlagNoTitleBar |
EEikDialogFlagFillAppClientRect |
EEikDialogFlagCbaButtons | EEikDialogFlagModelss;
buttons = r_dlgapp_softkeys_options_home;
pages = r_dlgapp_main_pages;
}
如果要?jiǎng)?chuàng)建一個(gè)對(duì)話框應(yīng)該如下:
void CDlgappAppUi::ConstructL()
{
BaseConstructL();
iAppView = new(ELeave) CDlgAppMainView;
iAppView->ExecuteLD(R_DLGAPP_MAIN_DIALOG);
AddToStackL(iAppView);
}
ExecuteLD()在調(diào)用后立即返回,并且對(duì)話框必須要加到control stack中——使用AddToStack函數(shù),因?yàn)榉悄B(tài)對(duì)話框不會(huì)自己處理這些。
[View體系結(jié)構(gòu)]
使用view的應(yīng)用程序每次只能有一個(gè)活動(dòng)的view,當(dāng)另一個(gè)view要激活時(shí),當(dāng)前的view就要被釋放。當(dāng)一個(gè)view被釋放后,所以的菜單,對(duì)話
框以及包含的應(yīng)用都將被關(guān)閉。
每 個(gè)view都被當(dāng)作一個(gè)應(yīng)用UI對(duì)待,它必須提供一個(gè)Id()函數(shù)以便為系統(tǒng)所標(biāo)識(shí),它也要重載DoActivateL(),DoDeactivate
(),HandleForegroundEventL(),HandlCommandL()和HandleStatusPaneSizeChange() 函數(shù)以處理各種事件。
下面一個(gè)個(gè)的看
DoActivateL()
當(dāng)客戶端要求你的view激活時(shí),它就要被調(diào)用。 client可能發(fā)送消息參數(shù)給你的view,如果你的view已經(jīng)是激活了,那只有當(dāng)client明確要求
再次激活時(shí)才被調(diào)用,所以你的 DoActivateL()實(shí)現(xiàn)得應(yīng)付這種情況,ie已經(jīng)激活了view。如果你不打算顯示view或者你的view不想處理任何
消息,那一個(gè)簡單的檢查 和return即可。
DoDeactive()
這個(gè)函數(shù)當(dāng)你的view被注銷時(shí)調(diào)用,view被注銷時(shí)通常有兩種情況:一是你的應(yīng)用程序要退出了,二是相同程序里另一個(gè)view要被激活。這個(gè)
函數(shù)很重要,咱們可不能忘記了:)
HandleForegroundEventL()
這 個(gè)函數(shù)主要是在你的view被激活時(shí)調(diào)用(即在DoActivateL()和DoDeactivate()之間被調(diào)用)。當(dāng)你的view在前臺(tái)時(shí),它將是
HanleForegroundEvent(ETrue),當(dāng)你的view移出前臺(tái)時(shí),它將為HandleForegroundEvent (EFalse),只有當(dāng)前臺(tái)狀態(tài)確實(shí)改變時(shí)這個(gè)函數(shù)才會(huì)
被調(diào)用。
HandleCommandL()
當(dāng)view菜單產(chǎn)生一個(gè)命令后本函數(shù)將被調(diào)用。
HandleStatusPaneSizeChange()
當(dāng)client的尺寸由于status pane而改變時(shí),本函數(shù)被調(diào)用了就。
下面是一個(gè)view在接受事件的典型調(diào)用順序
1.DoActivateL()
2.HandleForegroundEventL(ETrue)
3.HandleForegroundEventL(EFalse)
4.DoDeactivate()
其中一對(duì)HandleForegrounEventL在view被激活的過程中會(huì)發(fā)生多次調(diào)用。
而DoActivateL()在DoDeactivate()被調(diào)用前可能會(huì)被多次調(diào)用。
View Resources
如果你要使用view來顯示pages,那唯一的途徑是創(chuàng)建出自己的AVKON_VIEW資源,里面有自己的CBA和菜單,把這個(gè)資源的id傳遞給view的
BaseContructL()函數(shù)即可。
RESOURCE AVKON_VIEW r_viewapp_view1
{
hotkeys = r_viewapp_hotkeys;
menubar = r_viewapp_view1_menubar;
cba = R_AVKON_SOFTKEYS_OPTIONS_BACK;
}
注意如果沒有給定的menubar資源,那就會(huì)使用確省的系統(tǒng)menubar
Construction
下面這個(gè)例程是用的AppUI object's ConstructL來構(gòu)造出view的,使用了AddView來登記,最后把第一個(gè)創(chuàng)建的view做為缺省的view了:
void CMyViewArchAppUi::ConstructL()
{
BaseConstructL();
CMyViewArchAppView1* view1 = new(ELeave) CMyViewArchAppView1;
CleanupStack::PushL(view1);
view1->ConstructL();
AddViewL(view1); //Add view1 to CAknAppUi; transfers ownership
CleanupStack::Pop();
CMyViewArchAppView2* view2 = new(ELeave) CMyViewArchAppView2;
AddViewL(View2); // transfer ownership to CAknAppUi
CleanupStack::Pop();
CMyViewArchAppView3* view3 = new(ELeave) CMyViewArchAppView3;
AddViewL(View2); // transfer ownership to CAknAppUi
CleanupStack::Pop();
SetDefaultViewL(*view1);
.......(more code)
要讓view發(fā)揮作用(注意,一個(gè)view自身是沒有繪圖能力的),它必須擁有得到一個(gè)從CCoeControl派生的containers,譬如
class CMyViewArchAppView1Container: public CCoeControl, MCoeControlObserver
下面這個(gè)例程將展現(xiàn)編程者自己的CAknView派生類
class CMyViewArchAppView1: public CAknVIew
{
.....
private:
CMyViewArchAppView1Container* iVIew;
}
大家可以看出App里產(chǎn)生了View,View類中有我們必須的Container.
當(dāng)前激活的view在HandleCommandL()處理命令,這些是自定義功能鍵和菜單所生成的命令。
void CMyAppView1::HandleCommandL(TInt aCommand)
{
switch (aCommand)
{
case EMyAppCmdSwitchView:
AppUi()->ActivateLocalViewL(KView2Id);
break;
case EAknSoftKeyOk:
{
......
break;
}
case EAknSoftKeyBack:
{
((MEikCommandObserver*)AppUi())->ProcessCommandL(EEikCmdExit);
break;
}
default:
AppUi()->HandleCommandL(aCommand);
break;
}
}
Local View Switching
如果你要切換view,你得提供view的UID
//Now switch the view to view2
iAvkonViewAppUi->ActivateLocalViewL(TUid::Uid(2));
事實(shí)上,每個(gè)view都有自己的菜單系統(tǒng),如果你要使用它,應(yīng)當(dāng)在AVKON_VIEW資源結(jié)構(gòu)中設(shè)置,前面已經(jīng)講過了。
而且不管怎么說,如果要使用系統(tǒng)菜單,它的內(nèi)容在切換之前是一定要更新一次的。
//Switch to a new menu system for the new view
iEikonEnv->AppUiFactory()->MenuBar()->SetMenuTitleResourceId(R_MY_VIEW_ARCH_APP_VIEW2_MENU);
//Now swtich the view to view2
如果要進(jìn)行遠(yuǎn)程的視圖切換,那就要調(diào)用CCoeAppUi::ActivateViewL()函數(shù),并傳遞了一個(gè)包含目標(biāo)應(yīng)用程序UID和目標(biāo)視圖UID的TVwsViewId
Leave recovery
Avkon 視圖體系結(jié)構(gòu)在DoActivateL()退出時(shí)會(huì)有個(gè)自動(dòng)的回復(fù)機(jī)制。系統(tǒng)會(huì)調(diào)用DoDeactivate()在當(dāng)前view離去時(shí),回復(fù)前一個(gè) view,并把
用戶帶到之前他們所在的地方。如果程序并沒有前一個(gè)view的存在,那它就會(huì)退出,如果程序前個(gè)view就是當(dāng)前的view(也就是說他們 是重激
活的),則應(yīng)用程序會(huì)試圖恢復(fù)缺省的view.
說了這么多,那我們?cè)谑裁辞闆r下采用合適的體系結(jié)構(gòu)那?下面的內(nèi)容將會(huì)有所幫助。
使用傳統(tǒng)的SymbianOS體系結(jié)構(gòu),你要花費(fèi)大量的時(shí)間研究代碼是怎么工作的,但大部分交互和錯(cuò)誤處理的引擎代碼都是現(xiàn)成,可以降低你的開
發(fā)難度。
Do you have an acyclic graph shaped navigation structure?
如果你視圖程序中的navigation能夠as an acyclic gragh,那最好使用dialog體系結(jié)構(gòu)。
Are all the application screens dialog like?
如果你的應(yīng)用程序想使用對(duì)話框,那建議你使用dialog體系結(jié)構(gòu),注意如果要有一個(gè)選擇列表,那最好寫成包含在dialog中的選擇列表。
Does the application have multiple views or modes, which deal with different sorts of data at the top level?
如果是這樣,那最好使用傳統(tǒng)或view體系結(jié)構(gòu)。
Do external applications need to switch to different views of your application?
如果是采用view體系結(jié)構(gòu)寫的程序,那它一定支持多個(gè)不同的view,而且是外部程序能訪問的。如果你從頭開始寫一個(gè)應(yīng)用程序,那建議你使
用view體系結(jié)構(gòu),
否則給我看看有沒有現(xiàn)成的代碼可利用,不要一味的傻寫呵呵。注意,如果一個(gè)外部程序使用的顯示頁面是你的程序所提供的,那你應(yīng)該在DLL
中處理這個(gè)顯示頁,這個(gè)DLL應(yīng)該是外部程序所能訪問的。
Can all of the applications views be exited without loosing user data?
使用view體系的程序必須有能力處理因外部程序而引起的views的釋放。如果程序不能自動(dòng)的釋放這些view,那就要考慮其他兩種體系了,要么
使用view體系as a message passing system,要么讓app UI在傳統(tǒng)體系中管理view。
Do external applications need complex interactions with the data in your app?
如果外部程序和你的程序有大量的數(shù)據(jù)交互,那你最好選擇client/server系統(tǒng)。它將減小view的使用量。大量現(xiàn)有的復(fù)雜應(yīng)用,如短信,web
以及通訊錄都使用這樣的機(jī)制,這是個(gè)很好的構(gòu)想,總比要重寫他們要好:)
Is there only a single complex main view in the app?
如果是這種情況,那還是使用傳統(tǒng)的體系。
<一些例子>
這里給出一些假象例子的解決方案。
App launcher
這種程序可以單獨(dú)運(yùn)行并且能切換到其他程序,它只有一個(gè)view ,并且不接受外部程序的訪問,如果這樣會(huì)中斷它。這樣的程序不需要消息的
傳遞或外部程序需要的views.
Fast swap window
一個(gè)在運(yùn)行時(shí)刻的彈出窗口,這是一個(gè)睡眠的彈出對(duì)話框其實(shí),它沒有狀態(tài)。
Email app
電 子郵件程序可以讀或?qū)戨娮余]件。這個(gè)程序有外部使用views,內(nèi)部可切換的views,并能做中斷操作。Notifier信息能告知程序顯示一個(gè)新
的信 息給用戶,所以該程序要有處理此請(qǐng)求的機(jī)制,即使在做其他事情時(shí)。編輯框可以做為其他程序的view顯示,使用DLL形式,我們就可以
做到外部程序的調(diào)用 自如。SymbianOS的messaging程序就是一個(gè)client/server機(jī)制可以在其他程序中被調(diào)用。當(dāng)然要實(shí)現(xiàn)內(nèi)嵌在外部程序中
有許多工 作要做的。當(dāng)你在寫郵件時(shí),很可能又收到新郵件的同志,這個(gè)時(shí)候新郵件是做為一個(gè)嵌套的對(duì)話框似的組件顯示在里面的,注意,
做這個(gè)工作時(shí)要特別依賴 inter-application interaction model。
Contacts app
通訊錄程序允許進(jìn)行通訊錄的顯示、編輯和選擇。選擇后的結(jié)果可以做為其他程序所用。注意它不能因外部view的切換而中斷。
通過一個(gè)外部程序可訪問的dll,通訊錄就可以被外部程序所訪問。程序本身并不需要views,所以最好使用傳統(tǒng)的體系結(jié)構(gòu)編寫,而用dialog
應(yīng)付所有的編輯窗口。
web browser
web瀏覽器可以做為單一的web上網(wǎng)工具,也可以內(nèi)嵌在其他的文檔中。web瀏覽器可以通過外部程序可以訪問的dll來提供一個(gè)UI control,但
并不給外部提供可用的全屏應(yīng)用。它必須能夠應(yīng)付外界的訪問,譬如說應(yīng)付在點(diǎn)擊mail連接后撰寫電子郵件的過程。
主體程序主要是用傳統(tǒng)的體系結(jié)構(gòu),也可以采用view體系來應(yīng)付訪問頁面的需求。
Settings
我們要關(guān)心的是全局設(shè)置和特定應(yīng)用程序的設(shè)置。他們不是一回事情。經(jīng)管他們可能共享一個(gè)庫,實(shí)際上他們互不相干。
設(shè)置程序并不需要為外部的訪問做什么處理提供什么界面,因此他的編寫很簡單,用傳統(tǒng)的或者基于dialog的體系都可以。而局部設(shè)置要注意
必須小心對(duì)待外部可能出現(xiàn)的中斷,并且他有可能做為一個(gè)模態(tài)dialog而處理。
Telephony app
電話號(hào)碼簿程序并不提供外部view,但他必須要處理外部資源的請(qǐng)求。有時(shí)候直接用傳統(tǒng)的體系去寫即可,大部分的外部交互可以通過ETEL
Server.
[應(yīng)用程序的啟動(dòng)]
從CEikApplication派生的類CAknApplication,他有幾個(gè)必須重載的函數(shù):
PreDocContructL()
OpenIniFileLC(RFs& aFs)
PreDocConstructL,主要是處理已經(jīng)構(gòu)造好的應(yīng)用程序?qū)嶓w是否正確準(zhǔn)備好了。如果已經(jīng)準(zhǔn)備好了,那應(yīng)用程序可以切換到實(shí)體上。注意,這
個(gè)函數(shù)只檢查非內(nèi)嵌程序。
通常,ini文件并不被series60所支持,如果要處理,那就要強(qiáng)制性的調(diào)用CEikApplication::OpenIniFileC
[BASE CLASSES]
CAknDocument
這個(gè)類是做為應(yīng)用程序文檔的基類準(zhǔn)備的。用這個(gè)函數(shù)訪問文檔可以不用初始化。這個(gè)是訪問Avkon應(yīng)用程序的比較好的途徑。
CAknAppUi
所有的Avkon應(yīng)用程序必須從這個(gè)類派生。
這個(gè)類支持下面幾個(gè)特定應(yīng)用函數(shù):
KeySound support
Accessories for CBA and StatusPane
TextResolver-Avkon-specific error reporting from CAknAppUI::HandleError()
Avkon view architectrue integration
Control dumping - Debug feature
CAknViewAppUi
所有的視圖結(jié)構(gòu)必須由此派生。
《S60_Platform_Application_Framework_Handbook_V20_en.pdf》,其中有些翻譯不甚恰當(dāng),不過基本上表達(dá)了原版的意思。
------------------------------------------------------------------------------------------------------------------
1、開發(fā)文檔不是很齊全,雖然每個(gè)api都能找到說明,但基本上只是很簡單的介紹。
實(shí)現(xiàn)某個(gè)功能根據(jù)sdk中的文檔,基本上不可能完成。必須尋找相應(yīng)的demo和其他的源代碼來參考。
2、中文資料很少,基本都是英文,對(duì)于國內(nèi)的開發(fā)人員來說,這又是一道坎。
3、必須注意內(nèi)存的操作。比如PushL 和 Pop等等,一些Symbian中特有的機(jī)制需要熟練掌握。
4、多線程支持不是很好,多線程中啟動(dòng)的函數(shù)必須為靜態(tài)的或者全局的,
就這點(diǎn)就給一些需要多線城支持的solution帶來了很多不便或者根本不能實(shí)現(xiàn)。
5、掌握了整個(gè)Symbian的framework的基本原理之后,整個(gè)機(jī)制還是比較明了清晰的。重要的地方是AppUI和View和Container這三個(gè)類。
6、www.newlc.com是一個(gè)不錯(cuò)的技術(shù)網(wǎng)站。強(qiáng)力推薦。
7、一般www.forum.nokia.com上都會(huì)有相關(guān)的例子demo可以下載,只是比較淺顯。
8、注意rss文件中資源的定義和程序中ui控件的結(jié)合,很容易出錯(cuò)無法發(fā)現(xiàn)。
9、mmp文件的修改之后,必須要重新生成項(xiàng)目文件,不然會(huì)導(dǎo)致link 2001之類的錯(cuò)誤。
-----------------------------------------------------------------------------------------------------------------
在symbian中,用RThread來操作線程,一個(gè)RThread對(duì)象代表一個(gè)線程的句柄。常用RThead對(duì)象來創(chuàng)建或操作其他線程。 RThread的基類是
RHandleBase類,該類封裝了句柄的行為。RThread,RProcess,RMutex和RSession-Base都繼承自RHandleBase。
創(chuàng)建一個(gè)線程
/* Name of the new thread */
_LIT(KThreadName, "MyFirstThread");
/* 下面的函數(shù)是線程將要執(zhí)行的。 參數(shù)parm是要傳遞給線程的數(shù)據(jù),它的類型為TAny*,相當(dāng)標(biāo)準(zhǔn)C中的void* 指針 */
TInt CThreadExampleAppUi::ThreadEntryPoint(TAny* param){ TInt* para = static_cast(param); *para = 1; return 1;}
/* 創(chuàng)建一個(gè)屬于當(dāng)前進(jìn)程的線程,并打開句柄. */
TInt res = iThread.Create(KThreadName, ThreadEntryPoint, KDefaultStackSize, NULL, &iVariable);
/* 線程被創(chuàng)建以后進(jìn)入等待狀態(tài),并不能立即執(zhí)行. 如果要線程執(zhí)行,需要調(diào)用它的Resume方法*/
iThread.Resume();
停止、刪除一個(gè)運(yùn)行的線程??梢哉{(diào)用 Suspend() 來停止一個(gè)線程. 但它仍然存在,可以調(diào)用 Resume()來繼續(xù).如果要徹底刪除一個(gè)線程,
可調(diào)用Kill或Terminate。如果進(jìn)程的主線程被刪除,那么程序也會(huì)被終止。
---------------------------------------------------------------------------------------------------------------------
在symbian os上運(yùn)行的四種軟件
應(yīng)用程序
服務(wù)
引擎
內(nèi)核
symbian系統(tǒng)使用活動(dòng)對(duì)象與客戶-服務(wù)器對(duì)事件處理系統(tǒng)進(jìn)行了優(yōu)化
硬件資源:
一個(gè)cpu,32位arm
一個(gè)rom(只讀存儲(chǔ)器),里面有操作系統(tǒng)與內(nèi)建的中間件和應(yīng)用程序
ROM盤被映射到z:盤,所有的文件都可以通過Z:盤訪問。
系統(tǒng)RAM.系統(tǒng)RAM用于兩個(gè)方面,一是被當(dāng)前活動(dòng)的程序和系統(tǒng)核心使用,另一個(gè)是當(dāng)成”C”盤的磁盤空間。這兩個(gè)部分的大小是變化的,不可
以保留某個(gè)的大小。由于RAM通常只有8MB到16MB,所以內(nèi)存可能用完,因此經(jīng)常出現(xiàn)內(nèi)存越界錯(cuò)誤或是(寫文件時(shí))磁盤已滿錯(cuò)誤
IO設(shè)備,包括帶數(shù)字筆輸入的觸摸屏,鍵盤,記憶卡(被當(dāng)成D盤),rs232串口,紅外口,藍(lán)牙。
電源,包括電池與外接電源
symbian os與pc系統(tǒng)的區(qū)別如下:
資源限制:cpu太慢與太少內(nèi)存
沒有硬盤,不能使用寫到硬盤的虛擬內(nèi)存,不能保證有足夠的空間保存程序或是數(shù)據(jù)文件
電源條件嚴(yán)格.
symbian軟件環(huán)境如下:
server | server| Application| Application | Application Dll
| | +————–+————- boundary
| | | |
| | | Enghine | Engine
——–+———+————+————–+————– Privilege
boundary
Kernel
kernel工作在高級(jí)別,管理機(jī)器所有硬件資源。對(duì)其它軟件模塊提供訪問這些硬件資源的接口
其它應(yīng)用程序工作在用戶模式
上面如果理解普通操作系統(tǒng)如linux的話,那跟普通操作系統(tǒng)沒有區(qū)別
應(yīng)用程序是一個(gè)有用戶界面的程序,在獨(dú)立的進(jìn)程中運(yùn)行
這與普通操作系統(tǒng)也沒有區(qū)別
服務(wù)是沒有用戶界面的程序.服務(wù)管理一個(gè)或多個(gè)資源,并提供api,讓客戶可以訪問它的服務(wù).服務(wù)的客戶可以是一個(gè)程序或是其它服務(wù).每個(gè)服
務(wù)也運(yùn)行在獨(dú)立的進(jìn)程空間中。
在symbian中,使用服務(wù)的形式提供類似其它操作系統(tǒng)上用驅(qū)動(dòng)程序或是內(nèi)核程序提供的功能。如文件系統(tǒng)的訪問也是客戶/服務(wù)類型的。(微內(nèi)
核 )
引擎是一個(gè)應(yīng)用程序中操作數(shù)據(jù)而不是與用戶交互的部分.通常你可以把一個(gè)程序分成引擎部分和一個(gè)GUI部分,多部symbian內(nèi)帶的程序都是這
樣做的。
一個(gè)應(yīng)用程序引擎可以是一個(gè)獨(dú)立的代碼模塊或是一個(gè)獨(dú)立的dll,或是幾個(gè)dll.
引擎和應(yīng)用程序間的邊界是模塊或dll的邊界。
所以在symbian中有四個(gè)組件類型與三個(gè)邊界類型。dll或是模塊組件對(duì)交叉引用來說很方便。它們使系統(tǒng)模塊化與保持封裝。
權(quán)限邊界對(duì)交叉引用比較費(fèi)資源,但是保證系統(tǒng)對(duì)用戶太程序隱藏內(nèi)核與設(shè)備
進(jìn)程邊界是所有的交叉中最昂貴的,它們保證在ram中分開每個(gè)程序
可執(zhí)行文件的格式
在symbian中有兩種類型的可執(zhí)行文件:
exe,每個(gè)程序都有一個(gè)主入口E32main()(看上面的例子),它在獨(dú)立的進(jìn)程中運(yùn)行
dll,提供多個(gè)入口,由系統(tǒng)或是已存在的線程(進(jìn)程)調(diào)用
有兩種類型的dll,
共享庫dll,為一個(gè)或多個(gè)程序提供固定的api,這些dll多數(shù)后綴是.dll,當(dāng)程序啟動(dòng)時(shí)就被讀到內(nèi)存中。
多態(tài)dll,這些dll實(shí)現(xiàn)抽象的api,如一個(gè)打印機(jī)驅(qū)動(dòng),socket協(xié)議或是一個(gè)應(yīng)用程序。它們的擴(kuò)展名多不是.dll,而是.prn或.prt或.app等。它
們從與dll相關(guān)的類繼承,并通常只有在程序需要它們時(shí)才讀入。
從技術(shù)上看起來與普通系統(tǒng)上動(dòng)態(tài)庫的靜態(tài)載入與動(dòng)態(tài)載入沒有區(qū)別
但是從功能上看就不一樣了,一種是實(shí)現(xiàn)某種特殊功能的,從某個(gè)相關(guān)類繼承的dll,另一個(gè)是普通dll
代碼執(zhí)行
如果程序代碼在rom上,則直接執(zhí)行,不然需要讀到ram中(與普通操作系統(tǒng)不同,普通操作系統(tǒng)都需要讀到ram中
不能直接在硬盤上執(zhí)行)
可執(zhí)行代碼包括三種類型的二進(jìn)制數(shù)據(jù):
程序代碼
只讀靜態(tài)數(shù)據(jù)
可寫靜態(tài)數(shù)據(jù)
在symbian中對(duì)待.exe與.dll是不同的
由于.exe是不可共享的,如果它在ram中執(zhí)行,那與普通pc系統(tǒng)沒有區(qū)別,如果在ram中執(zhí)行,那它在ram中為可寫靜態(tài)數(shù)據(jù)分配內(nèi)存
而.dll是共享的,當(dāng)dll首次讀入內(nèi)存中時(shí),它被分配到一個(gè)特殊的地址,第二個(gè)線程需要這個(gè)dll時(shí)它只要訪問已經(jīng)存在的這份copy就可以。
在所有使用它的進(jìn)程中dll的地址都是相同的。symbian系統(tǒng)維護(hù)一個(gè)引用計(jì)數(shù),當(dāng)沒有其它線程引用時(shí)才將它unload.
在rom上的dll像rom上的exe一樣直接在rom上執(zhí)行
為了對(duì)dll的大小進(jìn)行優(yōu)化,symbbian進(jìn)行如下操作;
多數(shù)系統(tǒng)支持通過名字與通過數(shù)字訪問dll提供的入口,由于名字太長,浪費(fèi)空間,所以symbian只提供通過數(shù)字訪問,當(dāng)然在link時(shí)可以通過
名字link.也就是說在.dll中沒有名字訪問辦法,在.lib(引導(dǎo)庫,引導(dǎo)linker正確的link這個(gè)dll,這個(gè)是在windows中使用的概念,在win下每
創(chuàng)建一個(gè)dll都會(huì)創(chuàng)建一個(gè)用戶引導(dǎo)鏈接的同名.lib)中有,你的程序link時(shí)link的是.lib,link完成后編譯器會(huì)自動(dòng)把引用dll的代碼變成數(shù)字引
用
如果dll被讀到ram,那重定位信息(把dll
load到什么地址)也必須包含在可執(zhí)行文件格式中,這個(gè)的影響就是你不能把一個(gè)在rom中執(zhí)行的程序放到ram中執(zhí)行的程序.(rom中執(zhí)行的多是
oem廠家,所以普通開發(fā)者多不用關(guān)心)
多數(shù)應(yīng)用程序有自己有exe來創(chuàng)建進(jìn)程,其它的程序使用動(dòng)態(tài)庫(DL)L的形式,在主服務(wù)線程中調(diào)用自己的線程
多數(shù)gui程序都是多態(tài)(polymorphic)dll,有一個(gè)主入口點(diǎn)NewApplication(),這個(gè)入口點(diǎn)創(chuàng)建并返回一個(gè)繼承自CEikAppication的對(duì)象.這樣的
程序被apprun.exe調(diào)用,app文件名為參數(shù)傳入。
電源管理
電源必須高效使用
在系統(tǒng)已經(jīng)關(guān)機(jī)時(shí),確定程序仍然可以運(yùn)行。如鬧鈐,關(guān)機(jī)后,到時(shí)時(shí)仍然可以開機(jī)
電源突然關(guān)掉時(shí),關(guān)鍵數(shù)據(jù)應(yīng)該可以保存
設(shè)備驅(qū)動(dòng)
雖然一般不會(huì)了解它,但是理解一下還是很有用的
設(shè)備驅(qū)動(dòng)工作在兩個(gè)級(jí)別
第一個(gè)是中斷服務(wù)程序(ISR),ISR必須很短,并且不能做很多事情,因?yàn)樗赡茉谌魏螘r(shí)間出現(xiàn),甚至在內(nèi)核服務(wù)中。通常它只是通知設(shè)備產(chǎn)
生了中斷并設(shè)置一個(gè)標(biāo)志,要求內(nèi)核為第二階段的處理運(yùn)行一個(gè)延遲的函數(shù)調(diào)用(delayed function call DFC)
在方便的時(shí)候內(nèi)核調(diào)度DFC.DFC可以使用多數(shù)的核心api,通常只是工作了后向用戶線程通知io操作已經(jīng)完成
定時(shí)器
` 內(nèi)核支持真機(jī)上64hz的時(shí)鐘與模擬器上10hz的時(shí)鐘
時(shí)鐘中斷是最高優(yōu)先級(jí)中斷,它可以通過User::After或是RTime::After訪問。時(shí)鐘中斷在關(guān)機(jī)時(shí)停止,所以如果你請(qǐng)求5s后的定時(shí)操作,然后
跑2s,關(guān)機(jī),再開機(jī)時(shí)它也要等3s
內(nèi)核同時(shí)支持日期/時(shí)間時(shí)鐘,你可以使用User::At或是RTime::At。這個(gè)定時(shí)器很準(zhǔn)確。在關(guān)機(jī)時(shí),如果時(shí)間到了,那它會(huì)開機(jī),這對(duì)鬧鐘很
合適。
內(nèi)存
symbian使用內(nèi)存管理單元(memory management unit MMU)管理內(nèi)存
ROM被映射到z:盤,被映射到一個(gè)固定的地址。
物理RAM被MMU分在4k的頁,每個(gè)物理頁可以用于:
用戶進(jìn)程的虛地址空間。
內(nèi)核服務(wù)的虛地址空間
ram盤,盤符是c:,ram盤只可通過文件服務(wù)進(jìn)程訪問
如果dll不在rom中,那它被讀到ram,dll被讀到ram里面后頁面標(biāo)記為只讀只讀的。
MMU的頁面轉(zhuǎn)換表.如果想理解的話學(xué)習(xí)一下操作系統(tǒng)原理
自由頁表
每個(gè)進(jìn)程的地址空間可以分成下面三類:
系統(tǒng)范圍的內(nèi)存,如系統(tǒng)的rom或是讀到ram中的dll
進(jìn)程范圍的內(nèi)存,如進(jìn)程的.exe映象和它的可寫的靜態(tài)數(shù)據(jù)
每個(gè)線程的內(nèi)存,包括線程的棧與線程默認(rèn)的堆(使用線程默認(rèn)堆的原因只是為了提高內(nèi)存分配與釋放的速度,從開發(fā)角度來看,它與系統(tǒng)里面
的內(nèi)存沒有區(qū)別)。
注意沒有交換文件,所以所有的內(nèi)存都是直接使用。同時(shí),也可能會(huì)發(fā)生內(nèi)存不夠或是磁盤(c 已滿錯(cuò)誤
每個(gè)線程的默認(rèn)棧很小,只有12k,所以在symbian開發(fā)中,不要放太多東西到棧中,一般對(duì)象都是在堆中分配的。
線程創(chuàng)建后,它的棧大小就不可再改變。
線程可以使用new或是User::Alloc從線程默認(rèn)堆中分配內(nèi)存.如果希望從其它堆中分配內(nèi)存,只能使用new
動(dòng)態(tài)庫(DLL)
symbian中dll不支持可寫的靜態(tài)數(shù)據(jù),所以你在里面不可能使用可寫的全局變量或是靜態(tài)變量.
為什么不支持呢?如果支持,那每個(gè)進(jìn)程調(diào)用這個(gè)dll時(shí),都需要為這個(gè)進(jìn)程分配一個(gè)獨(dú)立的堆,而堆最小單位是4k,系統(tǒng)中有很多堆,并且有很
多程序,所以內(nèi)存消費(fèi)基金是很大的。所以就不支持了
這樣開發(fā)時(shí)不是很不方便?因?yàn)樵赿ll中有時(shí)需要保存自己的狀態(tài),進(jìn)行交互
為了解決這個(gè)問題,symbian中引入了線程本地?cái)?shù)據(jù)(thread-local storage
TLS)概念(查看Dll::Tls
Dll;;SetTls)。但是調(diào)用TLS性能比較慢.tls的最大大小是1.8k 通常這夠用了。
文件:
c: flash ram盤
z: rom盤
d: 記憶棒之類的外掛盤
事件處理
事件處理模型如下圖:
keyborad |—————————
|interrupt
|
kernel/driver–+-isr/dfc
|
key event
|
|
window serv—–handle key event———–+update window
| |
|key event draw |request
application +—————– handle ———-+
key event
在symbian中使用活動(dòng)對(duì)象(active object)來處理事件
在symbian os中,所有的symbian
os線程都是事件處理器,每個(gè)線程有一個(gè)活動(dòng)調(diào)度對(duì)象,加上一個(gè)或多個(gè)活動(dòng)對(duì)象來處理從設(shè)備或其它程序發(fā)過來的事件。
每個(gè)活動(dòng)對(duì)象都有一個(gè)虛擬的成員函數(shù)RunL(),在這個(gè)函數(shù)里面處理事件。
多任務(wù)與搶占式
symbian os實(shí)現(xiàn)搶占式多線程。
活動(dòng)對(duì)象用于在單個(gè)線程內(nèi)實(shí)現(xiàn)非搶占式多任務(wù)
--------------------------------------------------------------------------------------------------------------------
SymbianOS6.X Series60界面的智能手機(jī)基本手機(jī)構(gòu)造..
SymbianOS6.X Series60界面的智能手機(jī),在插入MMC之后,系統(tǒng)一般存在4個(gè)邏輯存儲(chǔ)驅(qū)動(dòng)器:C(手機(jī)本身的用戶存儲(chǔ),SX1有4M),D(虛擬
盤,使用空閑運(yùn)行內(nèi)存虛擬的緩沖盤),E(MMC),Z(手機(jī)的系統(tǒng)ROM只讀)。
4個(gè)盤之中,C E Z盤的文件結(jié)構(gòu)大同小異。而D驅(qū)動(dòng)器是高速的虛擬驅(qū)動(dòng)器,主要用來保存剪貼板、wap緩存、和一些臨時(shí)交換文件,一般情
況下,由系統(tǒng)自動(dòng)調(diào)用,與用戶聯(lián)系不多,不作詳細(xì)介紹。下面我具體的將C E Z三個(gè)驅(qū)動(dòng)器的目錄結(jié)構(gòu)和功能講解一下。 隨著安裝軟件的增
多,C和E盤的目錄文件會(huì)變得紛繁復(fù)雜,我們拋開一些軟件自動(dòng)生成的次要的文件和目錄抓住系統(tǒng)的結(jié)構(gòu)談一些主要的東西:
E盤根目錄下:IMAGES SOUNDS VIDEOS目錄,顧名思義就是保存了圖片鈴聲視頻剪輯,這3個(gè)目錄等效的出現(xiàn)在C和Z的Nokia目錄下,也就是
說把相應(yīng)類型的文件拷貝到對(duì)應(yīng)的目錄都可以被系統(tǒng)識(shí)別(Z盤只讀除外),舉例說明:midi文件或者wav文件拷貝在E:\sounds\digital\或者
C:\nokia\sounds\digital\就可以像Z:\Nokia\Sounds\digital\中固化的音樂文件一樣,出現(xiàn)在情景模式鈴聲的選擇項(xiàng)目中。
C:\Nokia是個(gè)無關(guān)緊要的目錄,你完全可以刪掉它而沒有影響,但是這個(gè)目錄會(huì)經(jīng)常自動(dòng)生成。原因是,C盤的Nokia目錄中有特別的目錄:
INSTALL,很顯然這個(gè)是為了安裝軟件而設(shè)置的。眾所周知,Symbian系統(tǒng)的軟件是打成SIS壓縮包傳入手機(jī)的某個(gè)存儲(chǔ)器中(C、E)然后解包安
裝的,系統(tǒng)往往在C:\NOKIA\INSTALL目錄下保存一個(gè)安裝副本,以備安裝時(shí)遇到不可預(yù)見的錯(cuò)誤(如突然沒電)或者用戶中斷時(shí)能夠恢復(fù)系統(tǒng)
安全,這也就是很多情況下,在空余很大空間的E盤安裝軟件時(shí),仍然出現(xiàn)“存儲(chǔ)空間已滿”的原因,保持C盤有1M以上的空余空間是個(gè)很好的
習(xí)慣。另外不使用系統(tǒng)的manager轉(zhuǎn)而使用SeleQ進(jìn)行SIS安裝也可以避免產(chǎn)生這個(gè)副本。
下面以分析一下結(jié)構(gòu)最為復(fù)雜的系統(tǒng)核心C:\system目錄。System目錄由十幾個(gè)目錄和若干文件組成:
※APPS目錄:該目錄下的子目錄保存了軟件的主體即:用戶交互可執(zhí)行文件.app、 資源文件.rsc、 圖標(biāo)文件.aif 、無界面可執(zhí)行程
序.exe以及運(yùn)行所需的其他文件。安裝在E盤的軟件除了在E:\System\Apps\目錄下保存軟件主體之外,往往會(huì)在C:\System\Apps\同名目錄下創(chuàng)
建一些配置文件。值得注意的是C:\System\apps\phone\oplogo保存了營運(yùn)商的標(biāo)志,如果該目錄保存了97*25的bmp圖像,則在待機(jī)狀態(tài)下將以
該圖片代替“中國移動(dòng)”之類的營運(yùn)商標(biāo)志(需要重新啟動(dòng)手機(jī));
※BootData目錄:系統(tǒng)的啟動(dòng)參數(shù)和日志;
※Data目錄:極其繁雜的目錄,保存了各種各樣的數(shù)據(jù),簡單介紹幾個(gè),backgroundimage.mbm壁紙,btstate.dat藍(lán)牙配對(duì)信息,
Calender日歷,clockapp.dat時(shí)間參數(shù),Contacts.cdb聯(lián)系人,以及很多軟件的配置文件和wap信息;
※favourites目錄:收藏夾;
※install目錄:保存了全部的軟件安裝信息,每安裝一個(gè)軟件,就在該目錄下保存一個(gè)同名sis文件索引,大小在幾百b到幾K不等,假如
刪除這個(gè)sis文件,在程序管理中就不會(huì)出現(xiàn)這個(gè)軟件的安裝信息,也就無法通過程序管理刪除,但是仍然可以在apps目錄中直接刪除軟件主體
和配置文件,有必要的話在libs目錄中刪除相應(yīng)運(yùn)行庫,在programs目錄中刪除相應(yīng)輔助運(yùn)行文件,從而徹底卸載軟件;
※libs目錄:保存某些軟件運(yùn)行時(shí)需要的連接庫文件,一般由軟件安裝;
※mail目錄:信息目錄,結(jié)構(gòu)復(fù)雜費(fèi)解,除了一些短信、彩信、EMail設(shè)置文件之外,收件箱、發(fā)件箱、草稿箱、發(fā)送報(bào)告、附件等等分布
在叢深復(fù)雜的目錄之中。值得一提的是,S60的信息概念比較廣,短信彩信Email甚至紅外藍(lán)牙傳輸?shù)奈募紝儆?ldquo;信息”,因此接受到的紅外
藍(lán)牙的文件,保存在mail目錄下,而且可以由查看該信息觸發(fā)相應(yīng)的“安裝”、“觀看”、“編輯”等動(dòng)作;
※MIDIets目錄:java配置文件;
※midp目錄:java程序主體安裝在這里,如果全部java安裝在E盤,C:\system\將不會(huì)出現(xiàn)這個(gè)目錄;
※Programs目錄:保存輔助運(yùn)行文件,和一些無界面程序exe、動(dòng)態(tài)連接庫dll;
※Recogs目錄:關(guān)聯(lián)目錄,里面的mdl文件標(biāo)識(shí)了文件關(guān)聯(lián)。如QuickWord.mdl標(biāo)識(shí)了系統(tǒng)中的doc文件默認(rèn)由quickword打開,另外有些mdl
文件會(huì)驅(qū)動(dòng)程序運(yùn)行,如eLoader.mdl驅(qū)動(dòng)了miniGPS、ExtendProfile等ePsint公司開發(fā)的軟件,沒有這個(gè)mdl文件,以上兩個(gè)軟件不能自動(dòng)加
載;
※Schedules目錄:顧名思義,保存了日程安排;
※SharedData目錄:全部是軟件的配置文件.ini,對(duì)用戶作用不大,但是可以通過修改其中的某些數(shù)值和路徑從而使必須安裝在C盤的軟件
(多半是7650的軟件,它沒有mmc)安裝到mmc;
※Temp目錄:臨時(shí)文件。
E:\system目錄結(jié)構(gòu)與C:\system基本一致,不同的是,少了intsall目錄。
Z:\system比之C:\system更加龐大復(fù)雜,它保存了系統(tǒng)的全部自帶程序、資源文件、硬件驅(qū)動(dòng)、字體字庫、國際化設(shè)置和初始參數(shù)設(shè)置。
在待機(jī)狀態(tài)下輸入*#7370#,將初始化手機(jī),基本過程就是清空C盤,復(fù)制Z盤某些內(nèi)容至C。某種程度上說Z是系統(tǒng)的初始備份。(新手機(jī)的第
一幅待機(jī)圖就保存在Z:\system\data\apac.mbm)
關(guān)于路徑問題。由于三個(gè)盤的system目錄結(jié)構(gòu)是相似的,所以同名路徑所起到的作用相同,比如E:\system\recogs目錄下的關(guān)聯(lián)文件同樣
可以起到關(guān)聯(lián)作用,libs等目錄類同(有些情況下將C的內(nèi)容移動(dòng)到E相應(yīng)路徑中,需要在C:\system\SharedData\對(duì)相應(yīng)的ini文件進(jìn)行修改)
,而在E(C):\system\下建立Fonts目錄則可以加入新的系統(tǒng)字體。只有install目錄僅僅在C:\system\下才有效。
了解S60系統(tǒng)的文件結(jié)構(gòu),對(duì)于我們使用手機(jī)有著很大幫助,可以最大限度的獲取運(yùn)行空間、了解錯(cuò)誤產(chǎn)生的原因,有意識(shí)的避免可能會(huì)帶
來傷害的操作。本文僅僅對(duì)文件結(jié)構(gòu)做了初步的探討和應(yīng)用層面上的解釋,進(jìn)一步的研究可以在西門子和諾基亞論壇的官方文檔得到全面解答
。希望有所幫助。
---------------------------------------------------------------------------------------------------------
數(shù)據(jù)類型 描述
TInt8, TUint8 8位 整數(shù)
TInt16, TUint16 16位 整數(shù)
TInt32, TUint32 32位 整數(shù)
TInt, TUint (32位)整數(shù)
TReal32,TReal64 實(shí)數(shù)
TText8, TText16 字符, 相當(dāng)于 unsigned char, unsigned short int
TBool 布爾
TAny 相當(dāng)于void
代碼規(guī)范
Symbian OS 使用很多代碼規(guī)范, 使用他們可以增強(qiáng)Symbain 代碼的可讀性, 有些規(guī)范甚至是需要嚴(yán)格遵守的, 比如類的命名:
Symbian OS的類一共有6種: 種類 例子 描述
T classes TDesC, TPoint 這個(gè)類可以向基本類型一樣使用,因?yàn)樗麄兺ǔ:苄?,而且不使用heap所以也沒有析構(gòu)函數(shù)
C classes CConsoleBase, CActive 這個(gè)類是Symbian使用最多的類,C代表他們從CBase類繼承而來, 他們必須有析構(gòu)函數(shù)因?yàn)樗麄兊膶?duì)象創(chuàng)
建在heap中
R classes RFile, RTimer R代表資源(Resource),它們只是一個(gè)系統(tǒng)資源的句柄,他們本身被創(chuàng)建在Stack上, 但是他們所使用的資源被創(chuàng)
建在heap上,使用完畢需要Close()
M classes MEikMenuObserver 這個(gè)類是一個(gè)空的接口,使用的時(shí)候需要從它繼承
static classes User, Math 這個(gè)類只有靜態(tài)函數(shù), 一般都是庫函數(shù)
Structs SEikControlInfo c - struct
變量命名:
種類 例子 描述
枚舉 EMonday,ETuesday E代表枚舉
定量 KMaxFileName K代表定量
成員變量 iDevice, iX i代表成員變量
參數(shù) aDevice, aX a代表參數(shù)
局部變量 device, x 局部變量沒有固定的規(guī)范
-------------------------------------------------------------------------------------------------------
對(duì)Symbian一無所知,當(dāng)然只能從基礎(chǔ)學(xué)起了,也許看一個(gè)例子再來看看基礎(chǔ)更簡單些。而我這人比較守舊,就是學(xué)不會(huì)這種方法,還只能從基
礎(chǔ)開始。
Symbian的字符串和描述符:
TPtrC、TBufC、HBufC 是從TDesC派生而來的具體的描述符類型。TPtr和TBuf這兩個(gè)都是從TDes派生來,而TDes又是從TDesC派生而來。因此
TDes在TDesC上加了一些常量便利函數(shù)。
TDesC
/ | \
/ TBufCBase TDes
TPtrC
| | \
TBufC、HBufC Tptr TBuf
TDesC和TDes是抽象類。
_LIT它把一個(gè)符號(hào)和一個(gè)文字值聯(lián)合起來,并且產(chǎn)生TlitC,TlitC的二進(jìn)制形式與TBuf的二進(jìn)制形式是一樣的,因此可以把TLitC作為TDesC類
來代替。_LIT(he,"he"); const TDesc& hehe = he;
_L產(chǎn)生一個(gè)TPtrC,并且不用制定名稱也可以用。 const TDesC& he = _L("he");
_L與_LIT的區(qū)別就在于,_L需要開辟臨時(shí)的棧區(qū)。