安卓學(xué)習(xí)心得體會(huì)(多篇范文)_第1頁(yè)
安卓學(xué)習(xí)心得體會(huì)(多篇范文)_第2頁(yè)
安卓學(xué)習(xí)心得體會(huì)(多篇范文)_第3頁(yè)
安卓學(xué)習(xí)心得體會(huì)(多篇范文)_第4頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、安卓學(xué)習(xí)心得體會(huì)android 學(xué)習(xí)心得-093380117計(jì)算機(jī)應(yīng)用( 1)張峰1.關(guān)于 activity1. 在一個(gè) activity 中使用多個(gè) view如果把 activity 看作 mvc 中的 control?它負(fù)責(zé)管理ui 和接受事件(包括用戶的輸入),雖然說(shuō)一個(gè)activity 通常對(duì)應(yīng)一個(gè)屏幕,但事實(shí)上,我們是可以只用一個(gè)activity 管理多個(gè)不同的view 來(lái)實(shí)現(xiàn)簡(jiǎn)單的邏輯。首先,我們?cè)黾右粋€(gè)新的資源描述layout/second.xml。除了一個(gè)“hello中國(guó)”以外,增加一個(gè)按鈕可以返回前一個(gè)界面。然后,在代碼中我們要為hellotwo 增加兩個(gè)方法, setvie

2、wonemand和 setviewtwomand,分別處理一下在不同界面時(shí),從資源里加載組件并為組件綁定一個(gè)事件處理器最后,我們需要在 oncreate的時(shí)候,也就是啟動(dòng)后的 main 界面上設(shè)置一下按鈕事件處理器。2. 還是回到正道上,多個(gè) activity 之間的跳轉(zhuǎn)android 中提供一個(gè)叫 intent 的類來(lái)實(shí)現(xiàn)屏幕之間的跳轉(zhuǎn),按文檔的說(shuō)法,似乎他們也建議采用這種方法,intent 的用法比較復(fù)雜,現(xiàn)在我先看看它最簡(jiǎn)單的用法。這里的跳轉(zhuǎn)功能用intent 來(lái)操作,它的最簡(jiǎn)單用法就是用函數(shù)setclass()設(shè)置跳轉(zhuǎn)前后兩個(gè)activity 類的實(shí)例,然后調(diào)用activity 自己的

3、第1頁(yè)共25頁(yè)startactivity(intent)即可。最后一句finish()表示將當(dāng)前 activity 關(guān)掉(如果不關(guān)掉會(huì)如何?你可以自己試一下看效果,事實(shí)上有時(shí)我們是不需要關(guān)掉當(dāng)前 activity 的)。然后,我們同樣弄一個(gè)activity 類 hellothreeb,代碼與前面的差不多,只是將 setclass的兩個(gè)參數(shù)反一下,這樣就可以簡(jiǎn)單地實(shí)現(xiàn)在兩個(gè)activity 界面中來(lái)回切換的功能了。2.關(guān)于 intent 的使用intent 分為兩大類,顯性的( explicit )和隱性的( implicit)。一般來(lái)說(shuō), intent 要定位事件的目的地,無(wú)外乎需要以下幾個(gè)信

4、息:1.種類( category),比如我們常見(jiàn)的launcher_category就是表示這是一類應(yīng)用程序。2.類型( type),在前面的例子中沒(méi)用過(guò),表示數(shù)據(jù)的類型,這是隱性 intent 定位目標(biāo)的重要依據(jù)。3.組件( ponent),前面的例子中用的是setclass,不過(guò)也可以用setponent來(lái)設(shè)置 intent 跳轉(zhuǎn)的前后兩個(gè)類實(shí)例。4.附加數(shù)據(jù)( extras),在 contenturi 之外還可以附加一些信息,它是 bundle 類型的對(duì)象。其實(shí),如果是在一個(gè)應(yīng)用內(nèi)部,這種隱性的 intent 實(shí)在有點(diǎn)別扭,個(gè)人覺(jué)得,這種松藕合的實(shí)現(xiàn)方法,只適用于那些較大的系統(tǒng)或者多個(gè)不

5、同的應(yīng)用之間的調(diào)用,可手機(jī)上又有什么“較大”的系統(tǒng)呢?無(wú)非是可以與不同來(lái)源的多個(gè)應(yīng)用之間方便地互操作而已,那么第2頁(yè)共25頁(yè)會(huì)是什么樣的場(chǎng)景呢?比如,給qq 好友發(fā)送 gmail 郵件,用 googlemap查找 qq 好友所在的位置?看上去挺不錯(cuò)的。關(guān)于這個(gè) contentprovider,其實(shí)還有話說(shuō),它主要是的那些看似數(shù)據(jù)庫(kù)操作的方法我們都沒(méi)真正去實(shí)現(xiàn)呢。不過(guò)今天就到這里了,等下回再去研究吧。3.關(guān)于 listactivity準(zhǔn)備一個(gè) list 對(duì)象并借助 adapter就可以構(gòu)造出一個(gè)列表。重載onlistitemclick 方法可以響應(yīng)選擇事件,利用第一個(gè)參數(shù)可以訪問(wèn)到這個(gè)listv

6、iew 實(shí)例以得到選中的條目信息。這里有一點(diǎn)要說(shuō)明的,就是如果更簡(jiǎn)單的話,其實(shí)連那個(gè)setcontentview都可以不要了, android 也會(huì)自動(dòng)幫我們構(gòu)造出一個(gè)全屏的列表。但是本例中我們需要一個(gè)textview 來(lái)顯示選中的條目,所以我們需要一個(gè)layout.mainb描述一下這個(gè)列表窗口。這里需要注意的是那個(gè)listview 的 id,是系統(tǒng)自定義的android:list,不是我們隨便取的,否則系統(tǒng)會(huì)說(shuō)找不到它想要的listview了。然后,在這個(gè) listview 之外,我們又增加了一個(gè) textview,用來(lái)顯示選中的條目。再來(lái)說(shuō)說(shuō)這里用到的 arrayadapter,它的構(gòu)造

