蘇州大學(xué)Android【韓冬】期末復(fù)習(xí)_第1頁
蘇州大學(xué)Android【韓冬】期末復(fù)習(xí)_第2頁
蘇州大學(xué)Android【韓冬】期末復(fù)習(xí)_第3頁
蘇州大學(xué)Android【韓冬】期末復(fù)習(xí)_第4頁
蘇州大學(xué)Android【韓冬】期末復(fù)習(xí)_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Android應(yīng)用開發(fā)復(fù)習(xí)題:1 Android的體系結(jié)構(gòu)是怎樣的?請(qǐng)簡要加以說明。Android 的系統(tǒng)架構(gòu)采用了分層架構(gòu)的思想。從上層到底層共包括四層:應(yīng)用層、應(yīng)用框架層、 系統(tǒng)運(yùn)行庫層、 Linux 內(nèi)核層。2 Android程序結(jié)構(gòu)是怎樣的?請(qǐng)簡要加以分析。l src目錄:java 源代碼l gen目錄:BuildConfig.java、R.javal res目錄:res 目錄是資源目錄,可以存放應(yīng)用使用到的各種資源,如 XML 界面文件、圖片、數(shù)據(jù)等。l assets目錄:assets 資源目錄一般可用于存放 html 文件、數(shù)據(jù)庫文件、 javascript 文件等, 還有原始格式

2、的文件.l AndroidManifest.xml:列出了應(yīng)用程序提供的功能,開發(fā)好的各種組件需要在此文件中進(jìn)行配置,當(dāng)應(yīng)用使用到系統(tǒng)內(nèi)置的應(yīng)用還需在此文件中聲明使用權(quán)限3 Handler消息傳遞機(jī)制是怎樣的?試以“計(jì)時(shí)器”的編程舉例加以說明。首先需要在主線程當(dāng)中創(chuàng)建一個(gè) Handler 對(duì)象,并重寫handleMessage()方法。然后當(dāng)子線程中需要進(jìn)行 UI 操作時(shí),就創(chuàng)建一個(gè) Message 對(duì)象,并通過 Handler 將這條消息發(fā)送出去。之后這條消息會(huì)被添加到 MessageQueue 的隊(duì)列中等待被處理,而 Looper 則會(huì)一直嘗試從 MessageQueue 中取出待處理消息

3、,最后分發(fā)回 Handler的 handleMessage()方法中。由于 Handler 是在主線程中創(chuàng)建的,所以此時(shí) handleMessage()方法中的代碼也會(huì)在主線程中運(yùn)行,于是我們?cè)谶@里就可以安心地進(jìn)行 UI 操作了。一條 Message 經(jīng)過這樣一個(gè)流程的輾轉(zhuǎn)調(diào)用后,也就從子線程進(jìn)入到了主線程,從不能更新 UI 變成了可以更新 UI,整個(gè)異步消息處理的核心思想也就是如此。4 什么是進(jìn)程內(nèi)服務(wù)?請(qǐng)編程加以說明。 在同一個(gè)進(jìn)程下調(diào)用的服務(wù),(通常情況下)即在一個(gè)應(yīng)用程序下的服務(wù)。Service 的啟動(dòng)有兩種方式: context.startService() 和 context.bi

4、ndService()。新建一個(gè)MyService繼承自Service,并重寫父類的onCreate()、onStartCommand()和onDestroy()方法。Service與activity通訊:context.bindService()我們首先創(chuàng)建了一個(gè)ServiceConnection的匿名類,在里面重寫了onServiceConnected()方法和onServiceDisconnected()方法,這兩個(gè)方法分別會(huì)在Activity與Service建立關(guān)聯(lián)和解除關(guān)聯(lián)的時(shí)候調(diào)用。bindService()方法接收三個(gè)參數(shù),第一個(gè)參數(shù)就是剛剛構(gòu)建出的Intent對(duì)象,第二個(gè)參數(shù)是

