欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      安卓學(xué)習(xí)心得

      時(shí)間:2019-05-12 11:59:22下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《安卓學(xué)習(xí)心得》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《安卓學(xué)習(xí)心得》。

      第一篇:安卓學(xué)習(xí)心得

      Android學(xué)習(xí)心得

      -----093380117

      計(jì)算機(jī)應(yīng)用(1)

      張峰

      1.關(guān)于Activity

      1.在一個(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è)方法,setViewOneCommand和setViewTwoCommand,分別處理一下在不同界面時(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自己的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è)信息: 1.種類(category),比如我們常見(jiàn)的 LAUNCHER_CATEGORY 就是表示這是一類應(yīng)用程序。

      2.類型(type),在前面的例子中沒(méi)用過(guò),表示數(shù)據(jù)的類型,這是隱性Intent定位目標(biāo)的重要依據(jù)。

      3.組件(component),前面的例子中用的是setClass,不過(guò)也可以用setComponent來(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è)不同的應(yīng)用之間的調(diào)用,可手機(jī)上又有什么“較大”的系統(tǒng)呢?無(wú)非是可以與不同來(lái)源的多個(gè)應(yīng)用之間方便地互操作而已,那么會(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è)ListView實(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)造函數(shù)中第二個(gè)參數(shù)是一個(gè)資源ID,ArrayAdapter的API文檔中說(shuō)是要求用一個(gè)包含TextView的layout文件,平臺(tái)用它來(lái)顯示每個(gè)選擇條目的樣式,這里的取值是R.layout.list_row,所以,我們還有一個(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)一下吧。

      然后,在HelloTwoB中的onCreate函數(shù)中,修改代碼,有幾個(gè)不同:items的元素是HashMap實(shí)例,這是一點(diǎn)變化,然后構(gòu)造函數(shù)除了要求items以外,還要求提供一個(gè)string[]來(lái)說(shuō)明用hash表中的哪個(gè)字段顯示在列表中,而后是一個(gè)資源ID的數(shù)組。

      因?yàn)閱渭兊腃ursorAdapter是抽象類,所以我用的是它的子類SimpleCursorAdapter,很好理解,先用ContentResolver查詢通訊簿得到一個(gè)游標(biāo),然后告訴SimpleCursorAdapter要用其中的People.NAME作為顯示項(xiàng)來(lái)構(gòu)造出一個(gè)adapter即可。4.關(guān)于Dialog

      注意到android.app包下除了Dialog(可用于制作復(fù)雜的對(duì)話框)以外,還包括了幾個(gè)系統(tǒng)定義好的對(duì)話框類,如DatePickerDialog、TimePickerDialog及AlertDialog。

      其中AlertDialog我上回用過(guò)一次,基本上就那樣子了,今天看看另外兩個(gè)對(duì)話框的使用吧。

      很簡(jiǎn)單的,無(wú)非是需要一個(gè)OnDateSetListener接口的實(shí)現(xiàn)而已,在它里面的dateSet方法中就可以得到選擇的日期了。而TimePickerDialog與DatePickerDialog使用如出一轍。

      看看另一個(gè)ProgressDialog的用法吧,這個(gè)類與AlertDialog一樣包含了多個(gè)static的方法,所以使用起來(lái)是非常方便的。比如說(shuō),如果我們需要用它來(lái)表示一個(gè)長(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)始,其實(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è)記錄罷。

      4.與Service有關(guān)的還有一個(gè)安全的問(wèn)題,可以在AndroidManifest.xml中用標(biāo)簽來(lái)聲明一個(gè)Service的訪問(wèn)權(quán)限,關(guān)于Android的安全問(wèn)題也留待以后再解決吧。

      6.GridView與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ì)于ListView則有更簡(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è)R.drawable.a了(這里的a是圖像文件名,如a.png)。

      在getView方法中我們使用了ImageView類,這又是一個(gè)widget。除了上面用到的幾個(gè)方法以外,還有以下幾個(gè)方法值得注意: 與圖像來(lái)源有關(guān)的方法,我們只用了資源文件的方式。

      還是習(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è)線程。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)的onXXXComplete方法。

      7.用戶重寫(xiě)的onXXXComplete方法開(kāi)始工作。

      這就是它偷偷摸摸做過(guò)的事情,基本還是很好理解的。我唯一好奇的是它的線程管理方式,我猜測(cè)他是用的單件模式。第一個(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í)候,在同一個(gè)ContentResolver上進(jìn)行的可能微乎其微,這就避免了堵塞??偠灾?,這套解決辦法和Android的整體設(shè)計(jì)算是天作之合了。

      所以建議,如果你有什么非ContentProvider操作,卻需要異步多線程執(zhí)行的話,模擬一套,是個(gè)不錯(cuò)的策略,當(dāng)然,具體情況具體分析,生搬硬套是學(xué)不好馬列主義的。

      7.顯示控件使用

      Android的界面顯示同樣也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的樣式來(lái)做的。具體細(xì)節(jié)不想說(shuō)了,可以參考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI這篇Doc。其他還有很多,感覺(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ò)ASP.Net會(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。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。它提供了一個(gè)具有ListView 的Layout,還有simple_list_item_1, simple_list_item_2, two_line_list_item等默認(rèn)的Row Layout,還有一些比較不錯(cuò)的API,和可供響應(yīng)選擇Item的事件??梢詽M足你比較基礎(chǔ)的需求。如果你覺(jué)得只有一個(gè)ListView的界面太突兀,你可以為這個(gè)ListActivity指定一個(gè)Layout,需要注意的是,你需要提供一個(gè)id為@android:id/list的ListView控件,避免Activity在內(nèi)部偷偷尋找該控件的時(shí)候失敗。

      除了這些要求,做好UI還有注意易用性和效率。快捷鍵是一個(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è)Sample。它采取的應(yīng)該是一個(gè)靜態(tài)模擬動(dòng)態(tài)的方式,這樣有助于提高速度。你也可以利用ViewInflate,動(dòng)態(tài)從一個(gè)XML創(chuàng)建一個(gè)控件。成本據(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)使用、吃掉或者在出口死掉。

      相比之下,我個(gè)人覺(jué)得基于Intent的Android核心消息傳遞機(jī)制是有所不同的。它應(yīng)該會(huì)有一個(gè)全局性的注冊(cè)中心,這個(gè)注冊(cè)中心是隱性的,整個(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,或在配置文件中添加項(xiàng)。這其實(shí)就相當(dāng)于向系統(tǒng)的注冊(cè)中心,注冊(cè)了相關(guān)的Intent-filter和receiver(這個(gè)事情完全可以通過(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)又要更快。更重要的是,它耦合性低,在手機(jī)平臺(tái)這種程序組件多變的條件下使用十分適合。并且它可以很容易實(shí)現(xiàn)消息的精確或模糊匹配,彈性很大。(我個(gè)人曾想在開(kāi)發(fā)一個(gè)C++二次平臺(tái)的時(shí)候引入這樣的機(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),比如startActivity的時(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,該activity就會(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信息,比如所有的顯示數(shù)據(jù)的Activity,可能都會(huì)響應(yīng)View action。但很多與我們需要顯示的數(shù)據(jù)類型不一樣,可以加一個(gè)type信息,明確的指出我們需要顯示的數(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ā)送,可以分成單播和廣播兩種。廣播的接收者是所有注冊(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ù)操作

      從我目前掌握的知識(shí)來(lái)看,SQLite比較輕量(沒(méi)有存儲(chǔ)過(guò)程之類的繁雜手段),用起來(lái)也比較簡(jiǎn)單。實(shí)例化一個(gè)SQLiteDatabase類對(duì)象,通過(guò)它的APIs可以搞定大部分的操作。從sample中看,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)用ContentProviderDatabaseHelper的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ù)即可。在這些接口中比較特殊的是getType(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è)類型(前者是多值操作,后者是單值),但content://xx/a/1和content://xx/a/2 就會(huì)是一個(gè)類型(只是id號(hào)不同而已)。

      在ContentProvider通常都會(huì)實(shí)例化一個(gè)ContentURIPraser來(lái)輔助解析和操作傳入的URI。你需要事先(在static域內(nèi))為該ContentURIPraser建立一個(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)然,如果你使用模式(策略模式...)進(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ù)層面上來(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的名字而不需要更改用戶上層代碼,增加了靈活性。insert方法如果成功會(huì)返回一個(gè)uri,該uri會(huì)在原有的uri基礎(chǔ)上增加有一個(gè)row id。對(duì)于為什么使用row id而不是key id我想破了腦袋。到最后,我發(fā)現(xiàn)我傻了,因?yàn)镃ontentProvider不一定需要使用數(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都支持在末尾添加一個(gè)row id。于是混亂就出現(xiàn)了。當(dāng)在where參數(shù)中指明了key id,而在uri中提供了row id,并且row id和key id所指函數(shù)不一致的時(shí)候,你聽(tīng)誰(shuí)的?示例代碼中的做法是完全無(wú)視r(shí)ow id(無(wú)語(yǔ)...),如此野蠻的方式我估計(jì)也只能在示例中出現(xiàn),在實(shí)際中該如何用,恩,我也不知道。幸運(yùn)的是,我看了下上層對(duì) ContentProvider的刪除操作,其實(shí)都不會(huì)直接進(jìn)行,而是通過(guò)調(diào)用Cursor的delete方法進(jìn)行,在這前提下,我想Cursor會(huì)處理好這些東西吧。

      最后一個(gè)操作是查詢操作,可以想見(jiàn),查詢的參數(shù)是最多的,包括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)行交互,真是程序越往上,封裝越好,工作越機(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)于控制層,數(shù)據(jù)層和顯示層的交互通過(guò)控制層來(lái)掌管,而且控制層很穩(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)始接觸 Android開(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ī)。如果說(shuō)追求蘋(píng)果是因?yàn)樘O(píng)果的高端與美感,那么追求 Android 則是因?yàn)樗南冗M(jìn)性開(kāi)源性,也正是因?yàn)?Android 這些吸引人們矚目的特點(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ā)事件或者特效等。布局模式以相對(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ò) 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ù)旅客提供的出發(fā)時(shí)間、出發(fā)地點(diǎn)和目的地、艙位要求等,查詢滿足旅客要求的航班。通過(guò)檢索可得到航班的相關(guān)信息,從而可以方便旅客訂票并掌握所需信息,同時(shí)可減少工作人員的工作量。

      第二,我們要建立旅客訂票:旅客將訂票的相關(guān)信息通過(guò)工作人員輸入系統(tǒng)客戶端??蛻舳藢⒙每偷挠喥毙畔⑼ㄟ^(guò)網(wǎng)絡(luò)傳送給服務(wù)端,服務(wù)端根據(jù)接收到的信息由航班安排系統(tǒng)為旅客安排座位并返回相應(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ù)定,也可直接在機(jī)場(chǎng)的售票處購(gòu)票,購(gòu)票信息由系統(tǒng)提交到數(shù)據(jù)庫(kù)進(jìn)行管理更新。

      第六,退票管理:機(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ì) Android 先有了一個(gè)大概的了解,這個(gè)課程不一定能讓我們很好的掌握 Android 的理念或者開(kāi)發(fā),但是能夠讓我們對(duì) Android 產(chǎn)生濃厚的興趣,讓我們?nèi)计鹛剿鰽ndroid 的欲望,我想這樣就已經(jīng)足夠了。

      第三篇:如何學(xué)習(xí)安卓

      如何學(xué)習(xí)安卓

      想學(xué)編程開(kāi)發(fā),那要先會(huì)一門(mén)編程語(yǔ)言,現(xiàn)在可以試著去學(xué)學(xué)C語(yǔ)言,雖然這個(gè)安卓沾不上邊,但是,C語(yǔ)言的編程思想還是很重要的,學(xué)完了C語(yǔ)言之后,他的語(yǔ)法基本上和所有的編程語(yǔ)言都很相像,能影響你的思維,幫助你理解其他的編程語(yǔ)言的。之后呢,在好好看看《數(shù)據(jù)結(jié)構(gòu)》,這很重要。然后再去學(xué)學(xué)Java語(yǔ)言,因?yàn)锳ndroid的應(yīng)用的開(kāi)發(fā)語(yǔ)言用的是Java,所以一定要好好學(xué)習(xí)。

      最后了解下數(shù)據(jù)庫(kù),我們?cè)趯W(xué)習(xí)數(shù)據(jù)庫(kù)之前都先學(xué)了《數(shù)據(jù)庫(kù)原理》《離散數(shù)學(xué)》《關(guān)系代數(shù)》,有了這些基礎(chǔ)之后再去學(xué)數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)也有很多可以選擇的,推薦mysql。

      加油!

      第四篇:安卓實(shí)驗(yàn)報(bào)告

      安卓實(shí)驗(yàn)報(bào)告

      班級(jí):學(xué)號(hào):姓名:

      xxxxx

      11111111

      xxxx

      實(shí)驗(yàn)一:Activity生命周期的測(cè)試

      一:實(shí)驗(yàn)?zāi)康?/p>

      掌握使用Eclipse開(kāi)發(fā)Android應(yīng)用開(kāi)發(fā)程序的方法; 掌握Android虛擬設(shè)備的創(chuàng)建方法; 了解Android的程序結(jié)構(gòu);

      了解使用命令行創(chuàng)建Android程序方法;

      了解Activity生命周期,理解Activity事件回調(diào),onRestoreInstanceState()和 onSaveInstanceState兩個(gè)函數(shù)的使用。

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      (1)正常啟動(dòng)ActivityLife,然后單擊用戶界面的“結(jié)束程序”按鈕關(guān)閉程序。

      (2)正常啟動(dòng)ACtivityLife,然后通過(guò)“撥號(hào)鍵”啟動(dòng)內(nèi)置的撥號(hào)程序,再通過(guò)“回 退建” 退出撥號(hào)程序,使ActivityLife重新顯示在屏幕中。

      四:實(shí)驗(yàn)核心代碼

      package com.example.activitylife;

      import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.os.Build;

      public class MainActivity extends Activity { private static String TAG=“LIFECYCLE”;@Override

      protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);Log.i(TAG,“(1)onCreate()”);Button button =(Button)findViewById(R.id.btn_finish);button.setOnClickListener(new OnClickListener(){

      public void onClick(View view){

      // TODO Auto-generated method stub

      finish();

      } });}

      @Override

      protected void onStart(){ // TODO Auto-generated method stub

      super.onStart();Log.i(TAG,“(2)onStart()”);} @Override

      protected void onRestoreInstanceState(Bundle savedInstanceState){ // TODO Auto-generated method stub

      super.onRestoreInstanceState(savedInstanceState);Log.i(TAG,“(3)onRestoreInstanceState()”);} @Override

      protected void onResume(){ // TODO Auto-generated method stub

      super.onResume();Log.i(TAG,“(4)onResume()”);} @Override

      protected void onSaveInstanceState(Bundle outState){ // TODO Auto-generated method stub

      super.onSaveInstanceState(outState);Log.i(TAG,“(5)onSaveInstanceState()”);} @Override

      protected void onRestart(){ // TODO Auto-generated method stub

      super.onRestart();Log.i(TAG,“(6)onRestart()”);} @Override

      protected void onPause(){ // TODO Auto-generated method stub

      super.onPause();Log.i(TAG,“(7)onPause()”);} @Override

      protected void onStop(){ // TODO Auto-generated method stub

      super.onStop();Log.i(TAG,“(8)onStop()”);} @Override

      protected void onDestroy(){ // TODO Auto-generated method stub

      super.onDestroy();Log.i(TAG,“(9)onDestroy()”);} } 五:運(yùn)行結(jié)果截圖:

      實(shí)驗(yàn)二:用戶界面——自我介紹

      一:實(shí)驗(yàn)?zāi)康模?/p>

      了解各種界面控件的使用方法;

      掌握按鍵事件和觸摸事件的處理方法;

      掌握radioButton和radioGroup的使用方法。

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      要求寫(xiě)一個(gè)自我介紹的安卓應(yīng)用,包括姓名,性別,愛(ài)好,其中性別用radioButton選項(xiàng)編寫(xiě),點(diǎn)擊提交時(shí),姓名,性別,愛(ài)好會(huì)在下面顯示出來(lái)。

      四:實(shí)驗(yàn)核心代碼:

      public class MainActivity extends Activity { private EditText editText1;private EditText editText2;private EditText editText3;private TextView textView1;private TextView textView2;private TextView textView3;private RadioGroup radioGroup;private RadioButton radioButton1;private RadioButton radioButton2;private Button button;protected void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      editText1 =(EditText)findViewById(R.id.e1);

      editText2 =(EditText)findViewById(R.id.e2);

      textView1 =(TextView)findViewById(R.id.t1);

      textView2 =(TextView)findViewById(R.id.t2);

      textView3 =(TextView)findViewById(R.id.t3);

      radioGroup =(RadioGroup)findViewById(R.id.RadioGroup1);

      radioButton1 =(RadioButton)findViewById(R.id.RadioButton1);

      radioButton2 =(RadioButton)findViewById(R.id.RadioButton2);

      button =(Button)findViewById(R.id.button1);

      radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){

      public void onCheckedChanged(RadioGroup arg0, final int arg1){

      button.setOnClickListener(new View.OnClickListener(){

      public void onClick(View arg0){

      String str = editText1.getText().toString().trim();

      String str1 = editText2.getText().toString().trim();

      textView1.setText(“姓名:”+str);

      textView3.setText(“愛(ài)好:”+str1);

      if(arg1 == R.id.RadioButton1)

      textView2.setText(“性別:”+“男”);

      else if(arg1 == R.id.RadioButton2)

      textView2.setText(“性別:”+“女”);

      }

      });

      }

      });} } 五:運(yùn)行結(jié)果截圖:

      實(shí)驗(yàn)三:不同界面的切換

      一:實(shí)驗(yàn)?zāi)康?/p>

      掌握各種界面布局的特點(diǎn)和使用方法;

      掌握選項(xiàng)菜單,子菜單和快捷菜單的使用方法。

      二;實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三;實(shí)驗(yàn)內(nèi)容:

      設(shè)計(jì)一個(gè)Tab標(biāo)簽頁(yè),實(shí)現(xiàn)LinearLayout,RelativeLayout,AbsoluteLayout三種分頁(yè)面之間的切換,每個(gè)頁(yè)面的內(nèi)容包括用戶名和確定,取消兩個(gè)按鈕

      四:實(shí)驗(yàn)核心代碼: AndroidMainfest.xml:

      public class MainActivity extends TabActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TabHost tabHost=getTabHost();LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab2,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab3,tabHost.getTabContentView(),true);tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“線性布局”).setContent(R.id.layout01));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“絕對(duì)布局”).setContent(R.id.layout02));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“相對(duì)布局”).setContent(R.id.layout03));} } Tab1,java public class Tab1 extends Activity { public void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.tab1);} }

      Tab2.java public class Tab2 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab2);} }

      Tab3.java public class Tab3 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab3);} }

      五:運(yùn)行結(jié)果截圖:

      實(shí)驗(yàn)四:登陸界面和廣播消息

      一:實(shí)驗(yàn)?zāi)康?/p>

      了解使用Intent進(jìn)行組件通信的原理; 了解Intent過(guò)濾器的原理與匹配機(jī)制;

      掌握發(fā)送和接受廣播消息的方法。

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      先寫(xiě)一個(gè)登陸界面,包括用戶名,密碼,點(diǎn)擊登陸時(shí)實(shí)現(xiàn)頁(yè)面的跳轉(zhuǎn)功能,在第二個(gè)頁(yè)面使用Intent發(fā)送消息,并調(diào)用sendBroadcast()函數(shù)把Intent攜帶的消息傳送出去,用BroadcastReceiver接受廣播消息,在頁(yè)面下方顯示廣播內(nèi)容。

      四;實(shí)驗(yàn)核心代碼:

      public class MainActivity extends Activity { private Button button;@Override

      protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener(){

      public void onClick(View arg0){

      Intent intent=new Intent(MainActivity.this,Second.class);

      startActivity(intent);

      } });} } public class Second extends Activity { private Button button2;private EditText editText;protected void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.second);

      Intent intent=getIntent();

      editText=(EditText)findViewById(R.id.e1);

      button2=(Button)findViewById(R.id.button2);

      button2.setOnClickListener(new View.OnClickListener(){

      public void onClick(View arg0){

      Intent intent=new

      Intent(“com.example.broadcasttest.MY_BROADCAST”);

      intent.putExtra(“message”, editText.getText().toString());

      sendBroadcast(intent);

      }

      });

      }

      public class MyBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent){

      String msg=intent.getStringExtra(“message”);

      Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();} }

      android:name=“.Second”>

      五:運(yùn)行結(jié)果截圖

      實(shí)驗(yàn)五:Service綁定實(shí)現(xiàn)數(shù)據(jù)運(yùn)算

      一:實(shí)驗(yàn)?zāi)康?/p>

      了解Service的原理和用途;

      掌握本地服務(wù)的管理和方法; 掌握服務(wù)的隱式啟動(dòng)和顯示啟動(dòng)方法;

      掌握遠(yuǎn)程服務(wù)的綁定和調(diào)用方法。

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      以綁定方式使用Service,獲取Service實(shí)例,當(dāng)點(diǎn)擊綁定服務(wù)時(shí)可以實(shí)現(xiàn)兩個(gè)數(shù)的求差和比較大小功能,并輸出結(jié)果,當(dāng)點(diǎn)擊取消綁定服務(wù)時(shí),則無(wú)法運(yùn)算。

      四:實(shí)驗(yàn)核心代碼

      public class MathService extends Service{ private final IBinder mBinder=new LocalBinder();public class LocalBinder extends Binder{ MathService getService(){

      return MathService.this;} } public IBinder onBind(Intent intent){ Toast.makeText(this, “本地綁定:MathService”,Toast.LENGTH_SHORT).show();return mBinder;}

      public boolean onUnbind(Intent intent){ Toast.makeText(this, “取消本地綁定:MathService”, Toast.LENGTH_SHORT).show();return false;}

      public long sub(long a,long b){ return a-b;}

      public int compare(long a,long b){ if(a>b)return 1;else if(a==b)return 0;else return-1;

      } }

      public class MainActivity extends Activity { private MathService mathService;private Button button1;private Button button2;private Button button3;private Button button4;private EditText editText1;private EditText editText2;private EditText editText3;private boolean isBound=false;@Override

      protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText1=(EditText)findViewById(R.id.e1);editText2=(EditText)findViewById(R.id.e2);editText3=(EditText)findViewById(R.id.e3);button1=(Button)findViewById(R.id.but1);button2=(Button)findViewById(R.id.but2);button3=(Button)findViewById(R.id.but3);button4=(Button)findViewById(R.id.but4);button1.setOnClickListener(new View.OnClickListener(){

      public void onClick(View v){

      if(!isBound){

      final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);

      bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);

      isBound=true;

      }

      }

      });button4.setOnClickListener(new View.OnClickListener(){

      public void onClick(View v){ if(isBound){

      isBound=false;unbindService(mConnection);

      mathService=null;}

      } });

      button2.setOnClickListener(new View.OnClickListener(){

      public void onClick(View v){

      if(mathService==null){

      editText3.setText(“未綁定服務(wù)”);

      return;

      }

      String a = editText1.getText().toString();

      long a1 = Long.parseLong(a);

      String b = editText2.getText().toString();

      long b1 = Long.parseLong(b);

      long result=mathService.sub(a1, b1);

      String msg=String.valueOf(a1)+“-”+String.valueOf(b)+

      “=”+String.valueOf(result);

      editText3.setText(msg);

      } });

      button3.setOnClickListener(new View.OnClickListener(){

      public void onClick(View v){

      if(mathService==null){

      editText3.setText(“未綁定服務(wù)”);

      return;

      }

      String a = editText1.getText().toString();

      long a1 = Long.parseLong(a);

      String b = editText2.getText().toString();

      long b1 = Long.parseLong(b);

      long result=mathService.compare(a1, b1);

      if(result==1){

      editText3.setText(a+“>”+b);

      }

      else if(result==0){

      editText3.setText(a+“=”+b);

      }

      else {

      editText3.setText(a+“<”+b);

      }

      } });} private ServiceConnection mConnection=new ServiceConnection(){

      public void onServiceDisconnected(ComponentName arg0){

      mathService=null;

      }

      public void onServiceConnected(ComponentName name, IBinder service){

      mathService=((MathService.LocalBinder)service).getService();

      } };}

      實(shí)驗(yàn)六:SQLite實(shí)現(xiàn)用戶的增刪改查

      一:實(shí)驗(yàn)?zāi)康?/p>

      了解SQLite數(shù)據(jù)庫(kù)的特點(diǎn)和體系及結(jié)構(gòu);

      掌握SQLite數(shù)據(jù)庫(kù)的建立和操作方法;

      理解ContentProvide的用途和原理;

      掌握ContentProvider的創(chuàng)建和使用方法。

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      使用SQlite數(shù)據(jù)庫(kù)實(shí)現(xiàn)用戶(包括:姓名,年齡,身高)的添加數(shù)據(jù),全部顯示,清除顯示,全部刪除,ID刪除,ID查詢,ID更新的功能。

      四:實(shí)驗(yàn)核心代碼

      public class MainActivity extends ActionBarActivity { private EditText et_name;private EditText et_sex;private EditText et_department;private EditText et_id;private EditText et_salary;private MyOpenHelper oh;private SQLiteDatabase db;private TextView tv;private LinearLayout ll;@Override

      protected void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      oh = new MyOpenHelper(MainActivity.this, “test.db”, null, 1);

      db = oh.getWritableDatabase();

      et_name =(EditText)findViewById(R.id.et_name);

      et_sex =(EditText)findViewById(R.id.et_sex);

      et_department =(EditText)findViewById(R.id.et_department);

      et_salary =(EditText)findViewById(R.id.et_salary);

      et_id =(EditText)findViewById(R.id.et_id);

      ll =(LinearLayout)findViewById(R.id.ll);}

      public void add(View v){

      db = oh.getWritableDatabase();

      String name=et_name.getText().toString();

      String sex=et_sex.getText().toString();

      String department=et_department.getText().toString();

      String salary=et_salary.getText().toString();

      ContentValues values=new ContentValues();

      values.put(“name”,name);

      values.put(“sex”, sex);

      values.put(“department”,department);

      values.put(“salary”, salary);

      db.insert(“staff”, null, values);

      tv=new TextView(MainActivity.this);

      tv.setText(“添加成功”);

      db.close();} public void show(View v){

      db = oh.getWritableDatabase();

      Cursor cursor=db.query(“staff”, null, null, null, null, null, null, null);

      while(cursor.moveToNext()){

      String id=cursor.getString(cursor.getColumnIndex(“_id”));

      String name=cursor.getString(cursor.getColumnIndex(“name”));

      String sex=cursor.getString(cursor.getColumnIndex(“sex”));

      String department=cursor.getString(cursor.getColumnIndex(“department”));

      String salary=cursor.getString(cursor.getColumnIndex(“salary”));

      tv=new TextView(MainActivity.this);

      tv.setText(“ID:”+id+“;”+“Name:”+name+“;”+“Sex:”+sex+“;”+“Department:”+department+“;”+“Salary”+salary);

      ll.addView(tv);

      }

      db.close();} public void clear(View v){

      ll.removeAllViews();} public void deleteAll(View v){

      db = oh.getWritableDatabase();

      db.delete(“staff”, null, null);

      tv=new TextView(MainActivity.this);

      tv.setText(“刪除成功”);

      db.close();}

      public void deleteById(View v){

      db = oh.getWritableDatabase();

      String id=et_id.getText().toString();

      db.delete(“staff”, “_id=?”, new String[]{id});

      db.close();

      tv=new TextView(MainActivity.this);

      tv.setText(“ID刪除成功”);} public void findById(View v){

      db = oh.getWritableDatabase();

      String id=et_id.getText().toString();

      Cursor cursor=db.query(“staff”, null, “_id=?”, new String[]{id}, null, null, null, null);

      while(cursor.moveToNext()){

      id=cursor.getString(cursor.getColumnIndex(“_id”));

      String name=cursor.getString(cursor.getColumnIndex(“name”));

      String sex=cursor.getString(cursor.getColumnIndex(“sex”));

      String department=cursor.getString(cursor.getColumnIndex(“department”));

      String salary=cursor.getString(cursor.getColumnIndex(“salary”));

      tv=new TextView(MainActivity.this);

      tv.setText(id+“;”+name+“;”+sex+“;”+department+“;”+salary);

      ll.addView(tv);

      tv=new TextView(MainActivity.this);

      tv.setText(“ID查詢成功”);

      }

      db.close();} public void updateById(View v){

      db = oh.getWritableDatabase();

      String id=et_id.getText().toString();

      String name=et_name.getText().toString();

      String sex=et_sex.getText().toString();

      String department=et_department.getText().toString();

      String salary=et_salary.getText().toString();

      ContentValues values=new ContentValues();

      values.put(“name”,name);

      values.put(“sex”, sex);

      values.put(“department”,department);

      values.put(“salary”, salary);

      db.update(“staff”, values, “_id=?”, new String[]{id});

      tv=new TextView(MainActivity.this);

      tv.setText(“更新ID成功”);

      db.close();} }

      public class MyOpenHelper extends SQLiteOpenHelper {

      public MyOpenHelper(Context context, String name, CursorFactory factory,int version){

      super(context, name, factory, version);}

      @Override

      public void onCreate(SQLiteDatabase db){

      db.execSQL(“create table staff(_id integer primary key autoincrement,name text,sex text,department text,salary float)”);}

      @Override

      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){} }

      五:運(yùn)行結(jié)果截圖

      實(shí)驗(yàn)七:天氣預(yù)報(bào) 一:實(shí)驗(yàn)?zāi)康?/p>

      了解位置服務(wù)的概念;

      了解地圖密鑰的申請(qǐng)方法;

      掌握獲取地理信息的方法;

      二:實(shí)驗(yàn)設(shè)備

      Eclipse 開(kāi)發(fā)Android 應(yīng)用 Android虛擬設(shè)備(AVD)

      三:實(shí)驗(yàn)內(nèi)容

      寫(xiě)一個(gè)項(xiàng)目,實(shí)現(xiàn)顯示天氣預(yù)報(bào)的用戶界面,顯示已發(fā)送SMS短信的用戶界面,不同地區(qū)天氣的轉(zhuǎn)換

      四:實(shí)驗(yàn)核心代碼

      package com.example.weather;

      import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;

      import net.sf.json.JSONArray;import net.sf.json.JSONObject;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;

      import com.zy.bean.Sms;import com.zy.bean.Weather;

      public class MainActivity extends Activity { private MyConn conn = new MyConn();;private EditText et_city;private TextView tv_result;private ImageView iv_weather;private Handler handler;private Intent intent;private MyOpenHelper oh;private ServiceFunctions sFunctions;private MyArrayAdapter myArrayAdapter = null;private ListView lv;private int a = 1;private Weather weather;private List smsList = null;

      @Override protected void onCreate(Bundle savedInstanceState){

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      oh = new MyOpenHelper(MainActivity.this, “weatherdemo.db”, null, 1);

      // System.out.println(“數(shù)據(jù)庫(kù)創(chuàng)建完”);

      et_city =(EditText)findViewById(R.id.et_city);

      tv_result =(TextView)findViewById(R.id.tv_result);

      iv_weather =(ImageView)findViewById(R.id.iv_weather);

      lv =(ListView)findViewById(R.id.lv);

      // System.out.println(“l(fā)v找到了”);

      intent = new Intent(this, MyService.class);

      startService(intent);

      Toast.makeText(MainActivity.this, “服務(wù)啟動(dòng)”, 0).show();

      bindService(intent, conn, BIND_AUTO_CREATE);

      Toast.makeText(MainActivity.this, “服務(wù)綁定”, 0).show();

      handler = new Handler(new Handler.Callback(){

      @Override

      public boolean handleMessage(Message msg){

      final Weather weather =(Weather)msg.obj;

      tv_result.setText(weather.toString());

      }

      new Thread(new Runnable(){ @Override public void run(){

      // TODO Auto-generated method stub

      try {

      URL url = new URL(weather.getDayPictureUrl());

      HttpURLConnection con =(HttpURLConnection)url

      .openConnection();

      con.setRequestMethod(“GET”);

      if(con.getResponseCode()== 200){

      final Bitmap bitmap = BitmapFactory

      .decodeStream(con.getInputStream());

      runOnUiThread(new Runnable(){

      }

      @Override

      public void run(){

      // TODO Auto-generated method stub

      iv_weather.setImageBitmap(bitmap);

      }

      });}

      } catch(Exception e){

      // TODO Auto-generated catch block e.printStackTrace();}

      }).start();

      return false;} });class MyConn implements ServiceConnection {

      @Override public void onServiceConnected(ComponentName name, IBinder service){ sFunctions =(ServiceFunctions)service;} @Override public void onServiceDisconnected(ComponentName name){

      } } class MyArrayAdapter extends ArrayAdapter {

      } public MyArrayAdapter(Context context, int resource,int textViewResourceId, List objects){ super(context, resource, textViewResourceId, objects);} public void saveWeather(View view){ if(a == 1){

      sFunctions.insertInfo(weather, oh);

      a++;} else {

      sFunctions.updateInfoById(“1”, weather, oh);} Toast.makeText(MainActivity.this, “保存天氣信息成功”, 0).show();} public void show(View view){ smsList = sFunctions.findAll(oh);if(smsList.size()> 0){

      List sList = new ArrayList();

      for(Sms sms : smsList){

      String s = sms.toString();

      sList.add(s);

      }

      if(sList.size()> 0){

      myArrayAdapter = new MyArrayAdapter(MainActivity.this,R.layout.second, R.id.tv_show, sList);

      lv.setAdapter(myArrayAdapter);

      } } }

      public void getWeather(View view){

      new Thread(new Runnable(){

      String city = et_city.getText().toString();

      @Override

      public void run(){

      try {

      URL url = new URL(“http://api.map.baidu.com/telematics/v3/weather?location=”

      + URLEncoder.encode(city)

      + “&output=json&ak=QLZmpAbwFlWreQ28kLVgvKEC”);

      HttpURLConnection con =(HttpURLConnection)url

      .openConnection();

      con.setRequestMethod(“GET”);

      int code = con.getResponseCode();

      if(code == 200){

      BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

      JSONObject json = JSONObject.fromObject(reader

      .readLine());

      // System.out.println(obj.toString());

      JSONArray array = json.getJSONArray(“results”);

      JSONObject obj = array.getJSONObject(0);

      JSONObject weather_data = obj.getJSONArray(“weather_data”).getJSONObject(0);

      weather = new Weather(obj.getString(“currentCity”), obj

      .getString(“pm25”), weather_data

      .getString(“date”), weather_data

      .getString(“weather”), weather_data

      .getString(“wind”), weather_data

      .getString(“temperature”), weather_data

      .getString(“dayPictureUrl”), weather_data

      .getString(“nightPictureUrl”));

      Message msg = new Message();

      msg.obj = weather;

      handler.sendMessage(msg);

      }

      } catch(Exception e){

      // TODO Auto-generated catch block

      e.printStackTrace();

      }

      }

      }).start();} }

      package com.example.weather;

      import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;

      public class MyOpenHelper extends SQLiteOpenHelper {

      public MyOpenHelper(Context context, String name, CursorFactory factory,int version){

      super(context, name, factory, version);}

      @Override public void onCreate(SQLiteDatabase db){

      db.execSQL(“create table sms(_id integer primary key autoincrement,sms_sender text,sms_body text,sms_receive_time text,return_result text)”);

      db.execSQL(“create table weatherinfo(_id integer primary key autoincrement,info text)”);}

      @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

      } }

      package com.example.weather;

      import java.util.List;

      import android.app.Service;import android.content.Intent;import android.content.ServiceConnection;import android.os.Binder;import android.os.IBinder;

      import com.zy.bean.Sms;import com.zy.bean.Weather;

      public class MyService extends Service { private ISmsDaoImpl daoImpl;private MyBinder myBinder = new MyBinder();

      @Override public IBinder onBind(Intent intent){

      return myBinder;}

      @Override public void unbindService(ServiceConnection conn){

      super.unbindService(conn);}

      class MyBinder extends Binder implements ServiceFunctions{

      public long insertSms(Sms sms,MyOpenHelper oh){

      return MyService.this.insertSms(sms,oh);

      }

      public List findAll(MyOpenHelper oh){

      return MyService.this.findAll(oh);

      }

      public long insertInfo(Weather w,MyOpenHelper oh){

      return MyService.this.insertInfo(w,oh);

      }

      public int updateInfoById(String id, Weather w,MyOpenHelper oh){

      return MyService.this.updateInfoById(id, w,oh);

      } }

      public long insertSms(Sms sms,MyOpenHelper oh){

      daoImpl=new ISmsDaoImpl(oh);

      long id = daoImpl.insertSms(sms);

      return id;}

      public List findAll(MyOpenHelper oh){

      daoImpl=new ISmsDaoImpl(oh);

      List smsList = daoImpl.findAll();

      return smsList;}

      public long insertInfo(Weather w,MyOpenHelper oh){

      daoImpl=new ISmsDaoImpl(oh);

      long id = daoImpl.insertInfo(w);

      return id;}

      public int updateInfoById(String id, Weather w,MyOpenHelper oh){

      daoImpl=new ISmsDaoImpl(oh);

      int num = daoImpl.updateInfoById(id, w);

      return num;} } 五:運(yùn)行結(jié)果截圖

      第五篇:最佳安卓游戲

      2010 最易上癮游戲 最易上癮游戲 憤怒的小鳥(niǎo) Angry Birds 瞄準(zhǔn)射擊 shoot U!涂鴉切割 Slice It!碧湖垂釣 Fishin2 Go 涂鴉跳躍 Doodle Jump 重力滾球迷宮 Labyrinth 水果忍者 Fruit Ninja 扔紙團(tuán) Paper Toss 極限挑戰(zhàn) The Impossible Game 炸毀 Blow up 物理空間 Space Physics 2010 最具人氣游戲 憤怒的小鳥(niǎo) Angry Birds 會(huì)說(shuō)話的湯姆貓 Talking Tom Cat 口袋傳奇 Pocket Legends 地牢守護(hù)者 Dungeon Defenders First Wave 和雛子一起做運(yùn)動(dòng) 一起高爾夫 2 Lets Golf 2 HD 會(huì)說(shuō)話的圣誕老人 Talking Santa 植物大戰(zhàn)僵尸 3 細(xì)胞分裂 5 Splinter Cell Conviction HD 阿凡達(dá) 3D Avatar 天空的榮耀 Skies of Glory 2010 最具創(chuàng)意游戲 你畫(huà)我猜 What The Doodle 食物大合作 Spaghetti Marshmallows 繁忙的辦公室 Office Rush 小羊快跑 SheepRun 吉他 Guitar Solo 爆竹娃 Squibble 火箭兔子 Rocket Bunnies 扔紙團(tuán) Paper Toss 水果忍者 Fruit Ninja 涂鴉跳躍 Doodle Jump 2010 最佳競(jìng)速游戲 都市賽車 5 Asphalt5 極品飛車 13 變速 Need For Speed:Shift 速度與激情之地下狂飆 Fast&Furious Adrenaline 魯莽賽車 Reckless Racing 3D 超音速飛行 TurboFly 3D 摩托大賽 Motorbike GP 瘋狂卡丁車 Krazy Kart Racing 穿山甲大冒險(xiǎn) Armadillo Roll

      口袋賽車 PocketRacing 我的紙飛機(jī) 2 My Paper Plane2 2010 最佳塔防游戲 機(jī)器人塔防 Robo Defense 城堡勇士 Castle Warriors 槍之榮耀 Guns'n Glory 喪尸圍城 Grave defence 植物大戰(zhàn)僵尸 Plants vs Zombies 失落的戰(zhàn)役 Towser Defense 水晶塔防 Crystallight Defence 別惹惡魔 leave Devil alone 農(nóng)夫大戰(zhàn)外星人 Rednecks vs Aliens 釘子戶大戰(zhàn)拆遷隊(duì) 2010 最佳對(duì)戰(zhàn)游戲 地牢守護(hù)者 Dungeon Defenders First Wave 天空的榮耀 Skies of Glory 狂野飆車 5 Asphalt5 迷你空中軍隊(duì) Mini Squadron 三國(guó)殺 FIFA10 足球盛宴 EA FIFA 10 瘋狂卡丁車 Krazy Kart Racing 史瑞克 3D 賽車 Shrek Karting HD 2010 最佳益智游戲 涂鴉切割 Slice It 重力球迷宮 Labyrinth 超級(jí)跌落 Super tumble 炸毀 Blow up 軌道建設(shè) X Construction 煉金術(shù) Alchemy 飛機(jī)領(lǐng)航員 Flightfrenzy 功夫泡泡球 Bonsai Blast 俄羅斯方塊 Terris 景麗時(shí)間 Tangram Time 2010 最佳重力感應(yīng)游戲 重力球迷宮 Labyrinth 保齡球 iBowl 穿山甲大冒險(xiǎn) Armadillo Roll 專業(yè)模擬飛行 X Plane Flight Simulator 碧湖垂釣 Fishin Go 涂鴉跳躍 Doodle Jump 小鐵球歷險(xiǎn)記 Little Metal Ball 極限摩托車 MX Moto 3D 重力球完整版 Prism 3D 天生殺人狂之食人鯊 3D Hungry Shark

      2010 最佳模擬經(jīng)營(yíng)游戲 模擬人生 3 The Sims 瘋狂農(nóng)場(chǎng) Farm Frinzy 美女餐廳 2 Diner Dash 游戲發(fā)展國(guó) Game Dev Story 海盜餐廳 Barrr 口袋上帝 Pocket God 飯店大亨 Hotel Mogul 瘋狂壽司店 歡樂(lè)王國(guó) Haypi kingdom 貨物管理員 Cargo 2010 最佳角色游戲 澤諾尼亞傳奇系列 ZENONIA 地牢守護(hù)者 Dungeon Defenders First Wave 蜘蛛俠 SpiderMan Tot

      al Mayhem HD 地牢獵人 Dungeon Hunter 神秘傳說(shuō)阿卡納 Legends Arcana 惡魔獵手 CaligoChaser 斯巴達(dá)英雄 Hero of Sparta 罪惡都市之西海岸的喧囂 Gangstar West Coast Hustle 2010 最佳體育游戲 最佳體育游戲 實(shí)況足球 2011 Real Soccer 2011 勁爆棒球 Homerun Battle 3D 高山滑雪 Big Mountain Snowboarding 超級(jí)棒球明星 2011 Baseball Superstars 2011 一起高爾夫 2 Lets Golf 2 HD 魔幻保齡球 Magic Bowling 3D 臺(tái)球大師 3d pool master 美式足球 Backbreaker Football 3D 投籃 Basketball Shots 3D 09 國(guó)際橄欖球賽 Rugby Nations09 手指任意球 Flick Kick Football 2010 最佳網(wǎng)游 口袋傳奇 Pocket Legends 明珠三國(guó) 2011 最值得期待游戲 植物大戰(zhàn)僵尸 Plants vs Zombies 割繩子 Cut the Rope


      下載安卓學(xué)習(xí)心得word格式文檔
      下載安卓學(xué)習(xí)心得.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        安卓實(shí)習(xí)報(bào)告

        通信與電子信息專業(yè)實(shí)訓(xùn)報(bào)告項(xiàng)目名稱:基于android的游戲開(kāi)發(fā)班 級(jí) 10通信1班姓 名學(xué) 號(hào)指導(dǎo)教師 成 績(jī)實(shí)訓(xùn)時(shí)間:年月日—目錄 一、實(shí)訓(xùn)目的及其意義 .............................

        安卓手機(jī)培訓(xùn)

        安卓系統(tǒng): 簡(jiǎn)介:Android一詞的本義指“機(jī)器人”,同時(shí)也是Google于2007年11月5日宣布的基于Linux平臺(tái)的開(kāi)源手機(jī)操作系統(tǒng)的名稱,該平臺(tái)由操作系統(tǒng)、中間件、用戶界面和應(yīng)用軟件組......

        個(gè)人事跡材料-安卓

        個(gè)人事跡材料 我是經(jīng)濟(jì)管理系11級(jí)酒店管理的方亮,自入團(tuán)以來(lái)積極參加團(tuán)組織的各類活動(dòng)。努力完成團(tuán)組織交給的任務(wù),時(shí)時(shí)刻刻記住我應(yīng)該做什么,如何做好的思想理念。 我深刻認(rèn)......

        安卓課程設(shè)計(jì)報(bào)告

        安 卓 課 程 設(shè) 計(jì) 班 級(jí) 09級(jí)計(jì)算機(jī)二班 學(xué) 號(hào) 20097923 姓 名 郭丹 目錄 第1章安卓應(yīng)用程序開(kāi)發(fā)背景 .......................................................... 3 §1......

        安卓系統(tǒng)簡(jiǎn)介

        安卓系統(tǒng)簡(jiǎn)介 操作系統(tǒng)是計(jì)算機(jī)系統(tǒng)的基本組成部分,計(jì)算機(jī)技術(shù)的飛速發(fā)展和日益廣泛的應(yīng)用使得操作系統(tǒng)的類型,作用、計(jì)算環(huán)境等均發(fā)生了較大的變化。近十年來(lái),新技術(shù)的出現(xiàn)......

        如何學(xué)習(xí)安卓開(kāi)發(fā)

        如何學(xué)習(xí)安卓開(kāi)發(fā)?安卓開(kāi)發(fā)學(xué)習(xí)已經(jīng)成為IT行業(yè)的新潮流。時(shí)下,Android也以其創(chuàng)造力、前瞻性、延續(xù)性和實(shí)現(xiàn)能力成為行業(yè)首領(lǐng),可是怎么學(xué)好Android呢?今天,歐柏泰克的老師告訴你......

        安卓學(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í)要做什......

        安卓市場(chǎng)審核標(biāo)準(zhǔn)(定稿)

        安卓市場(chǎng)審核標(biāo)準(zhǔn) 軟件標(biāo)準(zhǔn) 一、軟件運(yùn)行: 1、須經(jīng)實(shí)機(jī)測(cè)試可順暢運(yùn)行,帶有扣費(fèi)陷阱/惡意侵犯用戶隱私/包含木馬后門(mén)、病毒的軟件,不予通過(guò); 2、須基于android平臺(tái)原生開(kāi)發(fā),如J2M......