7、函數(shù)中第二個(gè)參數(shù)是一個(gè)資源 id,arrayadapter的 api 文檔中說(shuō)是要求用一個(gè)包含 textview 的layout文件,平臺(tái)用它來(lái)顯示每個(gè)選擇條目的樣式,這里的取值是第3頁(yè)共25頁(yè),所以,我們還有一個(gè)list_row.xml 文件來(lái)描述這個(gè)布局,相當(dāng)簡(jiǎn)單。從 arrayadapter上溯到 baseadapter,發(fā)現(xiàn)還有幾個(gè)同源的 adapter也應(yīng)該可以使用,象 simpleadapter和 cursoradapter,還是做個(gè)例子來(lái)實(shí)驗(yàn)一下吧。然后,在 hellotw(請(qǐng)你繼續(xù)關(guān)注好: )ob 中的 oncreate函數(shù)中,修改代碼,有幾個(gè)不同: items的元素是 has

8、hmap實(shí)例,這是一點(diǎn)變化,然后構(gòu)造函數(shù)除了要求 items 以外,還要求提供一個(gè) string來(lái)說(shuō)明用hash表中的哪個(gè)字段顯示在列表中,而后是一個(gè)資源id 的數(shù)組。因?yàn)閱渭兊?cursoradapter是抽象類,所以我用的是它的子類simplecursoradapter,很好理解,先用contentresolver查詢通訊簿得到一個(gè)游標(biāo),然后告訴simplecursoradapter要用其中的 作為顯示項(xiàng)來(lái)構(gòu)造出一個(gè)adapter即可。4.關(guān)于 dialog注意到 android.app包下除了 dialog(可用于制作復(fù)雜的對(duì)話框)以外,還包括了幾個(gè)系統(tǒng)定義好的對(duì)話

9、框類,如datepickerdialog、timepickerdialog及 alertdialog。其中 alertdialog我上回用過(guò)一次,基本上就那樣子了,今天看看另外兩個(gè)對(duì)話框的使用吧。第4頁(yè)共25頁(yè)很簡(jiǎn)單的,無(wú)非是需要一個(gè)ondatesetlistener接口的實(shí)現(xiàn)而已,在它里面的 dateset方法中就可以得到選擇的日期了。而timepickerdialog與 datepickerdialog使用如出一轍??纯戳硪粋€(gè) progressdialog的用法吧,這個(gè)類與alertdialog一樣包含了多個(gè) static的方法,所以使用起來(lái)是非常方便的。比如說(shuō),如果我們需要用它來(lái)表示一個(gè)

10、長(zhǎng)時(shí)間的操作。5.關(guān)于 service和 notification大略地看了一下android.app下的 service類,覺(jué)得它與activity 非常相似,只是要注意幾個(gè)地方:1.生命周期, service的從 oncreate()->onstart(int,bundle)->ondestroy()顯得更為簡(jiǎn)單。但是它的onstart是帶參數(shù)的,第一個(gè)id 可用來(lái)標(biāo)識(shí)這個(gè) service,第二個(gè)參數(shù)顯示是用來(lái)傳遞數(shù)據(jù)的了。比較activity,傳遞數(shù)據(jù)的 bundle 是在 oncreate就帶進(jìn)入的。2.service的啟動(dòng)由 context.startservice開(kāi)始,

11、其實(shí) activity 或者 service 都是 context 的派生類。結(jié)束于 context.stopservice()或者它自己的stopself()。3.service還有一個(gè)與 activity 不一樣的是它可以由另一個(gè)context 去綁定一個(gè)已存在的service。就是這個(gè)方法context.bindservice(),被綁定的 service要求是已經(jīng) oncreate了但可以沒(méi)有 onstart。在 service類中有個(gè)抽象方法 getbinder()可以得到這個(gè) ibinder 對(duì)象。關(guān)于這方面的細(xì)節(jié),以后再看,這里只做個(gè)記錄罷。第5頁(yè)共25頁(yè)4.與 service有

12、關(guān)的還有一個(gè)安全的問(wèn)題,可以在androidmanifest.xml中用 <uses-permission>標(biāo)簽來(lái)聲明一個(gè)service的訪問(wèn)權(quán)限,關(guān)于 android 的安全問(wèn)題也留待以后再解決吧。6gridview 與 imageview簡(jiǎn)單一點(diǎn)吧,就瞧瞧那個(gè)grid 的效果, android 提供了一個(gè)gridview,不過(guò)從 apidemo中看來(lái),它似乎與pc 上的 grid 差別還是挺大的,更像那個(gè) iconview 的感覺(jué)。不知道android 中如何實(shí)現(xiàn)表格界面?雖然在移動(dòng)終端上,表格一般不會(huì)有誰(shuí)使用,大家似乎更傾向于使用listview,而 android 對(duì)于 l

13、istview 則有更簡(jiǎn)單的實(shí)現(xiàn)listactivity。很簡(jiǎn)單,只要重載幾個(gè)方法就可以了,關(guān)鍵是那個(gè)getview方法,它負(fù)責(zé)構(gòu)建出每個(gè)單元格中的對(duì)象實(shí)例。這里我們構(gòu)造的是一個(gè)imageview實(shí)例。然后就是同樣的將這個(gè)adapter賦給 gridview 即可,大家可以看看效果,注意在做這個(gè)例子前,先放幾個(gè)小圖片到res/drawable目錄下,buildproject 一下就可以得到那個(gè)了(這里的 a 是圖像文件名,如 a.png)。在 getview方法中我們使用了 imageview類,這又是一個(gè) widget。除了上面用到的幾個(gè)方法以外,還有以下幾個(gè)方法值得注意:與圖像來(lái)源有關(guān)的方

