




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、開卷語 俗話說,“熟讀唐詩三百首,不會(huì)作詩也會(huì)吟”。最近收集了很多Android的示例代碼,從這些代碼的閱讀和實(shí)驗(yàn)中學(xué)習(xí)到很多知識(shí),從而產(chǎn)生寫這個(gè)系列的打算,目標(biāo)就是一步步跟著實(shí)例進(jìn)行動(dòng)手實(shí)作,真正從“做”中體會(huì)和學(xué)習(xí)Android開發(fā)。本文是這個(gè)系列的第一篇,目標(biāo)是Android自帶的一個(gè)范例程序:記事本,將分為四篇文章進(jìn)行詳細(xì)介紹。預(yù)備知識(shí) 搭建開發(fā)環(huán)境,嘗試編寫”Hello World”,了解Android的基本概念,熟悉Android的API(官方文檔中都
2、有,不贅述)。程序截圖 先來簡單了解下程序運(yùn)行的效果程序入口點(diǎn) 類似于win32程序里的WinMain函數(shù),Android自然也有它的程序入口點(diǎn)。它通過在AndroidManifest.xml文件中配置來指明,可以看到名為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í)例來運(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(見圖1)開始,可以
5、看到這個(gè)activity最重要的功能就是顯示日志列表。這個(gè)程序的日志都存放在Sqlite數(shù)據(jù)庫中,因此需要讀取出所有的日志記錄并顯示。先來看兩個(gè)重要的私有數(shù)據(jù),第一個(gè)PROJECTION字段指明了“日志列表“所關(guān)注的數(shù)據(jù)庫中的字段(即只需要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ù)庫中的數(shù)據(jù)表名(參見以后的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并沒有直接去查詢數(shù)據(jù)庫,而是通過Content Provider來完成實(shí)際的數(shù)據(jù)庫操作,這樣就實(shí)現(xiàn)了邏輯層和數(shù)據(jù)庫層的分離。 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,并將其作為List View的數(shù)據(jù)源,從而在界面上顯示出日志列表??梢钥吹?,第二個(gè)參數(shù)是,打開對(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"/>就是用來顯示一條日志記錄的TextView,最后兩個(gè)字段指明了實(shí)際的字段映射關(guān)系,通過這個(gè)TextView來顯示一條日志記錄的title字段。處理“選擇日志”事件 既然有了“日志列表”,就自然要考慮如何處理某一條日志的單擊事件,這通過重載onListItemClick方法來完成, 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、; 首先通過”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)就跳出來接管了,它會(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”,另外通過設(shè)置斷點(diǎn),我們看下這里的uri值: 可以看到選中的日志條目的URI是:。然后我們?cè)賮砜聪翧n
22、droidmanfest.xml,其中有這個(gè)provider<provider android:name="NotePadProvider" android:authorities="vider.NotePad" />
23、0; 發(fā)現(xiàn)沒有?它也有,這個(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,去掉開始的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是用來檢測(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆甘肅省天水市秦州區(qū)天水一中高一下化學(xué)期末檢測(cè)試題含解析
- 貴州省黔西南州興義市2023-2024學(xué)年四年級(jí)下學(xué)期期末英語試題(含答案)
- (完整版)電氣事故應(yīng)急預(yù)案
- 安全生產(chǎn)月考核
- 企業(yè)內(nèi)網(wǎng)安全管理系統(tǒng)
- 安全生產(chǎn)標(biāo)準(zhǔn)化與職業(yè)健康安全管理體系
- 生產(chǎn)安全事故應(yīng)急責(zé)任制
- 安全生產(chǎn)違章記分標(biāo)準(zhǔn)
- 游戲電商新策略報(bào)告
- 醫(yī)療保健創(chuàng)業(yè)匯報(bào)
- 職業(yè)道德完全題庫附有答案
- 初高中物理銜接講座(初高中物理對(duì)比)
- 施工現(xiàn)場(chǎng)平面布置及臨時(shí)設(shè)施、臨時(shí)道路布置
- 小學(xué)六年級(jí)課后服務(wù):scratch少兒編程 四階第19課:BMI指數(shù)(上)
- 科技人才評(píng)價(jià)規(guī)范
- 《短視頻編輯與制作(第2版)》-第9章
- 醫(yī)院無菌操作知識(shí)培訓(xùn)
- 年產(chǎn)500噸40gL煙嘧磺隆可分散油懸浮劑農(nóng)藥項(xiàng)目環(huán)境影響評(píng)價(jià)報(bào)告表樣本
- 介紹方志敏(修訂版)
- 《操作風(fēng)險(xiǎn)管理》課件
- 醫(yī)師入職測(cè)考試試題答案(臨床)
評(píng)論
0/150
提交評(píng)論