5、前面創(chuàng)建出的ServiceConnection的實(shí)例,第三個(gè)參數(shù)是一個(gè)標(biāo)志位,這里傳入BIND_AUTO_CREATE表示在Activity和Service建立關(guān)聯(lián)后自動(dòng)創(chuàng)建Service,這會(huì)使得MyService中的onCreate()方法得到執(zhí)行,但onStartCommand()方法不會(huì)執(zhí)行。然后如何我們想解除Activity和Service之間的關(guān)聯(lián)怎么辦呢?調(diào)用一下unbindService()方法就可以了,這也是Unbind Service按鈕的點(diǎn)擊事件里實(shí)現(xiàn)的邏輯。5 什么是跨進(jìn)程服務(wù)?請(qǐng)編程加以說明。 通過一個(gè)應(yīng)用程序(客戶端)的Activity調(diào)用另一個(gè)應(yīng)用程序(服務(wù)端)的

6、Service為跨進(jìn)程服務(wù)。由于每個(gè)應(yīng)用程序都運(yùn)行在自己的進(jìn)程空間,并且可以從應(yīng)用程序 UI 運(yùn)行另一個(gè)服務(wù)進(jìn)程,而且經(jīng)常會(huì)在不同的進(jìn)程間傳遞對(duì)象。在 Android 平臺(tái),一個(gè)進(jìn)程通常不能訪問另一個(gè)進(jìn)程的內(nèi)存空間,所以要想對(duì)話,需要將對(duì)象分解成操作系統(tǒng)可以理解的基本單元,并且有序的通過進(jìn)程邊界。 Android 提供了 AIDL 工具來處理這項(xiàng)工作。在 Android 中,如果需要在不同進(jìn)程間實(shí)現(xiàn)通信,就需要用到 AIDL 技術(shù)去完成。AIDL 是一種接口定義語言,編譯器通過*.aidl 文件的描述信息生成符合通信協(xié)議的 Java代碼,無需自己去寫這段繁雜的代碼,只需要在需要的時(shí)候調(diào)用即可,

7、通過這種方式我們就可以完成進(jìn)程間的通信工作。在 Android 中, 每個(gè)應(yīng)用程序都有自己的進(jìn)程,當(dāng)需要在不同的進(jìn)程之間傳遞對(duì)象時(shí),該如何實(shí)現(xiàn)呢? 顯然, Java 中是不支持跨進(jìn)程內(nèi)存共享的。因此要傳遞對(duì)象, 需要把對(duì)象解析成操作系統(tǒng)能夠理解的數(shù)據(jù)格式, 以達(dá)到跨界對(duì)象訪問的目的。我們只是修改了ServiceConnection中的代碼??梢钥吹剑@里首先使用了MyAIDLService.Stub.asInterface()方法將傳入的IBinder對(duì)象傳換成了MyAIDLService對(duì)象,接下來就可以調(diào)用在MyAIDLService.aidl文件中定義的所有接口了。ClientTest中

8、的Activity如果想要和MyService建立關(guān)聯(lián)其實(shí)也不難,首先需要將MyAIDLService.aidl文件從ServiceTest項(xiàng)目中拷貝過來,注意要將原有的包路徑一起拷貝過來,完成后項(xiàng)目的結(jié)構(gòu)如下圖所示:這里先是對(duì)MyAIDLService.Stub進(jìn)行了實(shí)現(xiàn),重寫里了toUpperCase()和plus()這兩個(gè)方法。這兩個(gè)方法的作用分別是將一個(gè)字符串全部轉(zhuǎn)換成大寫格式,以及將兩個(gè)傳入的整數(shù)進(jìn)行相加。然后在onBind()方法中將MyAIDLService.Stub的實(shí)現(xiàn)返回。這里為什么可以這樣寫呢?因?yàn)镾tub其實(shí)就是Binder的子類,所以在onBind()方法中可以直接返

9、回Stub的實(shí)現(xiàn)。我們實(shí)現(xiàn)了 IPerson.Stub 這個(gè)抽象類的 hello 方法,然后再 onBind(Intent)方法中返回我們的 stub 實(shí)例,這樣一來調(diào)用方獲取的 IPerson.Stub 就是我們的這個(gè)實(shí)例, hello 方法也會(huì)按照我們的期望那樣執(zhí)行。我們要重寫 ServiceConnection 中的 onServiceConnected 方法將IBinder 類型的對(duì)象轉(zhuǎn)換成我們的 IPerson 類型。我們?cè)偻ㄟ^服務(wù)端 Service 定義的“ ent.action.AIDLService”這個(gè)標(biāo)識(shí)符來綁定我們所需要的服務(wù),這樣客戶端和服務(wù)端就實(shí)