14、法,我們只用了資源文件的方式。第6頁(yè)共25頁(yè)還是習(xí)慣性跑題了,其實(shí),我是想通過(guò)我對(duì)這個(gè)類的無(wú)數(shù)次debugger跟進(jìn),說(shuō)說(shuō)它的多線程異步處理的解決策略的。他的基本策略如下:1. 當(dāng)你實(shí)例化一個(gè) asyncqueryhandler類時(shí)(包括其子類 .),它會(huì)單件構(gòu)造一個(gè)線程(后面會(huì)詳述 .),這個(gè)線程里面會(huì)構(gòu)建一個(gè)消息循環(huán)。2. 獲得該消息循環(huán)的指針,用它做參數(shù)實(shí)例化另一個(gè) handler類,該類為內(nèi)部類。至此,就有了兩個(gè)線程,各自有一個(gè) handler來(lái)處理消息。3. 當(dāng)調(diào)用 onxxx 的時(shí)候,在 xxx 函數(shù)內(nèi)部會(huì)將請(qǐng)求封裝成一個(gè)內(nèi)部的參數(shù)類,將其作為消息的參數(shù),將此消息發(fā)送至另一個(gè)線程。

15、4. 在該線程的 handler中,接受該消息,并分析傳入的參數(shù),用初始化時(shí)傳入的 contentresolver進(jìn)行 xxx 操作,并返回 cursor 或其他返回值。5. 構(gòu)造一個(gè)消息,將上述返回值以及其他相關(guān)內(nèi)容綁定在該消息上,發(fā)送回主線程。6. 主線程默認(rèn)的 asyncqueryhandler類的 handlemessage方法(可自定義,但由于都是內(nèi)部類,基本沒(méi)有意義 .)會(huì)分析該消息,并轉(zhuǎn)發(fā)給對(duì)應(yīng)的 onxxxplete方法。7. 用戶重寫(xiě)的 onxxxplete方法開(kāi)始工作。第7頁(yè)共25頁(yè)這就是它偷偷摸摸做過(guò)的事情,基本還是很好理解的。我唯一好奇的是它的線程管理方式,我猜測(cè)他是用

16、的單件模式。第一個(gè)asyncqueryhandler的實(shí)例化會(huì)導(dǎo)致創(chuàng)建一個(gè)線程,從此該線程成為不死老處男,所有的contentresolver相關(guān)的工作,都由該線程統(tǒng)一完成。個(gè)人覺(jué)得這種解決方式很贊。本來(lái)這個(gè)線程的生命周期就很難估量,并且,當(dāng)你有一個(gè)contentprovider的請(qǐng)求的時(shí)候,判斷你會(huì)做更多的類似操作并不過(guò)分。就算錯(cuò)了,花費(fèi)的也只是一個(gè)不死的線程(與進(jìn)程同生死共存亡 .),換來(lái)的卻是簡(jiǎn)單的生命周期管理和無(wú)數(shù)次線程生死開(kāi)銷的節(jié)約。同時(shí)另外一個(gè)很重要的問(wèn)題,他并會(huì)涉及到單件中數(shù)據(jù)同步的問(wèn)題,每個(gè)類都有各自的handler類,彼此互不干擾,分發(fā)可以分別進(jìn)行。當(dāng)多個(gè)數(shù)據(jù)請(qǐng)求的時(shí)候,在同

17、一個(gè)contentresolver上進(jìn)行的可能微乎其微,這就避免了堵塞??偠灾?,這套解決辦法和 android 的整體設(shè)計(jì)算是天作之合了。所以建議,如果你有什么非 contentprovider操作,卻需要異步多線程執(zhí)行的話,模擬一套,是個(gè)不錯(cuò)的策略,當(dāng)然,具體情況具體分析,生搬硬套是學(xué)不好馬列主義的。7.顯示控件使用android 的界面顯示同樣也是基于控件的。通常是用 view(包括viewgroup)控件配上 xml 的樣式來(lái)做的。具體細(xì)節(jié)不想說(shuō)了,可以參第8頁(yè)共25頁(yè)考 sles里的 apidemos/view,和 view 的 doc,以及 implementing a ui這篇d

18、oc。其他還有很多,感覺(jué)算是sdk 講述的最多的內(nèi)容。從控件的使用上,和網(wǎng)頁(yè)的設(shè)計(jì)類似,盡量用parent_width之類的抽象長(zhǎng)度,用 theme來(lái)做風(fēng)格,抽取所有的字串等信息做本地化設(shè)計(jì)。相關(guān)內(nèi)容參看implementing a ui就好。一類比較重要的是數(shù)據(jù)綁定控件。如果做過(guò)會(huì)從中看到很多類似的地方。一個(gè)支持?jǐn)?shù)據(jù)綁定的控件,比如listview。可以通過(guò)一個(gè) listadapter綁定到一個(gè)數(shù)據(jù)源上。 listadapter是一個(gè)抽象類,主要的實(shí)現(xiàn)類包括 simpleadapter和 simplecursoradapter。前者是綁定一個(gè)靜態(tài)的array,后者是綁定一個(gè)動(dòng)態(tài)的cursor

19、。cursor 前面說(shuō)過(guò),是一個(gè)指向數(shù)據(jù)源的隨機(jī)迭代器,將view 綁定到 cursor通常要設(shè)置這樣幾個(gè)參數(shù)。一個(gè)是每一行的樣式,稱作row layout,其實(shí)就是一個(gè)普通的layout 的xml 文件。還有就是一個(gè)列和現(xiàn)實(shí)控件的對(duì)應(yīng)關(guān)系。那個(gè)控件顯示哪個(gè)列的值,這是需要配置的。為了定制一個(gè)良好的數(shù)據(jù)顯示控件,最簡(jiǎn)單你可以定制很pp 的 row layout,復(fù)雜一點(diǎn)就是可以重載綁定控件view,或者是適配器listadapter。如果是一個(gè)數(shù)據(jù)顯示密集的應(yīng)用,且你對(duì) ui 有些追求,這個(gè)工作估計(jì)是必不可少的。一個(gè)主要用于顯示數(shù)據(jù)內(nèi)容的activity,可以選擇派生自listactivity

