For investors
股價(jià):
5.36 美元 %For investors
股價(jià):
5.36 美元 %認(rèn)真做教育 專心促就業(yè)
2015年最火的android面試題大全及參考答案。
1. 請(qǐng)描述一下Activity 生命周期。
答: 如下圖所示。共有七個(gè)周期函數(shù),按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 創(chuàng)建Activity時(shí)調(diào)用,設(shè)置在該方法中,還以Bundle的形式提供對(duì)以前存儲(chǔ)的任何狀態(tài)的訪問。
onStart(): Activity變?yōu)樵谄聊簧蠈?duì)用戶可見時(shí)調(diào)用。
onResume(): Activity開始與用戶交互時(shí)調(diào)用(無論是啟動(dòng)還是重新啟動(dòng)一個(gè)活動(dòng),該方法總是被調(diào)用。
onPause(): Activity被暫?;蚴栈豤pu和其他資源時(shí)調(diào)用,該方法用戶保護(hù)活動(dòng)狀態(tài)的,也是保護(hù)現(xiàn)場(chǎng)。
onStop(): Activity被停止并轉(zhuǎn)為不可見階段及后續(xù)的生命周期事件時(shí)調(diào)用。
onRestart(): Activity被重新啟動(dòng)時(shí)調(diào)用。該活動(dòng)仍然在棧中,而不是啟動(dòng)新的Activity。
1、完整生命周期: 即從一個(gè)Activity從出現(xiàn)到消失,對(duì)應(yīng)的周期方法是從onCreate()到onDestroy()。
2、可見生命周期: 當(dāng)Activity處于可以用戶看見的狀態(tài),但不一定能與用戶交互時(shí),將多次執(zhí)行從onStart()到onStop()。
3、前景生命周期: 當(dāng)Activity處于Activity棧最頂端,能夠與其他用戶進(jìn)行交互時(shí),將多次執(zhí)行從onResume()到onPause()。
2. 兩個(gè)Activity之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法。
答: 兩個(gè)Activity之間跳轉(zhuǎn)必然會(huì)執(zhí)行的是下面幾個(gè)方法。
onCreate()//在Activity生命周期開始時(shí)調(diào)用。
onRestoreInstanceState()//用來恢復(fù)UI狀態(tài)。
onRestart()//當(dāng)Activity重新啟動(dòng)時(shí)調(diào)用。
onStart()//當(dāng)Activity對(duì)用戶即將可見時(shí)調(diào)用。
onResume()//當(dāng)Activity與用戶交互時(shí),繪制界面。
onSaveInstanceState()//即將移出棧頂保留UI狀態(tài)時(shí)調(diào)用。
onPause()//暫停當(dāng)前活動(dòng)Activity,提交持久數(shù)據(jù)的改變,停止動(dòng)畫或其他占用GPU資源的東西,由于下一個(gè)Activity在這個(gè)方法返回之前不會(huì)resume,所以這個(gè)方法的代碼執(zhí)行要快。
onStop()//Activity不再可見時(shí)調(diào)用。
onDestroy()//Activity銷毀棧時(shí)被調(diào)用的最后一個(gè)方法。
3. 橫豎屏切換時(shí)候Activity的生命周期。
答: 1、不設(shè)置Activity的android: configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次。
2、設(shè)置Activity的android: configChanges=“orientation”時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次。
3、設(shè)置Activity的android: configChanges=“orientation|keyboardHidden”時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfiguration方法
4. 如何將一個(gè)Activity設(shè)置成窗口的樣式。
答: 第一種方法,在styles.xml文件中,可以新建如下的類似Dialog的style。
第二種方法,在AndroidManifest.xml中在需要顯示為窗口的Activity中添加如下屬性: android: theme=“@style/Theme.FloatActivity”即可。也可以直接添加對(duì)應(yīng)需要展示為Dialog style的Activity的android: theme屬性為android: theme=“@ android: style/Theme.Dialog”。
5. 兩個(gè)Activity之間怎么傳遞數(shù)據(jù)?
答: 可以在Intent對(duì)象中利用Extra來傳遞存儲(chǔ)數(shù)據(jù)。
在Intent的對(duì)象請(qǐng)求中,使用putExtra(“鍵值對(duì)的名字”,”鍵值對(duì)的值”);在另外一個(gè)Activity中將Intent中的請(qǐng)求數(shù)據(jù)取出來:
Intent intent = getIntent();
String value = intent.getStringExtra(“testIntent”);
6. 怎么讓在啟動(dòng)一個(gè)Activity是就啟動(dòng)一個(gè)service?
答: 首先定義好一個(gè)service,然后在Activity的onCreate里面進(jìn)行連接并bindservice或者直接startService。
7. Activity怎么和service綁定,怎么在activity中啟動(dòng)自己對(duì)應(yīng)的service?
答: 1、activity能進(jìn)行綁定得益于Serviece的接口。為了支持Service的綁定,實(shí)現(xiàn)onBind方法。
2、Service和Activity的連接可以用ServiceConnection來實(shí)現(xiàn)。需要實(shí)現(xiàn)一個(gè)新的 ServiceConnection,重現(xiàn)onServiceConnected和OnServiceDisconnected方法,一旦連接建立,就能得到Service實(shí)例的引用。
3、執(zhí)行綁定,調(diào)用bindService方法,傳入一個(gè)選擇了要綁定的Service的Intent(顯示或隱式)和一個(gè)你實(shí)現(xiàn)了的ServiceConnection的實(shí)例
8.什么是Service以及描述下它的生命周期。Service有哪些啟動(dòng)方法,有什么區(qū)別,怎樣停用Service?
答: Android Service是運(yùn)行在后臺(tái)的代碼,不能與用戶交互,可以運(yùn)行在自己的進(jìn)程,也可以運(yùn)行在其他應(yīng)用程序進(jìn)程的上下文里。需要通過某一個(gè)Activity或者Context對(duì)象來調(diào)用。Service有兩個(gè)啟動(dòng)方法,分別是 Context.startService()和Context.bindService()。如果在Service執(zhí)行耗時(shí)的操作需要啟動(dòng)一個(gè)新線程來執(zhí)行。
Android Service只繼承了onCreate(), onStart(),onDestroy()三個(gè)方法,當(dāng)我們第一次啟動(dòng)Service時(shí),先后調(diào)用onCreate(), onStart()這兩個(gè)方法,當(dāng)停止Service時(shí),則執(zhí)行onDestroy()方法時(shí)。如果Service已經(jīng)啟動(dòng)了,當(dāng)我們?cè)俅螁?dòng) Service時(shí),不會(huì)再執(zhí)行onCreate()方法,而是直接執(zhí)行onStart()方法。
9. 什么時(shí)候使用Service?
答: 比如播放多媒體的時(shí)候,用戶啟動(dòng)了其他Activity,這個(gè)時(shí)候程序要在后臺(tái)繼續(xù)播放,比如檢測(cè)SD卡上文件的變化,再或者在后臺(tái)記錄你的地理信息位置的改變等等。
10. 請(qǐng)描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻譯為”意圖”,他是三種應(yīng)用程序基本組件-Activity,Service和broadcast receiver之間相互激活的手段。在調(diào)用Intent名稱時(shí)使用ComponentName也就是類的全名時(shí)為顯示調(diào)用。這種方式一般用于應(yīng)用程序的內(nèi)部調(diào)用,因?yàn)槟悴灰欢〞?huì)知道別人寫的類的全名。而Intent Filter是指意圖過濾,不出現(xiàn)在代碼中,而是出現(xiàn)在android Manifest文件中,以的形式。(有一個(gè)例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動(dòng)態(tài)設(shè)定的,其中intent filter也是在代碼中創(chuàng)建的)
一個(gè)intent有action,data,category等字段。一個(gè)隱式intent為了能夠被某個(gè)intent filter接收,必須通過3個(gè)測(cè)試,一個(gè)intent為了被某個(gè)組件接收,則必須通過它所有的intent filter中的一個(gè)。
11. Intent傳遞數(shù)據(jù)時(shí),可以傳遞哪些類型數(shù)據(jù)?
答: intent間傳送數(shù)據(jù)一般有兩種常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入數(shù)據(jù)。新啟動(dòng)的Activity可用Intent.getExtras取出Bundle,然后用Bundles.getLong,getInt,getBoolean,getString等函數(shù)來取放進(jìn)去的值。
Data則是傳輸url。url可以是指我們熟悉的http,ftp等網(wǎng)絡(luò)地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入數(shù)據(jù),Intent.getData可以取出數(shù)據(jù)。
12. 說說Activity,Intent,Service是什么關(guān)系 ?
答: 一個(gè)Activity通常是一個(gè)單獨(dú)的屏幕,每一個(gè)Activity都被實(shí)現(xiàn)為一個(gè)單獨(dú)的類,這些類都是從Activity基類中繼承而來的。Activity類會(huì)顯示由視圖控件組成的用戶接口,并對(duì)視圖控件的事件做出響應(yīng)。
Intent的調(diào)用是用來進(jìn)行屏幕之間的切換。Intent描述應(yīng)用想要做什么。Intent數(shù)據(jù)結(jié)構(gòu)中兩個(gè)最重要的部分是動(dòng)作和動(dòng)作對(duì)應(yīng)的數(shù)據(jù),一個(gè)動(dòng)作對(duì)應(yīng)一個(gè)動(dòng)作數(shù)據(jù)。
Service是運(yùn)行在后臺(tái)的代碼,不能與用戶交互,可以運(yùn)行在自己的進(jìn)程里,也可以運(yùn)行在其他應(yīng)用程序進(jìn)程的上下文里。需要一個(gè)Activity或者其他Context對(duì)象來調(diào)用。
Activity跳轉(zhuǎn)Activity,Activity啟動(dòng)Service,Service打開Activity都需要Intent表明意圖,以及傳遞參數(shù),Intent是這些組件間信號(hào)傳遞的承載著。
13. 請(qǐng)描述一下BroadcastReceiver。
答: Broadcast Receiver用于接收并處理廣播通知(broadcast announcements)。多數(shù)的廣播是系統(tǒng)發(fā)起的,如地域變換、電量不足、來電短信等。程序也可以播放一個(gè)廣播。程序可以有任意數(shù)量的 broadcast receivers來響應(yīng)它覺得重要的通知。Broadcast receiver可以通過多種方式通知用戶: 啟動(dòng)activity、使用NotificationManager、開啟背景燈、振動(dòng)設(shè)備、播放聲音等,最典型的是在狀態(tài)欄顯示一個(gè)圖標(biāo),這樣用戶就可以點(diǎn)它打開看通知內(nèi)容。通常我們的某個(gè)應(yīng)用或系統(tǒng)本身在某些事件(電池電量不足、來電短信)來臨時(shí)會(huì)廣播一個(gè)Intent出去,我們利用注冊(cè)一個(gè) broadcast
receiver來監(jiān)聽這些Intent并獲取Intent中的數(shù)據(jù)。
15. 請(qǐng)介紹下ContentProvider是如何實(shí)現(xiàn)數(shù)據(jù)共享的。
答: 一個(gè)程序可以通過實(shí)現(xiàn)一個(gè)Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Content provider是以類似數(shù)據(jù)庫中的表的方式將自己的數(shù)據(jù)暴露。Content provider存儲(chǔ)和檢索數(shù)據(jù),通過它可以讓所有的應(yīng)用程序訪問到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法。
要想使應(yīng)用程序的數(shù)據(jù)公開化,可通過2種方法:創(chuàng)建一個(gè)數(shù)據(jù)自己的Content Provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content Provider中,前提是有相同數(shù)據(jù)類型并且有寫入Content Provider的權(quán)限,Android提供了Content Resolverr,外界的程序可以通過Content Resolver接口訪問Content Provider提供的數(shù)據(jù)。
16. 請(qǐng)介紹下Android的數(shù)據(jù)存儲(chǔ)方式。
答: Android提供了5中存儲(chǔ)數(shù)據(jù)的方式,分別是以下幾種
1、使用Shared Preferences存儲(chǔ)數(shù)據(jù),用來存儲(chǔ)key-value,pairs格式的數(shù)據(jù),它是一個(gè)輕量級(jí)的鍵值存儲(chǔ)機(jī)制,只可以存儲(chǔ)基本數(shù)據(jù)類型。
2、使用文件存儲(chǔ)數(shù)據(jù),通過FileInputStream和FileOutputStream對(duì)文件進(jìn)行操作。在Android中,文件是一個(gè)應(yīng)用程序私有的,一個(gè)應(yīng)用程序無法讀寫其他應(yīng)用程序的文件。
3、使用SQLite數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù),Android提供的一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫,支持SQL語句。
4、使用Content Provider存儲(chǔ)數(shù)據(jù),是所有應(yīng)用程序之間數(shù)據(jù)存儲(chǔ)和檢索的一個(gè)橋梁,它的作用就是使得各個(gè)應(yīng)用程序之間實(shí)現(xiàn)數(shù)據(jù)共享。它是一個(gè)特殊的存儲(chǔ)數(shù)據(jù)的類型,它提供了一套標(biāo)準(zhǔn)的接口用來獲取數(shù)據(jù),操作數(shù)據(jù)。系統(tǒng)也提供了音頻、視頻、圖像和個(gè)人信息等幾個(gè)常用的Content Provider。如果你想公開自己的私有數(shù)據(jù),可以創(chuàng)建自己的Content Provider類,或者當(dāng)你對(duì)這些數(shù)據(jù)擁有控制寫入的權(quán)限時(shí),將這些數(shù)據(jù)添加到Content Provider中實(shí)現(xiàn)共享。外部訪問通過Content Resolver去訪問并操作這些被暴露的數(shù)據(jù)。
5、使用網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)
17. 請(qǐng)介紹下Android中常用的五種布局。
答: 最常用的布局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml配置文件或者代碼中進(jìn)行布局。
1、Frame Layout是最簡(jiǎn)單的布局方式,放置的控件都只能羅列到左上角,控件會(huì)有重疊,不能進(jìn)行復(fù)雜的布局。
2、Linear Layout可以通過orientation屬性設(shè)置線性排列的方向是垂直還是縱向的,每行或每列只有一個(gè)元素,可以進(jìn)行復(fù)雜的布局。
3、Absolute Layout可以讓子元素指定準(zhǔn)確的x、y坐標(biāo)值,并顯示在屏幕上。Absolute Layout沒有頁邊框,允許元素之間相互重疊。它是絕對(duì)坐標(biāo),所以在實(shí)際中不提倡使用。
4、Relative Layout允許子元素制定他們相對(duì)于其他元素或父元素的位置(通過ID制定)。因此,你可以以右對(duì)齊,或上下,或置于屏幕中央的形式來排列兩個(gè)元素。元素按順序排列,因此如果第一個(gè)元素在屏幕的中央,那么相對(duì)于這個(gè)元素的其他元素將以屏幕中央的相對(duì)位置來排列。這個(gè)是相對(duì)于Absolute Layout的,采用相對(duì)坐標(biāo),所以在實(shí)際中比較常用。
5、Table Layout將以子元素的位置分配到行或列。一個(gè)Table Layout由許多的Table Row組成,每個(gè)Table Row都會(huì)定義一個(gè)row。Table Layout容器不會(huì)顯示row、column或者cell的邊線框。每個(gè)row擁有0個(gè)或多個(gè)的cell; 和html中的table差不多。在實(shí)際中也經(jīng)常使用。
18. 談?wù)刄I中, Padding和Margin有什么區(qū)別?
答: Padding是控件的內(nèi)容相對(duì)控件的邊緣的邊距,而Margin是控件邊緣相對(duì)于其他控件的邊距。如下圖所示:
19. android本身的一些限制,比如apk包大小限制,讀取大文件時(shí)的時(shí)間限。
答:apk包大小限制不好說,有的apk為100M,還是能裝到手機(jī)上。一般的apk大小為5~10M左右。讀取大文件的時(shí)間應(yīng)該是在main線程里面,時(shí)間限制為5秒左右。
20. ListView如何提高其效率?
答:1、使用分頁加載,不要一次性加載所有數(shù)據(jù)。
2、復(fù)用convertView。在getItemView中,判斷converView是否為空,如果不為空,可復(fù)用。
3、異步加載圖片。Item中如果包含有webimage,那么最好異步加載。
4、快速滑動(dòng)時(shí),不顯示圖片。當(dāng)快速滑動(dòng)列表(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處于其他兩種狀態(tài)(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來
22. 談?wù)剬?duì)Android NDK的理解。
答: android NDK是一套工具,允許Android應(yīng)用開發(fā)者嵌入從C、C++源代碼編譯來的本地機(jī)器代碼到各自的應(yīng)用軟件包中。
1、 NDK是一系列工具的集合。
NDK提供了一系列的工具,幫助開發(fā)者快速開發(fā)C(或C++)的動(dòng)態(tài)庫,并能自動(dòng)將so和java應(yīng)用一起打包成apk。這些工具對(duì)開發(fā)者幫助時(shí)巨大的。
NDK集成了交叉編輯器,并提供了相應(yīng)的mk文件隔離CPU、平臺(tái)、API等差異,開發(fā)人員只需要簡(jiǎn)單修改mk文件(指出“那些文件需要編譯”、“編譯特性要求”等),就可以創(chuàng)建出so。NDK可以自動(dòng)將so和Java應(yīng)用一起打包,極大的減輕了開發(fā)人員的打包工作。
2、NDK提供了一份穩(wěn)定、功能有限的API頭文件聲明。這些API支持的功能非常有限,包含有:C標(biāo)準(zhǔn)庫(libc)、標(biāo)準(zhǔn)數(shù)學(xué)庫(libm)、壓縮庫(libz)、log庫(liblog)。
23. 談?wù)凙ndroid的優(yōu)點(diǎn)和不足之處。
答: 優(yōu)點(diǎn)如下所示:
1、android是開源、市場(chǎng)占有率大。
2、android能夠有豐富的硬件選擇。
3、android是一款基于Linux平臺(tái)的開源操作系統(tǒng),從而避免了專利壁壘,是一款完全免費(fèi)的只能手機(jī)平臺(tái)。
4、由于android是google開發(fā)的,因此能夠無縫結(jié)合Google應(yīng)用。
缺點(diǎn)如下所示:
1、安全與隱私。手機(jī)與互聯(lián)網(wǎng)緊密聯(lián)系,個(gè)人隱私很難得到保守。
24. Android系統(tǒng)中GC什么情況下會(huì)出現(xiàn)內(nèi)存泄露呢?
答: 導(dǎo)致內(nèi)存泄露主要的原因是,先前申請(qǐng)了內(nèi)存空間而忘記了釋放。如果程序中存在無用對(duì)象的引用,那么這些對(duì)象就會(huì)駐留內(nèi)存,消耗內(nèi)存,因?yàn)闊o法讓垃圾回收器 GC驗(yàn)證這些對(duì)象是否不再需要。如果存在對(duì)象的引用,這個(gè)對(duì)象就被定義為“有效的活動(dòng)”,同時(shí)不會(huì)被釋放。要確定對(duì)象所占內(nèi)存將被回收,我們就要確認(rèn)該對(duì)象不會(huì)再被使用。典型的做法是把對(duì)象數(shù)據(jù)成員設(shè)為null或者從集合中移除該對(duì)象。當(dāng)出現(xiàn)以下情況時(shí),會(huì)造成內(nèi)存泄露:
1、 數(shù)據(jù)庫的cursor沒有關(guān)閉。
2、 構(gòu)造adapter時(shí),沒有使用緩存contentview。
3、 Bitmap對(duì)象不使用時(shí),采用recycle()釋放內(nèi)存。
4、 Activity中的對(duì)象的生命周期大于activity。
調(diào)試方法: DDMS==>HEAPSIZE==>dataobject==>[TotalSize]
25. Android UI中的View如何刷新。
答: Android中對(duì)View的更新方式有很多種,使用時(shí)要區(qū)分不同的應(yīng)用場(chǎng)合。要分清的是:多線程和雙緩沖。
1、不使用多線程和雙緩沖
這種情況最簡(jiǎn)單,一般只希望View在發(fā)生改變時(shí)對(duì)UI進(jìn)行重繪。你只需要Activity中顯式調(diào)用View對(duì)象中的invalidate()方法即可。系統(tǒng)會(huì)自動(dòng)調(diào)用View的onDraw()方法。
2、使用多線程和不使用雙緩沖
這種情況下需要開啟新的線程,新開的線程就不好訪問View對(duì)象了。強(qiáng)行訪問的話會(huì)報(bào)錯(cuò):android.view.ViewRoot$ CalledFromWrongThreadException: only theoriginal thread that created a view hierarchy can touch its views。
這時(shí)候你需要?jiǎng)?chuàng)建一個(gè)繼承了android.os.handler的子類,并重寫handleMessage方法。 Android.os.Handle是能發(fā)送和處理消息的,你需要在Activity中發(fā)出更新UI的消息,然后再你的Handler(可以使用匿名內(nèi)部類)中處理消息(因?yàn)槟涿麅?nèi)部類可以訪問父類變量,你可以直接調(diào)用View對(duì)象中的invalidate()方法。也就是說:在新線程中創(chuàng)建并發(fā)送一個(gè) Message,然后在主線程中捕獲、處理該消息。
3、使用多線程和雙緩沖
Android的SurfaceView是View的子類,她同時(shí)也實(shí)現(xiàn)了雙緩沖。你可以定義一個(gè)她的子類并實(shí)現(xiàn) Surfaceholder.Callback接口。由于SurfaceHolder.Callback接口,新線程就不要 android.os.Handler幫忙了。SurfaceHolder中l(wèi)ockCanvas()方法可以鎖定畫布,繪制完新的圖像后調(diào)用 unlockCanvasand Post解鎖。
【免責(zé)聲明】本文部分系轉(zhuǎn)載,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)?jiān)?0日內(nèi)與聯(lián)系我們,我們會(huì)予以更改或刪除相關(guān)文章,以保證您的權(quán)益!