10、現(xiàn)了通信的連接,我們就可以調(diào)用 IPerson 中的 hello 方法了。使用了MyAIDLService.Stub.asInterface()方法將傳入的IBinder對(duì)象傳換成了MyAIDLService對(duì)象,接下來就可以調(diào)用在MyAIDLService.aidl文件中定義的所有接口了。IPerson 接口中的抽象內(nèi)部類 Stub 繼承 android.os.Binder 類并實(shí)現(xiàn) IPerson 接口, 其中比較重要的方法是 asInterface(IBinder)方法,該方法會(huì)將 IBinder 類型的對(duì)象轉(zhuǎn)換成 IPerson 類型,必要的時(shí)候生成一個(gè)代理對(duì)象返回結(jié)果。6 如何發(fā)送廣

11、播?請(qǐng)編程加以說明。l 因此新建一個(gè) MyBroadcastReceiver 繼承自 BroadcastReceiver,代碼如下所示:public class MyBroadcastReceiver extends BroadcastReceiver Overridepublic void onReceive(Context context, Intent intent) Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();l 然后在 AndroidMa

12、nifest.xml 中對(duì)這個(gè)廣播接收器進(jìn)行注冊(cè)l 然后修改 MainActivity中的代碼,如下所示:public class MainActivity extends Activity Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);button.setOnClickLis

13、tener(new OnClickListener() Overridepublic void onClick(View v) Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");sendBroadcast(intent););可以看到,我們?cè)诎粹o的點(diǎn)擊事件里面加入了發(fā)送自定義廣播的邏輯。首先構(gòu)建出了一個(gè) Intent 對(duì)象,并把要發(fā)送的廣播的值傳入,然后調(diào)用了 Context 的 sendBroadcast()方法將廣播發(fā)送出去,這樣所有監(jiān)聽 com.example.broadcastt

14、est.MY_BROADCAST 這條廣播的廣播接收器就會(huì)收到消息。此時(shí)發(fā)出去的廣播就是一條標(biāo)準(zhǔn)廣播。7 如何接收系統(tǒng)廣播消息?請(qǐng)編程加以說明。 其實(shí)只需要新建一個(gè)類,讓它繼承自 BroadcastReceiver,并重寫父類的 onReceive()方法就行了。這樣當(dāng)有廣播到來時(shí), onReceive()方法就會(huì)得到執(zhí)行,具體的邏輯就可以在這個(gè)方法中處理。registerReceiver(BroadcastReceiver, intentFilter);-oncreate()unregisterReceiver(BroadcastReceiver);-ondestroy()8 什么是觀察者模

15、式?觀察者模式的使用場景是怎樣的?觀察者模式的優(yōu)缺點(diǎn)是什么?試編程加以說明。 l 定義:定義對(duì)象間一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴于它的對(duì)象都會(huì)得到通知并被自動(dòng)更新l 使用場景:Ø 關(guān)聯(lián)行為場景。注意的是,關(guān)聯(lián)行為是可拆分的,而不是組合關(guān)系。Ø 事件多級(jí)觸發(fā)場景Ø 跨系統(tǒng)的消息交換場景,如消息隊(duì)列的處理機(jī)制l 優(yōu)點(diǎn):Ø 觀察者和被觀察這之間是抽象耦合的Ø 建立一套觸發(fā)機(jī)制l 缺點(diǎn):Ø 需要考慮下開發(fā)效率和運(yùn)行效率9 什么是裝飾模式?裝飾模式的使用場景是怎樣的?裝飾模式的優(yōu)缺點(diǎn)是什么?試編程加以說明。 l 裝飾模式

16、就是給一個(gè)對(duì)象增加一些新的功能,而且是動(dòng)態(tài)的,要求裝飾對(duì)象和被裝飾對(duì)象實(shí)現(xiàn)同一個(gè)接口,裝飾對(duì)象持有被裝飾對(duì)象的實(shí)例。l 裝飾器模式的應(yīng)用場景:( 1) 需要擴(kuò)展一個(gè)類的功能。( 2) 動(dòng)態(tài)的為一個(gè)對(duì)象增加功能,而且還能動(dòng)態(tài)撤銷。(繼承不能做到這一點(diǎn),繼承的功能是靜態(tài)的,不能動(dòng)態(tài)增刪。)l 缺點(diǎn):產(chǎn)生過多相似的對(duì)象,不易排錯(cuò)。l 優(yōu)點(diǎn):Ø 裝飾類和被裝飾類可以獨(dú)立發(fā)展,而不會(huì)互相耦合Ø 裝飾模式是繼承關(guān)系的一個(gè)替代方案Ø 裝飾模式可以動(dòng)態(tài)地?cái)U(kuò)展為一個(gè)實(shí)現(xiàn)類的功能10. Executor、ExecutorService和Executors的區(qū)別是什么?l Execut