20、。它提供了一個(gè)具有l(wèi)istview 的 layout,還有 simple_list_item_1,simple_list_item_2, two_line_list_item等默認(rèn)的 row layout,還有一些比較不錯(cuò)的 api,和可供響應(yīng)選擇item 的事件??梢詽M足你比較基礎(chǔ)的需第9頁(yè)共25頁(yè)求。如果你覺(jué)得只有一個(gè)listview 的界面太突兀,你可以為這個(gè)listactivity 指定一個(gè) layout,需要注意的是,你需要提供一個(gè)id 為android:id/list 的 listview 控件,避免 activity 在內(nèi)部偷偷尋找該控件的時(shí)候失敗。除了這些要求,做好ui 還有注

21、意易用性和效率。快捷鍵是一個(gè)比較不錯(cuò)的選擇,在activity 中調(diào)用setdefaultkeymode(shortcut_default_keys),可以開(kāi)啟快捷鍵模式,然后你可以將菜單綁定到指定快捷鍵上就ok 了。個(gè)人覺(jué)得 tip 也是一個(gè)比較重要的東西,但目前觀察看來(lái),這個(gè)東西只能夠自己提供了。界面的動(dòng)態(tài)性有時(shí)候是不可避免的,比如說(shuō)菜單就是一個(gè)需要經(jīng)常根據(jù)光標(biāo)位置提供不同的選項(xiàng)。這個(gè)東西android 很人道的考慮到了,你可以參看 nodelist這個(gè) sle。它采取的應(yīng)該是一個(gè)靜態(tài)模擬動(dòng)態(tài)的方式,這樣有助于提高速度。你也可以利用 viewinflate,動(dòng)態(tài)從一個(gè) xml 創(chuàng)建一個(gè)控件

22、。成本據(jù) doc 說(shuō)很大,不到萬(wàn)不得已不要使用。8.intent消息傳遞在前面寫(xiě) android 的 contentprovider 時(shí)候,可以看到那是基于觀察者模式的一個(gè)消息傳遞方法。每一個(gè) cursor、contentresolver做為一個(gè)小的注冊(cè)中心,相關(guān)觀察者可以在這個(gè)中心注冊(cè),更新消息由注冊(cè)中心分發(fā)給各個(gè)觀察者。而在 mfc 或 winform 中,都會(huì)形成一個(gè)消息網(wǎng),讓消息在網(wǎng)中流動(dòng),被各節(jié)點(diǎn)使用、吃掉或者在出口死掉。第10 頁(yè)共25 頁(yè)相比之下,我個(gè)人覺(jué)得基于intent 的 android 核心消息傳遞機(jī)制是有所不同的。它應(yīng)該會(huì)有一個(gè)全局性的注冊(cè)中心,這個(gè)注冊(cè)中心是隱性的,整

23、個(gè) android 系統(tǒng)中就那么一個(gè)。所有的消息接收者,都被隱形的注冊(cè)到這個(gè)中心。包括activity,service和 intentreceiver。其實(shí)說(shuō)隱形注冊(cè)是不確切的,所有注冊(cè)都還是我們手動(dòng)告訴注冊(cè)中心的,只是與傳統(tǒng)的方式不一樣,我們通常不是通過(guò)代碼,而是通過(guò)配置文件來(lái)做。在應(yīng)用的 manifest中,我們會(huì)為一些activity 或 service添加上intent-filter,或在配置文件中添加 <receiver></receiver> 項(xiàng)。這其實(shí)就相當(dāng)于向系統(tǒng)的注冊(cè)中心,注冊(cè)了相關(guān)的intent-filter 和 receiver(這個(gè)事情完全可以通

24、過(guò)代碼來(lái)做,只是這樣就失去了修改的靈活性)。當(dāng)程序有一個(gè)消息希望發(fā)出去的時(shí)候,它需要將消息封裝成一個(gè)intent,并發(fā)送。這時(shí)候,應(yīng)該是有一個(gè)統(tǒng)一的中心(恩,有可能android 底層實(shí)現(xiàn)的時(shí)候不是,但簡(jiǎn)單這樣看是沒(méi)問(wèn)題的.)接受到這個(gè)消息,并對(duì)它進(jìn)行解析、判定消息類型(這個(gè)步驟降低了耦合 .),然后檢查注冊(cè)了相匹配的 filter 或 receiver,并創(chuàng)建或喚醒接收者,將消息分發(fā)給它。這樣做有很多好處。雖然這種傳遞有的時(shí)候不如點(diǎn)對(duì)點(diǎn)的傳遞快(這有些需要速度的地方,我們看到 android 會(huì)通過(guò)直接通信來(lái)做),但有時(shí)候又因?yàn)樗唤?jīng)過(guò)一跳(姑且這么叫吧 .),比復(fù)雜的流動(dòng)又要更快。更重要的

25、是,它耦合性低,在手機(jī)平臺(tái)這種程序組件多變的條件下使用十分適合。并且它可以很容易實(shí)現(xiàn)消息的精確或模糊匹配,彈性很大。(我個(gè)人曾想在開(kāi)發(fā)一個(gè)c+ 二次平臺(tái)的時(shí)候引第11 頁(yè)共25 頁(yè)入這樣的機(jī)制,但在c+ 中,建立一套完整的數(shù)據(jù)marshal機(jī)制不容易,相比之下,用java來(lái)做會(huì)簡(jiǎn)單很多 .)恩,廢話說(shuō)了很多,具體講講android 中 intent 的使用。當(dāng)你有一個(gè)消息需要傳遞,如果你明確知道你需要哪個(gè)activity 或者其他 class來(lái)響應(yīng)的話,你可以指定這個(gè)類來(lái)接受該消息,這被稱為顯性發(fā)送。你需要將 intent 的 class屬性設(shè)置成目標(biāo)。這種情況很常見(jiàn),比如startactiv

