第一個(gè)Android 程序的源代碼: TxtReader文本閱讀器
剛學(xué)習(xí)Android開(kāi)發(fā)的時(shí)候, 試著開(kāi)發(fā)了一個(gè)閱讀器,非常簡(jiǎn)單,所以易懂, 目前在本人的G1上跑得還是不錯(cuò)的
^-^
貢獻(xiàn)出來(lái)給入門(mén)者參考:
主要問(wèn)題:
1. 如何處理cancel事件
2. ListAdapter的使用
3. 文本編碼.
資源下載地址:
http://download.csdn.net/source/1713476
剛?cè)胧值耐瑢W(xué)可能在導(dǎo)入Android的工程或者某些sample的時(shí)候無(wú)從下手,
因?yàn)閱螁慰縀clipse import project解決不了所有的問(wèn)題。***方案為通過(guò)Eclipse 的向?qū)В?將已經(jīng)存在的代碼工程,
再創(chuàng)建成一個(gè)新的工程, 如圖所示的: create project from existing source選項(xiàng)
為了方便大家入門(mén),今天對(duì)代碼做一下標(biāo)注.
1. Android程序的進(jìn)入點(diǎn)
不要妄圖像學(xué)習(xí)C或者Java的入門(mén)一樣, 有一個(gè)main函數(shù)供你進(jìn)入, Android的應(yīng)用程序運(yùn)行在一個(gè)框架中, 因此main進(jìn)入點(diǎn) 函數(shù)被層層包裹,探尋這個(gè)進(jìn)入點(diǎn)函數(shù),實(shí)在是沒(méi)有多大的價(jià)值(這就跟我們用Visual c++去寫(xiě)MFC程序一樣, 看到的不是main函數(shù), 唯有寂寞...)
Android框架做得比較精妙:
1. 應(yīng)用的各個(gè)功能,都被切割成一個(gè)個(gè)的Activity對(duì)象
2. Activity都在AndroidManifest.xml這個(gè)xml中注冊(cè), 并且規(guī)定那個(gè)Activity是啟動(dòng)Activity
3. Activity 之間是可以通信的
以本文的代碼為例, AndroidManifest.xml是這樣的:
- <application android:icon="@drawable/reader" android:label="@string/app_name">
- <activity android:name=".TxtReader"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <activity android:name=".ListAllFileActivity" android:label="@string/app_name">
- <intent-filter>
- <action android:name="com.ostrichmyself.txtReader.ListAllFileActivity" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- lt;/activity>
- <activity android:name=".ViewFile" android:label="@string/swich_code">
- <intent-filter>
- <action android:name="com.ostrichmyself.txtReader.ViewFile" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- lt;/activity>
- </application>
很好奇,為什么會(huì)有三個(gè)Activity? 大致的思路是這樣的:
1. 進(jìn)入應(yīng)用程序的時(shí)候,需要有一個(gè)Button,選擇一個(gè)目錄
2. 瀏覽目錄
3. 選中文件的瀏覽目錄之后,需要呈現(xiàn)Txt文件的內(nèi)容
可能大家會(huì)覺(jué)得奇怪, 為什么按照這樣的思路去劃分Activity,這樣會(huì)不會(huì)造成管理Activity的困難?
回答這個(gè)疑問(wèn)前, 看看Activity的劃分標(biāo)準(zhǔn)是什么,這里牽涉到界面的知識(shí):
1. 每個(gè)Activity都表征了一種形式的界面, 比如你的應(yīng)用程序中有多少個(gè)不同的界面,就將出現(xiàn)多少個(gè)不同的Activity
2. Activity通過(guò)加載一個(gè)界面文件xml, 來(lái)表征界面的特點(diǎn)
為什么要這么做?
原因是,界面的繪制牽涉到系統(tǒng)資源的調(diào)配,手機(jī)終端不同于PC,手機(jī)系統(tǒng)資源緊缺, 銷毀重繪這樣耗時(shí)費(fèi)勁的工作,不宜重復(fù)進(jìn)行。因此Android中將這些不同的界面綁定到不同的Activity中,當(dāng)手機(jī)由一種風(fēng)格的Activity切換到另外風(fēng)格的Activity時(shí),節(jié)省時(shí)間和系統(tǒng)資源。
程序如何實(shí)現(xiàn)Activity的切換?切換時(shí),如何夾帶信息?
- protected void onListItemClick(ListView l, View v, int position, long id) {
- Intent intent = new Intent(ListAllFileActivity.this, ViewFile.class);
- bundle = new Bundle();
- File file = fileNameList.get(position);
- if (file.isDirectory())
- {
- File[] f = file.listFiles();
- fill(f);
- }
- else {
- bundle.putString(fileNameKey, file.getAbsolutePath());
- intent.putExtras(bundle);
- startActivityForResult(intent, 0);
- }
- }
Intent構(gòu)造下一個(gè)將要出現(xiàn)的Activity, 并夾帶 Bundle(); 然后Activity類中提供了startActivityForResult的方法,讓你啟動(dòng), 夠簡(jiǎn)單吧!
在將要啟動(dòng)的Activity中oncreate方法啟動(dòng),將Bundle的值取出來(lái), 搞定.
整個(gè)流程大致可以這樣描述:
Bundle
Activity被觸發(fā)---------------> 加載Bundle -----> 加載GUI及其Layout(XML或者自己寫(xiě)Layout)
----> 展示GUI----> 觸發(fā)GUI事件 ---> 其他Activity 被觸發(fā)----> 繼續(xù)....
菜單布局等細(xì)節(jié), 實(shí)在沒(méi)什么更多的內(nèi)容。
Android的布局方式很贊,采用了HTML的配置布局方式,非常不錯(cuò), 界面本來(lái)就是配的,而不是代碼寫(xiě)的。 所以J2ee轉(zhuǎn)業(yè)過(guò)來(lái)的同學(xué)們, 這個(gè)難度實(shí)在是太小了。
另外從Eclipse RCP開(kāi)發(fā)過(guò)來(lái)的同學(xué)們, plugin.xml這個(gè)是再熟悉不過(guò)的了, 所以你們轉(zhuǎn)過(guò)來(lái)學(xué)習(xí)Android的布局和配置管理,應(yīng)該也是輕松加愉快了。
后面深入補(bǔ)充下Activity的知識(shí)。 界面這塊,有時(shí)間再探索下。