




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、開(kāi)卷語(yǔ) 俗話說(shuō),“熟讀唐詩(shī)三百首,不會(huì)作詩(shī)也會(huì)吟”。最近收集了很多Android的示例代碼,從這些代碼的閱讀和實(shí)驗(yàn)中學(xué)習(xí)到很多知識(shí),從而產(chǎn)生寫(xiě)這個(gè)系列的打算,目標(biāo)就是一步步跟著實(shí)例進(jìn)行動(dòng)手實(shí)作,真正從“做”中體會(huì)和學(xué)習(xí)Android開(kāi)發(fā)。本文是這個(gè)系列的第一篇,目標(biāo)是Android自帶的一個(gè)范例程序:記事本,將分為四篇文章進(jìn)行詳細(xì)介紹。預(yù)備知識(shí) 搭建開(kāi)發(fā)環(huán)境,嘗試編寫(xiě)”Hello World”,了解Android的基本概念,熟悉Android的API(官方文檔中都
2、有,不贅述)。程序截圖 先來(lái)簡(jiǎn)單了解下程序運(yùn)行的效果程序入口點(diǎn) 類似于win32程序里的WinMain函數(shù),Android自然也有它的程序入口點(diǎn)。它通過(guò)在AndroidManifest.xml文件中配置來(lái)指明,可以看到名為NotesList的activity節(jié)點(diǎn)下有這樣一個(gè)intent-filter,其action為ent.action.MAIN, Category指定為 ent.category.LAUNCHER,這就指明了這個(gè)activity是作為入口activity,系統(tǒng)查找
3、到它后,就會(huì)創(chuàng)建這個(gè)activity實(shí)例來(lái)運(yùn)行,若未發(fā)現(xiàn)就不啟動(dòng)(你可以把MAIN改名字試試)。 <intent-filter> <action android:name="ent.action.MAIN" />
4、60; <category android:name="ent.category.LAUNCHER" /> </intent-filter>NotesList詳解 就從入口點(diǎn)所在的activity(見(jiàn)圖1)開(kāi)始,可以
5、看到這個(gè)activity最重要的功能就是顯示日志列表。這個(gè)程序的日志都存放在Sqlite數(shù)據(jù)庫(kù)中,因此需要讀取出所有的日志記錄并顯示。先來(lái)看兩個(gè)重要的私有數(shù)據(jù),第一個(gè)PROJECTION字段指明了“日志列表“所關(guān)注的數(shù)據(jù)庫(kù)中的字段(即只需要ID和Title就可以了)。 private static final String PROJECTION = new String
6、160; Notes._ID, / 0 Notes.TITLE, / 1 第二個(gè)字段COLUMN_INDEX_TITLE指明title字段在數(shù)據(jù)表中的索引。private static final int COLUMN_INDEX_TITLE =
7、160;1;然后就進(jìn)入第一個(gè)調(diào)用的函數(shù)onCreate。 Intent intent = getIntent(); if (intent.getData() = null)
8、 intent.setData(Notes.CONTENT_URI); 因?yàn)镹otesList這個(gè)activity是系統(tǒng)調(diào)用的,此時(shí)的intent是不帶數(shù)據(jù)和操作類型的,系統(tǒng)只是在其中指明了目標(biāo)組件是Notelist,所以這里把”content:/ vider.NotePad/notes”保存到intent里面,這個(gè)URI地址指明了數(shù)
9、據(jù)庫(kù)中的數(shù)據(jù)表名(參見(jiàn)以后的NotePadProvider類),也就是保存日志的數(shù)據(jù)表notes。 Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null, Notes.DEFAULT_SORT_ORDER); 然后調(diào)用managedQuery函數(shù)查詢出所有的日志信息,這
10、里第一個(gè)參數(shù)就是上面設(shè)置的” content:/ vider.NotePad/notes”這個(gè)URI,即notes數(shù)據(jù)表。PROJECTION 字段指明了結(jié)果中所需要的字段,Notes.DEFAULT_SORT_ORDER 指明了結(jié)果的排序規(guī)則。實(shí)際上managedQuery并沒(méi)有直接去查詢數(shù)據(jù)庫(kù),而是通過(guò)Content Provider來(lái)完成實(shí)際的數(shù)據(jù)庫(kù)操作,這樣就實(shí)現(xiàn)了邏輯層和數(shù)據(jù)庫(kù)層的分離。 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,&
11、#160;R.layout.noteslist_item, cursor, new String Notes.TITLE , new int android.R.id.text1 ); setListAdapte
12、r(adapter); 查詢出日志列表后,構(gòu)造一個(gè)CursorAdapter,并將其作為L(zhǎng)ist View的數(shù)據(jù)源,從而在界面上顯示出日志列表。可以看到,第二個(gè)參數(shù)是,打開(kāi)對(duì)應(yīng)的noteslist_item.xml文件,<TextView xmlns:android=" android:id="android:id/text1" android:layout_width="fil
13、l_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:textAppearance="?android:attr/textAppearanceLarge" android:gravity="center_vertical" android:
14、paddingLeft="5dip" android:singleLine="true"/>就是用來(lái)顯示一條日志記錄的TextView,最后兩個(gè)字段指明了實(shí)際的字段映射關(guān)系,通過(guò)這個(gè)TextView來(lái)顯示一條日志記錄的title字段。處理“選擇日志”事件 既然有了“日志列表”,就自然要考慮如何處理某一條日志的單擊事件,這通過(guò)重載onListItemClick方法來(lái)完成, Override
15、 protected void onListItemClick(ListView l, View v, int position, long id) Uri uri = ContentUris.withAppendedId(getIntent().getData(), id);
16、160; String action = getIntent().getAction(); if (Intent.ACTION_PICK.equals(action) | Intent.ACTION_GET_CONTENT.equals(action)
17、160; / The caller is waiting for us to return a note selected by / the user. The have clicked
18、0;on one, so return it now. setResult(RESULT_OK, new Intent().setData(uri); else &
19、#160; / Launch activity to view/edit the currently selected item startActivity(new Intent(Intent.ACTION_EDIT, uri);
20、; 首先通過(guò)”content:/ vider.NotePad/notes”和日志的id 號(hào)拼接得到選中日志的真正URI,然后創(chuàng)建一個(gè)新的Intent,其操作類型為Intent.ACTION_EDIT,數(shù)據(jù)域指出待編輯的日志URI(這里只分析else塊)。Intent深度剖析那么,上面這句startActivity(new Intent(Intent.ACTION_EDIT, uri)執(zhí)行后會(huì)發(fā)生什么事情呢?這時(shí)候Android系統(tǒng)就跳出來(lái)接管了,它會(huì)根據(jù)intent中的信息找到對(duì)應(yīng)的
21、activity,在這里找到的是NoteEditor這個(gè)activity,然后創(chuàng)建這個(gè)activity的實(shí)例并運(yùn)行。那么,Android又是如何找到NoteEditor這個(gè)對(duì)應(yīng)的activity的呢?這就是intent發(fā)揮作用的時(shí)刻了。new Intent(Intent.ACTION_EDIT, uri)這里的Intent.ACTION_EDIT=” ent.action.EDIT”,另外通過(guò)設(shè)置斷點(diǎn),我們看下這里的uri值: 可以看到選中的日志條目的URI是:。然后我們?cè)賮?lái)看下An
22、droidmanfest.xml,其中有這個(gè)provider<provider android:name="NotePadProvider" android:authorities="vider.NotePad" />
23、0; 發(fā)現(xiàn)沒(méi)有?它也有,這個(gè)是的一部分,同時(shí) <activity android:name="NoteEditor" android:theme="android:style/Theme.Light" a
24、ndroid:label="string/title_note" android:screenOrientation="sensor" android:configChanges="keyboardHidden|orientation"
25、0; > <!- This filter says that we can view or edit the data of
26、 a single note -> <intent-filter android:label="string/resolve_edit">
27、160; <action android:name="ent.action.VIEW" /> <action android:name="ent.action.EDIT" />
28、160; <action android:name="com.android.notepad.action.EDIT_NOTE" /> <category android:name="ent.catego
29、ry.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-
30、filter> <!- This filter says that we can create a new note inside o
31、f a directory of notes. -> <intent-filter> <action android:name="ent.action.
32、INSERT" /> <category android:name="ent.category.DEFAULT" />
33、<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /> </intent-filter> </activity>上面第一個(gè)intent-filter中有一個(gè)action 名為,而前面我們創(chuàng)建的Intent也正好
34、是Intent.ACTION_EDIT=” ent.action.EDIT”,想必大家已經(jīng)明白是怎么回事了吧。下面就進(jìn)入activity選擇機(jī)制了:系統(tǒng)從intent中獲取道uri,得到了content:/vider.NotePad/notes/1,去掉開(kāi)始的content:標(biāo)識(shí),得到vider.NotePad/notes/1,然后獲取前面的,然后就到Androidmanfest.xml中找到authorities為的provider,這個(gè)就是后面要講的contentprovider,然后就加載這個(gè)content p
35、rovider。 <provider android:name="NotePadProvider" android:authorities="vider.NotePad" />在這
36、里是NotePadProvider,然后調(diào)用NotePadProvider的gettype函數(shù),并把上述URI傳給這個(gè)函數(shù),函數(shù)返回URI所對(duì)應(yīng)的類型(這里返回Notes.CONTENT_ITEM_TYPE,代表一條日志記錄,而CONTENT_ITEM_TYPE = " vnd.android.cursor.item/vnd.google.note ")。 Override public String getType(Uri uri)
37、0; switch (sUriMatcher.match(uri) case NOTES: return Notes.CONTENT_TYPE; case
38、160;NOTE_ID: return Notes.CONTENT_ITEM_TYPE; default: throw new IllegalArgumentException("U
39、nknown URI " + uri); 上面的sUriMatcher.match是用來(lái)檢測(cè)uri是否能夠被處理,而sUriMatcher.match(uri)返回值其實(shí)是由決定的。 sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH)
40、; sUriMatcher.addURI(NotePad.AUTHORITY, "notes", NOTES); sUriMatcher.addURI(NotePad.AUTHORITY, "notes/#", NOTE_ID);然后系統(tǒng)使用獲得的" vnd.android.cursor.item/vnd.google.note "和”ent.action.EDIT”到androidmanfest.xml中去找匹配的activity. <intent-filter android:label="string/resolve_edit"&g
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)生詞語(yǔ)教學(xué)課件背景
- 36 選擇性必修1 第七單元 第30講 人體的內(nèi)環(huán)境與穩(wěn)態(tài)
- 尊重國(guó)旗班會(huì)課件
- 02 必修1 第一單元 第2講 細(xì)胞中的無(wú)機(jī)物、糖類和脂質(zhì)
- 畢潔與李陽(yáng)的離婚協(xié)議書(shū)財(cái)產(chǎn)分割及子女共同成長(zhǎng)計(jì)劃
- 采石場(chǎng)礦產(chǎn)資源勘查與承包管理協(xié)議
- 專業(yè)代養(yǎng)托管服務(wù)合同書(shū)
- 抵押貸款合同范本適用于設(shè)備融資
- 產(chǎn)業(yè)園區(qū)配套設(shè)施場(chǎng)地租賃意向書(shū)模板
- 礦山爆破作業(yè)安全責(zé)任協(xié)議書(shū)
- 蒸汽鍋爐的對(duì)比分析
- GB 20664-2006有色金屬礦產(chǎn)品的天然放射性限值
- 醫(yī)學(xué)課件-快速康復(fù)ERAS普外科幻燈教學(xué)課件
- 2023年重慶出版集團(tuán)有限公司招聘筆試模擬試題及答案解析
- 高考英語(yǔ)書(shū)面表達(dá)全國(guó)卷評(píng)分標(biāo)準(zhǔn)
- 建筑電氣設(shè)計(jì)技術(shù)規(guī)程
- 氣體滅火系統(tǒng)驗(yàn)收表1
- 人教版五四制六下地理復(fù)習(xí)提綱詳細(xì)筆記
- 大氣污染控制工程課程設(shè)計(jì)-某廠酸洗硫酸煙霧治理設(shè)施設(shè)計(jì)
- 人教版小學(xué)三年級(jí)下冊(cè)英語(yǔ)復(fù)習(xí)課件(164頁(yè)P(yáng)PT)
- 300MW單元機(jī)組過(guò)熱汽溫控制系統(tǒng)的設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論