26、ity的時(shí)候,會(huì)清楚當(dāng)前activity 完了應(yīng)該是哪個(gè)activity,那就明確的發(fā)送這個(gè)消息。但是,有的時(shí)候你并不確定你的消息是需要具體哪個(gè)類來(lái)執(zhí)行,而只是知道接收者該符合哪些條件。比如你只需要有一個(gè)接收者能顯示用戶所選的數(shù)據(jù),而不想制定某個(gè)具體的方法,這時(shí)候你就需要用到隱形發(fā)送(傳統(tǒng)上,我們可能會(huì)考慮用多態(tài),但顯然這種方式更為靈活 .)。在 android 中,你可以為 intent 指定一個(gè) action,表示你這個(gè)指令需要處理的事情。系統(tǒng)為我們定義了很多action 類型,這些類型使系統(tǒng)與我們通信的語(yǔ)言(比如在activity 里面加一個(gè) main 的 filter,該activit

27、y 就會(huì)做成該應(yīng)用的入口點(diǎn)),當(dāng)然你也可以用于你自己的應(yīng)用之間的通信(同樣當(dāng)然,也可以自定義.)。強(qiáng)烈建議,在自己程序接收或發(fā)出一個(gè)系統(tǒng)action 的時(shí)候,要名副其實(shí)。比如你響應(yīng)一個(gè)view動(dòng)作,做的確實(shí)edit 的勾當(dāng),你發(fā)送一個(gè)pick 消息,其實(shí)你想讓別人做 edit 的事,這樣都會(huì)造成混亂。當(dāng)然只有action 有時(shí)候是不夠的,在android 中我們還可以指定catalog信息和 type/data 信息,比如所有的顯第12 頁(yè)共25 頁(yè)示數(shù)據(jù)的 activity,可能都會(huì)響應(yīng)view action。但很多與我們需要顯示的數(shù)據(jù)類型不一樣,可以加一個(gè)type信息,明確的指出我們需要顯

28、示的數(shù)據(jù)類型,甚至還可以加上一個(gè)catalog信息,指明只有你只有按的是“中鍵”并發(fā)出這樣的消息才響應(yīng)。從上面可以看出, android 的 intent 可以添加上 class, action,data/type, catalog等消息,注冊(cè)中心會(huì)根據(jù)這些信息幫你找到符合的接收者。其中 class是點(diǎn)對(duì)點(diǎn)的指示,一旦指明,其他信息都被忽略。 intent 中還可以添加 key/value 的數(shù)據(jù),發(fā)送方和接收方需要保持統(tǒng)一的 key 信息和 value類型信息,這種數(shù)據(jù)的 marshal在 java里做,是不費(fèi)什么力氣的。android 的 intent 發(fā)送,可以分成單播和廣播兩種。廣播的

29、接收者是所有注冊(cè)了的符合條件的intentreceiver。在單播的情況下,即使有很多符合條件的接收者,也只要有一個(gè)出來(lái)處理這個(gè)消息就好(恩,個(gè)人看法,沒(méi)找到確切條款或抉擇的算法,本來(lái)想實(shí)驗(yàn)一下,沒(méi)來(lái)得及.),這樣的情況很容易理解,當(dāng)你需要修改某個(gè)數(shù)據(jù)的時(shí)候,你肯定不會(huì)希望有十個(gè)編輯器輪流讓你來(lái)處理。當(dāng)廣播不是這樣,一個(gè)receiver沒(méi)有辦法阻止其他receiver進(jìn)行對(duì)廣播事件的處理。這種情況也很容易理解,比如時(shí)鐘改變了,鬧鐘、備忘錄等很多程序都需要分別進(jìn)行處理。在自己的程序的使用中,應(yīng)該分清楚區(qū)別,合理的使用。9.contentprovider數(shù)據(jù)模型數(shù)據(jù)庫(kù)操作第13 頁(yè)共25 頁(yè)從我目

30、前掌握的知識(shí)來(lái)看,sqlite比較輕量(沒(méi)有存儲(chǔ)過(guò)程之類的繁雜手段),用起來(lái)也比較簡(jiǎn)單。實(shí)例化一個(gè)sqlitedatabase類對(duì)象,通過(guò)它的 apis可以搞定大部分的操作。從sle 中看, android 中對(duì) db 的使用有一種比較簡(jiǎn)單的模式,即派生一個(gè)contentproviderdatabasehelper類來(lái)進(jìn)行 sqlitedatabase對(duì)象實(shí)例的獲取工作?;旧?,contentproviderdatabasehelper類扮演了一個(gè)singleton的角色,提供單一的實(shí)例化入口點(diǎn),并屏蔽了數(shù)據(jù)庫(kù)創(chuàng)建、打開(kāi)升級(jí)等細(xì)節(jié)。在contentprovider中只需要調(diào)用contentpr

31、oviderdatabasehelper的opendatabase方法獲取 sqlitedatabase的實(shí)例就好,而不需要進(jìn)行數(shù)據(jù)庫(kù)狀態(tài)的判斷。uri像進(jìn)行數(shù)據(jù)庫(kù)操作需要用 sql 一樣,對(duì) contentproivder 進(jìn)行增刪改查等操作都是通過(guò)一種特定模式的 uri 來(lái)進(jìn)行的( ig:content: /provider/item/id ), uri 的能力與 url 類似,具體細(xì)節(jié)可以查看 sdk。建立自己的 contentprovider,只需要派生 contentproivder類并實(shí)現(xiàn) insert, delete, update等抽象函數(shù)即可。在這些接口中比較特殊的是gett

32、ype(uri)。根據(jù)傳入的 uri,該方法按照 mime 格式返回一個(gè)字符串( =! 沒(méi)聽(tīng)過(guò)的詭異格式 .)唯一標(biāo)識(shí)該 uri 的類型。所謂 uri 的類型,就是描述這個(gè) uri 所進(jìn)行的操作的種類,比如 content:/xx/a 與content:/xx/a/1不是一個(gè)類型(前者是多值操作,后者是單值),但第14 頁(yè)共25 頁(yè)content:/xx/a/1和 content:/xx/a/2就會(huì)是一個(gè)類型(只是id 號(hào)不同而已)。在 contentprovider通常都會(huì)實(shí)例化一個(gè) contenturipraser來(lái)輔助解析和操作傳入的 uri。你需要事先(在 static 域內(nèi))為該 c