17、or 是一個(gè)簡單的標(biāo)準(zhǔn)化接口,用于定義類似于線程的自定義子系統(tǒng),包括線程池、異步 IO 和輕量級(jí)任務(wù)框架。根據(jù)所使用的具體 Executor 類的不同,可能在新創(chuàng)建的線程中,現(xiàn)有的任務(wù)執(zhí)行線程中,或者調(diào)用 execute() 的線程中執(zhí)行任務(wù),并且可能順序或并發(fā)執(zhí)行。l ExecutorService提供了多個(gè)完整的異步任務(wù)執(zhí)行框架。 ExecutorService 管理任務(wù)的排隊(duì)和安排, 并允許受控制的關(guān)閉。l Executors 類提供大多數(shù) Executor 的常見類型和配置的工廠方法,以及使用它們的幾種實(shí)用工具方法l Java里面線程池的頂級(jí)接口是 Executor,但是嚴(yán)格意義上講E

18、xecutor并不是一個(gè)線程池,而只是一個(gè)執(zhí)行線程的工具。真正的線程池接口是 ExecutorService。ExecutorService 繼承Executor。Executors 類為創(chuàng)建 ExecutorService 提供了便捷的工廠方法。11. 為什么說Executors類為創(chuàng)建ExecutorService提供了便捷的工廠方法?要配置一個(gè)線程池是比較復(fù)雜的,尤其是對(duì)于線程池的原理不是很清楚的情況下,很有可能配置的線程池不是較優(yōu)的,因此在 Executors 類里面提供了一些靜態(tài)工廠,生成一些常用的線程池。( 1) newCachedThreadPool: 創(chuàng)建一個(gè)可緩存的線程池。如

19、果線程池的大小超過了處理任務(wù)所需要的線程,那么就會(huì)回收部分空閑( 60 秒不執(zhí)行任務(wù))的線程,當(dāng)任務(wù)數(shù)增加時(shí),此線程池又可以智能地添加新線程來處理任務(wù)。此線程池不會(huì)對(duì)線程池大小做限制,線程池大小完全依賴于操作系統(tǒng)(或者說 JVM)能夠創(chuàng)建的最大線程大小。( 2) newFixedThreadPool: 創(chuàng)建固定大小的線程池。每次提交一個(gè)任務(wù)就創(chuàng)建一個(gè)線程,直到線程達(dá)到線程池的最大大小。線程池的大小一旦達(dá)到最大值就會(huì)保持不變,如果某個(gè)線程因?yàn)閳?zhí)行異常而結(jié)束,那么線程池會(huì)補(bǔ)充一個(gè)新線程。( 3) newSingleThreadExecutor: 創(chuàng)建一個(gè)單線程的線程池。這個(gè)線程池只有一個(gè)線程在工作

20、,也就是相當(dāng)于單線程串行執(zhí)行所有任務(wù)。如果這個(gè)唯一的線程因?yàn)楫惓=Y(jié)束,那么會(huì)有一個(gè)新的線程來替代它。此線程池保證所有任務(wù)的執(zhí)行順序按照任務(wù)的提交順序執(zhí)行。( 4) newScheduledThreadPool:創(chuàng)建一個(gè)定長線程池, 此線程池支持定時(shí)以及周期性執(zhí)行任務(wù)的需求。12. MyBatis與JDDC相比的優(yōu)勢是什么?(1) 數(shù)據(jù)庫連接不再過于頻繁。(2) SQL語句比較集中(3) SQL語句參數(shù)比較靈活(4) 支持結(jié)果映射和結(jié)果緩存。(5) SQL 重用度提高。(6) 相對(duì)安全13. 將MyBatis引入到項(xiàng)目中都有哪些步驟?(1)引入 MyBatis 的 JAR 包;(2)配置 MyB

