- 相關(guān)推薦
2016安卓面試試題及答案
安卓是一種專為手持式裝置所設(shè)計(jì)的操作系統(tǒng)。本文將介紹2016安卓面試試題及答案。
2016安卓面試試題及答案(1)
1、什么是Activity?
四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activity
setContentView() ,// 要顯示的布局
button.setOnclickLinstener{
}, activity 是Context的子類,同時(shí)實(shí)現(xiàn)了window.callback和keyevent.callback, 可以處理與窗體用戶交互的事件.
我開發(fā)常用的的有FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty等…
2、請(qǐng)描述一下Activity 生命周期
Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時(shí)會(huì)激發(fā)相應(yīng)的回調(diào)方法,這些回調(diào)方法包括:onCreate onStart onResume onPause onStop onDestroy
其實(shí)這些方法都是兩兩對(duì)應(yīng)的,onCreate創(chuàng)建與onDestroy銷毀;
onStart可見與onStop不可見;onResume可編輯(即焦點(diǎn))與onPause;
如果界面有共同的特點(diǎn)或者功能的時(shí)候,還會(huì)自己定義一個(gè)BaseActivity.
進(jìn)度對(duì)話框的顯示與銷毀
3、常見的Activity類型有FragmentActivitiy,ListActivity,TabAcitivty等。請(qǐng)描述一下Activity 生命周期
Activity從創(chuàng)建到銷毀有多種狀態(tài),從一種狀態(tài)到另一種狀態(tài)時(shí)會(huì)激發(fā)相應(yīng)的回調(diào)方法,這些回調(diào)方法包括:onCreate onStart onResume onPause onStop onDestroy
其實(shí)這些方法都是兩兩對(duì)應(yīng)的,onCreate創(chuàng)建與onDestroy銷毀;
onStart可見與onStop不可見;onResume可編輯(即焦點(diǎn))與onPause。
4、如何保存Activity的狀態(tài)?
Activity的狀態(tài)通常情況下系統(tǒng)會(huì)自動(dòng)保存的,只有當(dāng)我們需要保存額外的數(shù)據(jù)時(shí)才需要使用到這樣的功能。
一般來說, 調(diào)用onPause()和onStop()方法后的activity實(shí)例仍然存在于內(nèi)存中, activity的所有信息和狀態(tài)數(shù)據(jù)不會(huì)消失, 當(dāng)activity重新回到前臺(tái)之后, 所有的改變都會(huì)得到保留。
但是當(dāng)系統(tǒng)內(nèi)存不足時(shí), 調(diào)用onPause()和onStop()方法后的activity可能會(huì)被系統(tǒng)摧毀, 此時(shí)內(nèi)存中就不會(huì)存有該 activity的實(shí)例對(duì)象了。如果之后這個(gè)activity重新回到前臺(tái), 之前所作的改變就會(huì)消失。為了避免此種情況的發(fā)生, 我們可以覆寫 onSaveInstanceState()方法。onSaveInstanceState()方法接受一個(gè)Bundle類型的參數(shù), 開發(fā)者可以將狀態(tài)數(shù)據(jù)存儲(chǔ)到這個(gè)Bundle對(duì)象中, 這樣即使activity被系統(tǒng)摧毀, 當(dāng)用戶重新啟動(dòng)這個(gè)activity而調(diào)用它的onCreate()方法時(shí), 上述的Bundle對(duì)象會(huì)作為實(shí)參傳遞給onCreate()方法, 開發(fā)者可以從Bundle對(duì)象中取出保存的數(shù)據(jù), 然后利用這些數(shù)據(jù)將 activity恢復(fù)到被摧毀之前的狀態(tài)。
需要注意的是, onSaveInstanceState()方法并不是一定會(huì)被調(diào)用的, 因?yàn)橛行﹫?chǎng)景是不需要保存狀態(tài)數(shù)據(jù)的. 比如用戶按下 BACK鍵退出activity時(shí), 用戶顯然想要關(guān)閉這個(gè)activity, 此時(shí)是沒有必要保存數(shù)據(jù)以供下次恢復(fù)的, 也就是 onSaveInstanceState()方法不會(huì)被調(diào)用. 如果調(diào)用onSaveInstanceState()方法, 調(diào)用將發(fā)生在 onPause()或onStop()方法之前。
5、兩個(gè)Activity之間跳轉(zhuǎn)時(shí)必然會(huì)執(zhí)行的是哪幾個(gè)方法?
一般情況下比如說有兩個(gè)activity,分別叫A,B,當(dāng)在A里面激活B組件的時(shí)候, A會(huì)調(diào)用 onPause()方法,然后B調(diào)用onCreate() ,onStart(), onResume()。
這個(gè)時(shí)候B覆蓋了窗體, A會(huì)調(diào)用onStop()方法. 如果B是個(gè)透明的,或者是對(duì)話框的樣式, 就不會(huì)調(diào)用A的onStop()方法。
6、橫豎屏切換時(shí)Activity的生命周期
此時(shí)的生命周期跟清單文件里的配置有關(guān)系。
不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期默認(rèn)首先銷毀當(dāng)前activity,然后重新加載。
2.設(shè)置Activity android:configChanges="orientation|keyboardHidden|screenSize"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法。
通常在游戲開發(fā), 屏幕的朝向都是寫死的。
7、如何將一個(gè)Activity設(shè)置成窗口的樣式
只需要給我們的Activity配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"
8、如何退出Activity?如何安全退出已調(diào)用多個(gè)Activity的Application?
1、通常情況用戶退出一個(gè)Activity只需按返回鍵,我們寫代碼想退出activity直接調(diào)用finish()方法就行。
2、記錄打開的Activity:
每打開一個(gè)Activity,就記錄下來。在需要退出時(shí),關(guān)閉每一個(gè)Activity即可。
3、發(fā)送特定廣播:
在需要結(jié)束應(yīng)用時(shí),發(fā)送一個(gè)特定的廣播,每個(gè)Activity收到廣播后,關(guān)閉即可。
//給某個(gè)activity 注冊(cè)接受接受廣播的意圖
registerReceiver(receiver, filter)
//如果過接受到的是 關(guān)閉activity的廣播 就調(diào)用finish()方法 把當(dāng)前的activity finish()掉
4、遞歸退出
在打開新的Activity時(shí)使用startActivityForResult,然后自己加標(biāo)志,在onActivityResult中處理,遞歸關(guān)閉。
5、其實(shí) 也可以通過 intent的flag 來實(shí)現(xiàn) intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個(gè)新的activity。此時(shí)如果該任務(wù)棧中已經(jīng)有該Activity,那么系統(tǒng)會(huì)把這個(gè)Activity上面的所有Activity干掉。其實(shí)相當(dāng)于給Activity配置的啟動(dòng)模式為 SingleTop。
9、Activity的四種啟動(dòng)模式,singletop和singletask區(qū)別是什么?一般書簽的使用模式是singletop,那為什么不使用singletask?
singleTop 跟standard 模式比較類似。唯一的區(qū)別就是,當(dāng)跳轉(zhuǎn)的對(duì)象是位于棧頂?shù)腶ctivity(應(yīng)該可以理解為用戶眼前所 看到的activity)時(shí),程序?qū)⒉粫?huì)生成一個(gè)新的activity實(shí)例,而是直接跳到現(xiàn)存于棧頂?shù)哪莻(gè)activity實(shí)例。拿上面的例子來說,當(dāng)Act1 為 singleTop 模式時(shí),執(zhí)行跳轉(zhuǎn)后棧里面依舊只有一個(gè)實(shí)例,如果現(xiàn)在按返回鍵程序?qū)⒅苯油顺觥?/p>
singleTask模式和singleInstance模式都是只創(chuàng)建一個(gè)實(shí)例的。在這種模式下,無(wú)論跳轉(zhuǎn)的對(duì)象是不是位于棧頂?shù)?activity,程序都不會(huì)生成一個(gè)新的實(shí)例(當(dāng)然前提是棧里面已經(jīng)有這個(gè)實(shí)例)。這種模式相當(dāng)有用,在以后的多activity開發(fā)中,常會(huì)因?yàn)樘D(zhuǎn)的關(guān)系導(dǎo)致同個(gè)頁(yè)面生成多個(gè)實(shí)例,這個(gè)在用戶體驗(yàn)上始終有點(diǎn)不好,而如果你將對(duì)應(yīng)的activity聲明為singleTask 模式,這種問題將不復(fù)存在。在主頁(yè)的Activity很常用
10、Android中的Context, Activity,Appliction有什么區(qū)別?
相同:Activity和Application都是Context的子類。
Context從字面上理解就是上下文的意思,在實(shí)際應(yīng)用中它也確實(shí)是起到了管理上下文環(huán)境中各個(gè)參數(shù)和變量的總用,方便我們可以簡(jiǎn)單的訪問到各種資源。
不同:維護(hù)的生命周期不同。 Context維護(hù)的是當(dāng)前的Activity的生命周期,Application維護(hù)的是整個(gè)項(xiàng)目的生命周期。
使用context的時(shí)候,小心內(nèi)存泄露,防止內(nèi)存泄露,注意一下幾個(gè)方面:
1. 不要讓生命周期長(zhǎng)的對(duì)象引用activity context,即保證引用activity的對(duì)象要與activity本身生命周期是一樣的。
2. 對(duì)于生命周期長(zhǎng)的對(duì)象,可以使用application,context。
3. 避免非靜態(tài)的內(nèi)部類,盡量使用靜態(tài)類,避免生命周期問題,注意內(nèi)部類對(duì)外部對(duì)象引用導(dǎo)致的生命周期變化。
11、兩個(gè)Activity之間傳遞數(shù)據(jù),除了intent,廣播接收者,content provider還有啥?
1)利用static靜態(tài)數(shù)據(jù),public static成員變量
2)利用外部存儲(chǔ)的傳輸,
例如 File 文件存儲(chǔ)
SharedPreferences首選項(xiàng)
Sqlite 數(shù)據(jù)庫(kù)
12、Context是什么?
1、它描述的是一個(gè)應(yīng)用程序環(huán)境的信息,即上下文。
2、該類是一個(gè)抽象(abstract class)類,Android提供了該抽象類的具體實(shí)現(xiàn)類(ContextIml)。
3、通過它我們可以獲取應(yīng)用程序的資源和類,也包括一些應(yīng)用級(jí)別操作,例如:?jiǎn)?dòng)一個(gè)Activity,發(fā)送廣播,接受Intent,信息,等。
2016安卓面試試題及答案(2)
1.如何避免ANR?
答:ANR:Application Not Responding,五秒在Android中,活動(dòng)管理器和窗口管理器這兩個(gè)系統(tǒng)服務(wù)負(fù)責(zé)監(jiān)視應(yīng)用程序的響應(yīng)。當(dāng)出現(xiàn)下列情況時(shí),Android就會(huì)顯示ANR對(duì)話框了: 對(duì)輸入事件(如按鍵、觸摸屏事件)的響應(yīng)超過5秒 意向接受器(intentReceiver)超過10秒鐘仍未執(zhí)行完畢
Android應(yīng)用程序完全運(yùn)行在一個(gè)獨(dú)立的線程中(例如main)。這就意味著,任何在主線程中運(yùn)行的,需要消耗大量時(shí)間的操作都會(huì)引發(fā)ANR。因?yàn)榇藭r(shí),你的應(yīng)用程序已經(jīng)沒有機(jī)會(huì)去響應(yīng)輸入事件和意向廣播(Intent broadcast)。 因此,任何運(yùn)行在主線程中的方法,都要盡可能的只做少量的工作。特別是活動(dòng)生命周期中的重要方法如onCreate()和 onResume()等更應(yīng)如此。潛在的比較耗時(shí)的操作,如訪問網(wǎng)絡(luò)和數(shù)據(jù)庫(kù);或者是開銷很大的計(jì)算,比如改變位圖的大小,需要在一個(gè)單獨(dú)的子線程中完成(或者是使用異步請(qǐng)求,如數(shù)據(jù)庫(kù)操作)。但這并不意味著你的主線程需要進(jìn)入阻塞狀態(tài)已等待子線程結(jié)束 -- 也不需要調(diào)用Therad.wait()或者Thread.sleep()方法。取而代之的是,主線程為子線程提供一個(gè)句柄(Handler),讓子線程在即將結(jié)束的時(shí)候調(diào)用它(xing:可以參看Snake的例子,這種方法與以前我們所接觸的有所不同)。使用這種方法涉及你的應(yīng)用程序,能夠保證你的程序?qū)斎氡3至己玫捻憫?yīng),從而避免因?yàn)檩斎胧录^5秒鐘不被處理而產(chǎn)生的ANR。這種實(shí)踐需要應(yīng)用到所有顯示用戶界面的線程,因?yàn)樗麄兌济媾R著同樣的超時(shí)問題。
2. handler機(jī)制的原理
答 :andriod提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進(jìn)先出原則。Looper類用來管理特定線程內(nèi)對(duì)象之間的消息交換(Message Exchange)! 1)Looper: 一個(gè)線程可以產(chǎn)生一個(gè)Looper對(duì)象,由它來管理此線程里的Message Queue(消息隊(duì)列)! 2)Handler: 你可以構(gòu)造Handler對(duì)象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。 3) Message Queue(消息隊(duì)列):用來存放線程放入的消息! 4)線程:UI thread 通常就是main thread,而Android啟動(dòng)程序時(shí)會(huì)替它建立一個(gè)Message Queue。
【安卓面試試題及答案】相關(guān)文章:
社工面試面試試題及答案08-04
安卓實(shí)習(xí)心得01-10
客服面試試題及答案09-26
銷售面試試題與答案09-26
軍校面試試題及答案09-25
路政面試試題及答案08-06
審計(jì)面試試題及答案08-05
小升初面試試題及答案08-08
外企面試的經(jīng)典試題及答案09-25