33、ontenturipraser建立一個(gè) uri 的語(yǔ)法樹(shù),之后就可以簡(jiǎn)單調(diào)用 contenturipraser類的相關(guān)方法進(jìn)行 uri 類型判斷( match 方法),獲取加載在 uri 中的參數(shù)等操作。但我看來(lái),這只是在使用上簡(jiǎn)化了相關(guān)操作(不然就需要自己做人肉解析了 .),但并沒(méi)有改變類型判定的模式。你依然需要用switch.case.對(duì) uri 的類型進(jìn)行判斷,并進(jìn)行相關(guān)后續(xù)的操作。從模式來(lái)看,這樣無(wú)疑是具有強(qiáng)烈的壞味道,類似的switch.case.代碼要出現(xiàn)n 此,每次一個(gè) contentprovider做 uri 類型的增減都會(huì)需要遍歷修改每一個(gè) switch.case.,當(dāng)然,如

34、果你使用模式(策略模式.)進(jìn)行改造對(duì)手機(jī)程序來(lái)說(shuō)無(wú)疑是崩潰似的(類型膨脹,效率降低.),所以,只能是忍一忍了(恩,還好不會(huì)擴(kuò)散到別的類中,維護(hù)性上不會(huì)有殺人性的麻煩 .)。增刪改查contentprovider 和所有數(shù)據(jù)源一樣,向外提供增刪改查操作接口,這些都是基于 uri 的指令。進(jìn)行 insert 操作的時(shí)候,你需要傳入一個(gè)uri和 contentvalues。uri 的作用基本就限于指明增減條目的類型(從數(shù)據(jù)庫(kù)層面來(lái)看就是 table 名), contentvalues是一個(gè) key/value 表的封裝,提供方便的 api 進(jìn)行插入數(shù)據(jù)類型和數(shù)據(jù)值的設(shè)置和獲取。在數(shù)據(jù)庫(kù)層第15 頁(yè)共

35、25 頁(yè)面上來(lái)看,這應(yīng)該是column name與 value的對(duì)應(yīng)。但為了屏蔽contentprovider用戶涉及到具體數(shù)據(jù)庫(kù)的細(xì)節(jié),在android的示例中,用了一個(gè)小小的模式。它為每一個(gè)表建一個(gè)基于basecolumn類的派生類(其實(shí)完全可以不派生自basecolumn,特別當(dāng)你的表不基于默認(rèn)的自動(dòng) id 做主鍵的時(shí)候),這個(gè)類通常包括一個(gè)描述該表的contenturi 對(duì)象和形如 public static final title = "title"這樣的 column 到類數(shù)據(jù)的對(duì)應(yīng)。從改變上角度來(lái)看,你可以修改 column 的名字而不需要更改用戶上層代碼,增

36、加了靈活性。 insert方法如果成功會(huì)返回一個(gè) uri,該 uri 會(huì)在原有的 uri 基礎(chǔ)上增加有一個(gè) row id。對(duì)于為什么使用 row id 而不是 key id 我想破了腦袋。到最后,我發(fā)現(xiàn)我傻了,因?yàn)?contentprovider 不一定需要使用數(shù)據(jù)庫(kù),使用數(shù)據(jù)庫(kù)對(duì)應(yīng)的表也可以沒(méi)有主鍵,只有row id,才能在任何底層介質(zhì)下做索引標(biāo)識(shí)。但,基于 row id 在刪除和修改操作是會(huì)造成一定的混亂。刪除和修改操作類似。刪除操作需要傳入一個(gè)uri,一個(gè) where字串,一組where的參數(shù)(做條件判定 .),而修改操作會(huì)多一個(gè) contentvalues做更新值。著兩個(gè)操作的 uri

37、 都支持在末尾添加一個(gè) row id。于是混亂就出現(xiàn)了。當(dāng)在 where參數(shù)中指明了 key id,而在 uri 中提供了 row id,并且 row id 和 key id 所指函數(shù)不一致的時(shí)候,你聽(tīng)誰(shuí)的?示例代碼中的做法是完全無(wú)視 row id(無(wú)語(yǔ) .),如此野蠻的方式我估計(jì)也只能在示例中出現(xiàn),在實(shí)際中該如何用,恩,我也不知道。幸運(yùn)的是,我看了下上層對(duì) contentprovider的刪除操作,其實(shí)都不會(huì)直接進(jìn)行,而是通過(guò)調(diào)第16 頁(yè)共25 頁(yè)用 cursor 的 delete方法進(jìn)行,在這前提下,我想 cursor 會(huì)處理好這些東西吧。最后一個(gè)操作是查詢操作,可以想見(jiàn),查詢的參數(shù)是最多

38、的,包括 uri 和一組條件參數(shù)。條件參數(shù)類型和標(biāo)準(zhǔn)的sql 類似,包括 sort,projection 之類的。從這些參數(shù)到sql 語(yǔ)句的生成,可以尋求querybuilder類的幫助,它提供了一組操作接口,簡(jiǎn)化了參數(shù)到sql 的生成工作,哪怕你不懂sql 都完全沒(méi)有問(wèn)題(這話說(shuō)的我自己都覺(jué)得有點(diǎn)懸.)。查詢返回一個(gè) cursor。cursor 是一個(gè)支持隨機(jī)讀寫(xiě)的指針,不僅如此,它還提供了方便的刪除和修改的 api,是上層對(duì)contentprovider進(jìn)行操作一個(gè)重要對(duì)象,需要仔細(xì)掌握(cursor 還可以綁定到 view 上,直接送顯,并與用戶進(jìn)行交互,真是程序越往上,封裝越好,工作越

39、機(jī)械沒(méi)有復(fù)雜性了 .)。數(shù)據(jù)模型在與界面打交道的 cursor、contentresolver等數(shù)據(jù)操作層中,大量采用觀察者模式建立數(shù)據(jù)層與顯示層的聯(lián)系。一個(gè)顯示層的視圖,可以做成某一種觀察者注冊(cè)到 cursor 或 contentresolver等數(shù)據(jù)中間層中,在實(shí)現(xiàn)底層 contentprovider中,我們需要特別注意在對(duì)數(shù)據(jù)進(jìn)行修改操作(包括增刪改 .)后,調(diào)用相應(yīng)類型的 notify 函數(shù),幫助表層對(duì)象進(jìn)行刷新(還有一種刷新方式是從一個(gè) view 發(fā)起的)。可以看到 android 的整體數(shù)據(jù)顯示框架有點(diǎn)像 mvc 的方式。 cursor、contentresolver相當(dāng)于控制層,