21、atis 的 XML 配置文件;(3)編寫映射接口和 SQL 映射 XML 文件;(4) 在應(yīng)用中使用接口,獲得結(jié)果。14. Fragment的生命周期是什么?試編程加以說明。(1) 當(dāng)一個(gè) Fragment 被創(chuàng)建的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài): onAttach()onCreate()onCreateView()onActivityCreated()。(2) 當(dāng)這個(gè) Fragment 對(duì)用戶可見的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài): onStart()onResume()。(3) 當(dāng)這個(gè) Fragment 進(jìn)入后臺(tái)的時(shí)候,它會(huì)經(jīng)歷以下狀態(tài): onPause()onStop()。(4) 當(dāng)這個(gè) Fragmen

22、t 被銷毀了(或者持有它的 Activity 被銷毀了),它會(huì)經(jīng)歷以下狀態(tài): onPause()onStop()onDestroyView()onDestroy()onDetach()。(5) 一旦 Activity 進(jìn)入 Resumed 狀態(tài)(也就是 Running 狀態(tài)),你就可以自由地添加和刪除 Fragment 了。因此,只有當(dāng) Activity 在 Resumed 狀態(tài)時(shí), Fragment 的生命周期才能獨(dú)立地運(yùn)轉(zhuǎn),其它時(shí)候是依賴于 Activity 的生命周期變化的。15. 如何把Fragment加入到Activity中?試編程加以說明。當(dāng) Fragment 被加入 Activi

23、ty 中時(shí),它會(huì)處在對(duì)應(yīng)的 View Group 中。加載方式:通過 Activity 的布局文件將 Fragment 加入 Activity加載方式:通過編程的方式將 Fragment 加入到一個(gè) ViewGroup 中。16. 如何安裝配置Maven?請(qǐng)簡要加以說明。1 安裝JDK2 下載Maven3 配置環(huán)境變量4 給Maven添加本地倉庫5 配置用戶范圍settings.xml6 錯(cuò)誤處理7 設(shè)置MAVEN_OPTS環(huán)境變量17. 何為Maven坐標(biāo)?何為Maven倉庫?如何編寫POM?l 坐標(biāo):maven 的坐標(biāo)通過 5 個(gè)元素進(jìn)行定義,其中 groupId、 artifactId、

24、 version 是必須的, packaging 是可選的(默認(rèn)為 jar), classifier 是不能直接定義的。² groupId:定義當(dāng)前 Maven 項(xiàng)目所屬的實(shí)際項(xiàng)目, 跟 Java 包名類似,通常與域名反向一一對(duì)應(yīng)。² artifactId:定義當(dāng)前 Maven 項(xiàng)目的一個(gè)模塊,默認(rèn)情況下, Maven 生成的構(gòu)件,其文件名會(huì)以 artifactId 開頭,如 hibernate-core-3.6.5.Final.jar。² version:定義項(xiàng)目版本。² packaging:定義項(xiàng)目打包方式,如 jar, war, pom, zip,

25、默認(rèn)為 jar。² classifier : 定 義 項(xiàng) 目 的 附 屬 構(gòu) 件,如 hibernate-core-3.6.6.Final-sources.jar ,hibernate-core-3.6.6.Final-javadoc.jar,其中 sources 和 javadoc 就是這兩個(gè)附屬構(gòu)件的 classifier。 classifier 不能直接定義,通常由附加的插件幫助生成。l 倉庫:在 Maven 的術(shù)語中,倉庫是一個(gè)位置(place),例如目錄,可以存儲(chǔ)所有的工程 jar 文件、library jar 文件、插件或任何其他的工程指定的文件。Maven 倉庫有三種類