40、數(shù)據(jù)層和顯示層的交互通過(guò)控制層來(lái)掌管,而且控制層很第17 頁(yè)共25 頁(yè)穩(wěn)定不需要特別定制,通常工作只在定制數(shù)據(jù)層和顯示層空間,還是比較方便和清晰的。10.學(xué)習(xí)感想通過(guò)這學(xué)期對(duì)安卓的學(xué)習(xí),大概了解了以上一些知識(shí),對(duì)安卓有了初步的了解,這幾個(gè)月給我的東西我想用有形的和無(wú)形的兩部分概敘,形的當(dāng)然就是技術(shù)水平的長(zhǎng)進(jìn),雖然其中肯定有很多的不足,相信慢慢會(huì)體會(huì)到。第二篇:安卓 課程學(xué)習(xí)心得心得體會(huì)學(xué)號(hào):姓名:班級(jí):一開(kāi)始接觸 android 是從自己的手機(jī)開(kāi)始的,覺(jué)得它很酷,是我喜歡的風(fēng)格,然后我就通過(guò)了一些網(wǎng)絡(luò)渠道去了解 android。在選課的時(shí)候發(fā)現(xiàn)有這個(gè)課程,于是我就報(bào)名了。剛開(kāi)始接觸 andro

41、id 開(kāi)發(fā)時(shí)感覺(jué)到它很有意思,在界面開(kāi)發(fā)上和 web 也可以形成了相通的架構(gòu),更加方便,視覺(jué)上也是非常的酷。 android 作為新興的手機(jī)操作系統(tǒng),適應(yīng)潮流的發(fā)展,在一定程度上迎合了現(xiàn)代人們最求效率和最求完美的心態(tài),再加上的它的先進(jìn)之處,所以 android 的發(fā)展很快, android 的應(yīng)用資源也越來(lái)越廣泛,現(xiàn)在的 android 正在快速形成一個(gè)只能手機(jī)王國(guó),給人們提供日常娛樂(lè)和辦公的平臺(tái),無(wú)論在哪些方面, android 的表現(xiàn)總是能夠讓人滿意, 它正在快速地占領(lǐng)手機(jī)終端,未來(lái)的智能手機(jī)領(lǐng)域?qū)⑹?android 的天下,越來(lái)越多的人選用 android 平臺(tái)的手機(jī)。如果第18 頁(yè)共2

42、5 頁(yè)說(shuō)追求蘋(píng)果是因?yàn)樘O(píng)果的高端與美感,那么追求android 則是因?yàn)樗南冗M(jìn)性開(kāi)源性,也正是因?yàn)閍ndroid 這些吸引人們矚目的特點(diǎn),才會(huì)有越來(lái)越多的人對(duì)android 充滿激情, android 的發(fā)展也才能這樣的迅猛,所以在這里要先謝謝goolge,以及那些充滿激情的開(kāi)發(fā)者們。首先在界面上,我們同樣可以通過(guò)不同布局進(jìn)行設(shè)計(jì)非??岬慕缑?,這些界面可以通過(guò) include 進(jìn)行引入,我們可以通過(guò)一些公用的方法寫(xiě)個(gè)baseactivity這個(gè)基類,通過(guò)繼承方式比較不錯(cuò)的實(shí)現(xiàn)了 activity 的界面, 因?yàn)檫@樣你可以 header(頭部 )和 footer(尾部 )進(jìn)行處理一些觸發(fā)事件或

43、者特效等。布局模式以相對(duì)模式為主,線線布局模式可以在比較簡(jiǎn)單的 include 進(jìn)行完成,最重要的一點(diǎn)就是:我們可以自己通過(guò)重寫(xiě)方法或者通過(guò)實(shí)現(xiàn) view 或者 layout 等類進(jìn)行擴(kuò)充項(xiàng)目需要的布局 (或者控件 ) ,在學(xué)習(xí)界面中, android 為我們提供了很好的類似反射機(jī)制,通過(guò) layout 文件夾下的配置文件,可以快速的形成界面,在配置文件可以設(shè)置屬性或者樣式都是很快捷方便。對(duì)比較特殊的界面也可以通過(guò)處理嵌入到指定的界面,同樣可以通過(guò) java 代碼直接創(chuàng)建 view 進(jìn)行添加,不過(guò)這種方式比較復(fù)雜。對(duì)一些點(diǎn)擊、選中、按鍵等處理的事件,界面之間的 跳轉(zhuǎn) intent 管理,通過(guò)

44、bundle 對(duì)數(shù)據(jù)在界面之間進(jìn)行傳輸。其次在手機(jī)交互式通信服務(wù)中,學(xué)習(xí)了 android 手機(jī)之間進(jìn)行短信發(fā)送、廣播、對(duì)廣播的監(jiān)聽(tīng)、服務(wù)等。這次的課程我們主要學(xué)習(xí)了航班系統(tǒng)的設(shè)計(jì),首先我們要建立航班查詢:旅客就可通過(guò)網(wǎng)絡(luò)訪問(wèn)該系統(tǒng)客戶端網(wǎng)址,可根據(jù)旅客提供第19 頁(yè)共25 頁(yè)的出發(fā)時(shí)間、出發(fā)地點(diǎn)和目的地、艙位要求等,查詢滿足旅客要求的航班。通過(guò)檢索可得到航班的相關(guān)信息,從而可以方便旅客訂票并掌握所需信息,同時(shí)可減少工作人員的工作量。第二,我們要建立旅客訂票:旅客將訂票的相關(guān)信息通過(guò)工作人員輸入系統(tǒng)客戶端??蛻舳藢⒙每偷挠喥毙畔⑼ㄟ^(guò)網(wǎng)絡(luò)傳送給服務(wù)端,服務(wù)端根據(jù)接收到的信息由航班安排系統(tǒng)為旅客安