26、型:· 本地(local)· 中央(central)· 遠(yuǎn)程(remote)Maven倉庫就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven項(xiàng)目可以從同一個(gè)Maven倉庫中獲取自己所需要的依賴JAR,這節(jié)省了磁盤資源。l 編寫POM就像Make的Makefile、Ant的build.xml一樣,Maven項(xiàng)目的核心是pom.xml。POM(Project Object Model,項(xiàng)目對(duì)象模型)定義了項(xiàng)目的基本信息,用于描述項(xiàng)目如何構(gòu)建,聲明項(xiàng)目依賴,等等。現(xiàn)在先為Hello World項(xiàng)目編寫一個(gè)最簡單的pom.xml。首先創(chuàng)建一個(gè)名為h

27、elloworld的文件夾,打開該文件夾,新建一個(gè)名為pom.xml的文件,輸入其內(nèi)容,如代碼清單3-1所示。代碼清單3-1 Hello World的POM1. <?xml version="1.0" encoding="UTF-8"?> 2. <project xmlns="/POM/4.0.0" 3. xmlns:xsi="/2001/XMLSchemainstance"

28、; 4. xsi:schemaLocation="/POM/4.0.0  5. /mavenv4_0_0.xsd"> 6. <modelVersion>4.0.0</modelVersion> 7. <groupId>com.juvenxu.mvnbook</groupId> 8. <artifactId>helloworld</artifactId> 

29、;9. <version>1.0SNAPSHOT</version> 10. <name>Maven Hello World Project</name> 11. </project>代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式。緊接著是project元素,project是所有pom.xml的根元素,它還聲明了一些POM相關(guān)的命名空間及xsd元素,雖然這些屬性不是必須的,但使用這些屬性能夠讓第三方工具(如IDE中的XML編輯器)幫助我們快速編輯POM。根元素下的第一個(gè)子元

30、素modelVersion指定了當(dāng)前POM模型的版本,對(duì)于Maven 2及Maven 3來說,它只能是4.0.0。這段代碼中最重要的是包含groupId、artifactId和version的三行。這三個(gè)元素定義了一個(gè)項(xiàng)目基本的坐標(biāo),在Maven的世界,任何的jar、pom或者war都是以基于這些基本的坐標(biāo)進(jìn)行區(qū)分的。groupId定義了項(xiàng)目屬于哪個(gè)組,這個(gè)組往往和項(xiàng)目所在的組織或公司存在關(guān)聯(lián)。譬如在googlecode上建立了一個(gè)名為myapp的項(xiàng)目,那么groupId就應(yīng)該是com.googlecode.myapp,如果你的公司是mycom,有一個(gè)項(xiàng)目為myapp,那么groupId就應(yīng)該

31、是com.mycom.myapp。本書中所有的代碼都基于groupId com.juvenxu.mvnbook。artifactId定義了當(dāng)前Maven項(xiàng)目在組中唯一的ID,我們?yōu)檫@個(gè)Hello World項(xiàng)目定義artifactId為helloworld,本書其他章節(jié)代碼會(huì)分配其他的artifactId。而在前面的groupId為com.googlecode.myapp的例子中,你可能會(huì)為不同的子項(xiàng)目(模塊)分配artifactId,如myapputil、myappdomain、myappweb等。顧名思義,version指定了Hello World項(xiàng)目當(dāng)前的版本1.0SNAPSHOT。SN

32、APSHOT意為快照,說明該項(xiàng)目還處于開發(fā)中,是不穩(wěn)定的版本。隨著項(xiàng)目的發(fā)展,version會(huì)不斷更新,如升級(jí)為1.0、1.1SNAPSHOT、1.1、2.0等。6.5節(jié)會(huì)詳細(xì)介紹SNAPSHOT,第13章會(huì)介紹如何使用Maven管理項(xiàng)目版本的升級(jí)發(fā)布。最后一個(gè)name元素聲明了一個(gè)對(duì)于用戶更為友好的項(xiàng)目名稱,雖然這不是必須的,但還是推薦為每個(gè)POM聲明name,以方便信息交流。沒有任何實(shí)際的Java代碼,我們就能夠定義一個(gè)Maven項(xiàng)目的POM,這體現(xiàn)了Maven的一大優(yōu)點(diǎn),它能讓項(xiàng)目對(duì)象模型最大程度地與實(shí)際代碼相獨(dú)立,我們可以稱之為解耦,或者正交性。這在很大程度上避免了Java代碼和POM

33、代碼的相互影響。比如當(dāng)項(xiàng)目需要升級(jí)版本時(shí),只需要修改POM,而不需要更改Java代碼;而在POM穩(wěn)定之后,日常的Java代碼開發(fā)工作基本不涉及POM的修改。參考書:Android編程權(quán)威指南 18. FragmentManager是如何管理fragment并將它們的視圖添加到activity的視圖層級(jí)結(jié)構(gòu)中的?P122-7.619. android:layout_weight屬性的工作原理是什么?Android:layout_weight屬性告知LinearLayout如何進(jìn)行子組件的布置安排LinearLayout是分兩個(gè)步驟來設(shè)置視圖的寬度的第一步:LinearLayout查看layout

34、_width屬性值第二步:LinearLayoout依據(jù)layout_weight屬性值進(jìn)行額外的空間分配20. 如何使用抽象activity托管fragment?P15021. 如何使用fragment argument?試舉例說明。P16922. 在“Android編程權(quán)威指南- 第12章 對(duì)話框”中,CrimeFragment和DatePickerFragment由同一activity托管。CrimeFragment是如何傳遞數(shù)據(jù)給DatePickerFragment的?DatePickerFragment又是如何返回?cái)?shù)據(jù)給CrimeFragment的?Ø 要傳遞crime記錄

35、日期給DatePickerFragment,需將記錄日期保存在DatePickerFragment的argument bundle中,這樣, DatePickerFragment便可直接獲取到它。Ø 設(shè)置目標(biāo)fragment建立關(guān)聯(lián),可以將CrimeFragment設(shè)置為DataPickerFragment的目標(biāo)fragmentPublic void setTargetFragment(Fragment fragment, int requestCode)傳遞數(shù)據(jù)給目標(biāo)fragment建立CrimeFragment與DataPickerFragment間的聯(lián)系之后,將數(shù)據(jù)返回給Cri

36、meFragment。返回的日期數(shù)據(jù)將作為extra附加給Intent補(bǔ)充了解:l android inflater 用法在實(shí)際開發(fā)中LayoutInflater這個(gè)類還是非常有用的,它的作用類似于findViewById()。不同點(diǎn)是LayoutInflater是用來找res/layout/下的xml布局文件,并且實(shí)例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。 具體作用: 1、對(duì)于一個(gè)沒有被載入或者想要?jiǎng)討B(tài)載入的界面,都需要使用LayoutInflater.inflate()來載入;2、對(duì)于一個(gè)已經(jīng)載入的界面,就可以使

37、用Activiyt.findViewById()方法來獲得其中的界面元素。l FragmentTransaction如果需要添加、刪除、替換Fragment,則需要借助FragmentTransaction對(duì)象,F(xiàn)ragmentTransaction代表Acticity對(duì)Fragment執(zhí)行的多個(gè)改變l Handler“計(jì)時(shí)器”編程布局文件:<LinearLayout xmlns:android="android:layout_width="fill_parent"android:layout_height="fill_parent"an

38、droid:orientation="vertical"android:padding="6dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content" ><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text=

39、"時(shí)間: "android:layout_weight="4"android:textSize="20dp"/><EditTextandroid:id="+id/txttime"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="00:00:00"android:textSize="20dp"android:l

40、ayout_weight="1" /></LinearLayout><Buttonandroid:id="+id/btnstart"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="開始計(jì)時(shí)"android:layout_gravity="center_horizontal"/><Buttonandroid:id=&quo

41、t;+id/btnend"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="停止計(jì)時(shí)"android:layout_gravity="center_horizontal" /></LinearLayout>功能實(shí)現(xiàn)Java 程序中, 定義了一個(gè) Runnable 對(duì)象,重寫了其 run()方法, 該方法實(shí)現(xiàn)間隔 1 秒向 Handler 對(duì)象發(fā)送一條消息, Handler 對(duì)象接收都消息以后設(shè)置編輯框文本,顯示最新計(jì)時(shí)。 啟動(dòng)應(yīng)用程序后,點(diǎn)擊開始計(jì)時(shí), 設(shè)置該按鈕的單擊事件監(jiān)聽,單擊事件定義了一個(gè)接收 Runnable 對(duì)象的 Thread, 借由該 Thread 的 s

溫馨提示

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

評(píng)論

0/150

提交評(píng)論