45、排座位并返回相應(yīng)的確認(rèn)信息給該客戶端。訂票信息生成后,存入相應(yīng)的存儲(chǔ)區(qū)域,并對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)提交??蛻舳舜蛴∪∑眴渭皫谓o旅客,旅客在登機(jī)前,經(jīng)信息核審后,即可領(lǐng)取機(jī)票登機(jī)。第三,航班信息管理:航空公司可將所有航班的信息存入數(shù)據(jù)庫(kù),方便用戶對(duì)航班基本信息查詢,相關(guān)工作人員可根據(jù)公司要求,經(jīng)系統(tǒng)身份認(rèn)證后登錄并對(duì)航班信息進(jìn)行修改等操作,從而使 航班信息便于管理。第四:航班安排:從客戶端接收到旅客的訂票信息,該系統(tǒng)可在短時(shí)間內(nèi)處理旅客航班問(wèn)題。將 訂票信息送往數(shù)據(jù)庫(kù)并更新,客戶端的航班查詢信息也同步更新。節(jié)省時(shí)間的同時(shí),也能讓 旅客得到最新的航班信息。第五,售票管理:旅客不僅可在各客戶端進(jìn)行機(jī)票預(yù)

46、定,也可直接在機(jī)場(chǎng)的售票處購(gòu)票,購(gòu)票信息由系統(tǒng)提交到數(shù)據(jù)庫(kù)進(jìn)行管理更新。第20 頁(yè)共25 頁(yè)第六,退票管理:機(jī)票有效期內(nèi),旅客若需退票,可在退票處進(jìn)行退票。退票信息,由工作人員輸入系統(tǒng),系統(tǒng)對(duì)訂票信息或售票信息進(jìn)行刪除更新。第七,票銷售情況核算:因?yàn)楹娇展緳C(jī)票銷售量大,而航空公司為了公司的經(jīng)營(yíng),有需要在一定的時(shí) 間階段了解公司機(jī)票的銷售情況。而龐大的數(shù)據(jù)量通過(guò)人工來(lái)完成,似乎不太現(xiàn)實(shí),而該系 統(tǒng)可幫助航空公司進(jìn)行售票情況的核算。這個(gè)課程緊跟住了現(xiàn)代科技的發(fā)展,讓我們?cè)诘谝粫r(shí)間和先進(jìn)的科學(xué)技術(shù)做了一個(gè)親密的接觸,這樣的課程能夠點(diǎn)燃我們對(duì)某一個(gè)新興領(lǐng)域的激情,這算是一個(gè)啟蒙,讓我們對(duì) andro

47、id 先有了一個(gè)大概的了解,這個(gè)課程不一定能讓我們很好的掌握 android 的理念或者開(kāi)發(fā),但是能夠讓我們對(duì) android 產(chǎn)生濃厚的興趣,讓我們?nèi)计鹛剿?android 的欲望,我想這樣就已經(jīng)足夠了。第三篇:安卓學(xué)習(xí)安卓開(kāi)發(fā)學(xué)習(xí)準(zhǔn)備要點(diǎn)介紹要說(shuō)當(dāng)下 it 行業(yè)當(dāng)中最具創(chuàng)造力、前瞻性、延續(xù)性和實(shí)現(xiàn)能力,想必有相當(dāng)?shù)娜藭?huì)把票投給 google的安卓,安卓開(kāi)發(fā)學(xué)習(xí)也成為新潮流。安卓開(kāi)發(fā)學(xué)習(xí)要做什么準(zhǔn)備?下面就由福州卓躍教育具體介紹。首先,最好先熟悉一門(mén)編程語(yǔ)言,現(xiàn)在大學(xué)里面和計(jì)算機(jī)相關(guān)的專業(yè)甚至理工類專業(yè)一般都會(huì)開(kāi)設(shè) c 語(yǔ)言課程,只是很多同學(xué)在大學(xué)期間并沒(méi)有好好學(xué)習(xí),如果對(duì)它掌握的不太好或者

48、很久沒(méi)用了,建議第21 頁(yè)共25 頁(yè)先從將其好好復(fù)習(xí)一下,將其基本的語(yǔ)法再好好回顧一下,最好能搭建一個(gè)環(huán)境來(lái)運(yùn)行、調(diào)試它。如果沒(méi)有學(xué)過(guò),不妨也提前學(xué)習(xí)一下,可以參考清華大學(xué)出版社出版的譚浩強(qiáng)老師的 c 語(yǔ)言程序設(shè)計(jì),推薦這本書(shū)的原因一是它已經(jīng)經(jīng)過(guò)了多年的考驗(yàn),應(yīng)該說(shuō)還是比較嚴(yán)謹(jǐn)?shù)?;其次就是大部分的高校所開(kāi)設(shè)的 c 語(yǔ)言使用的教材都是用它作為教材,因此無(wú)論是購(gòu)買還是借閱,都容易找到。其次,如果后續(xù)有志于游戲方面的開(kāi)發(fā),最好具備一定的數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)知識(shí)。雖然現(xiàn)代的高級(jí)編程語(yǔ)言中,其類庫(kù)中已經(jīng)幫我們實(shí)現(xiàn)了大部分的數(shù)據(jù)結(jié)構(gòu),一般情況下,我們直接使用即可。但如果能對(duì)其原理有所了解,當(dāng)需要在這些數(shù)據(jù)結(jié)構(gòu)和算法中間的時(shí)候,可以更加的清楚到底應(yīng)該選擇那個(gè)數(shù)據(jù)結(jié)構(gòu)或者算法。另外,在圖形圖像處理上面,線性代數(shù)的作用也非常重要,如果能掌握一點(diǎn)這方面的基礎(chǔ)知識(shí),無(wú)疑也會(huì)在

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論