安卓核心技術(shù)面試題(一)
1、描述一下 android 的系統(tǒng)架構(gòu)
*android 系統(tǒng)架構(gòu)分從下往上為 linux 內(nèi)核層、運(yùn)行庫、應(yīng)用程序框架層和應(yīng)用程序?qū)印?/p>
*Linux kernel:
負(fù)責(zé)硬件的驅(qū)動(dòng)程序、網(wǎng)絡(luò)、電源、系統(tǒng)安全以及內(nèi)存管理等功能。
*Libraries 和 android Runtime:
Libraries:即 c/c++函數(shù)庫部分,大多數(shù)都是開放源代碼的函數(shù)庫,例如 webkit(引擎),該函數(shù)庫負(fù)責(zé) android 網(wǎng)頁瀏覽器的運(yùn)行,例如標(biāo)準(zhǔn)的c 函數(shù)庫 libc、openssl、sqlite 等,當(dāng)然也包括支持游戲開發(fā) 2dsgl 和3dopengles,在多媒體方面有 mediaframework 框架來支持各種影音和圖形文件的播放與顯示,例如 mpeg4、h.264、mp3、 aac、amr、jpg 和 png 等眾多的多媒體文件格式。
Runtime:負(fù)責(zé)解釋和執(zhí)行生成的 dalvik 格式的字節(jié)碼。
*application framework(應(yīng)用軟件架構(gòu)):
java 應(yīng)用程序開發(fā)人員主要是使用該層封裝好的 api 進(jìn)行快速開發(fā)。
applications:該層是 java 的應(yīng)用程序?qū)樱琣ndroid 內(nèi)置 googlemaps、 e-mail、即時(shí)通信工具、瀏覽器、mp3 播放器等處于該層,java 開發(fā)人員開發(fā)的程序也處于該層,而且和內(nèi)置的應(yīng)用程序具有平等的位置,可以調(diào)用內(nèi)置的應(yīng)用程序,也可以替換內(nèi)置的應(yīng)用程序。
*應(yīng)用程序?qū)樱?/p>
android 應(yīng)用程序使用框架的 api 并在框架下運(yùn)行,這就帶來了程序開發(fā)的高度一致性,另一方面也告訴我們,要想寫出優(yōu)質(zhì)高效的程序就必須對(duì)整個(gè)applicationframework 進(jìn)行非常深入的理解。精通applicationframework,你就可以真正的理解 android 的設(shè)計(jì)和運(yùn)行機(jī)制,也就更能夠駕馭整個(gè)應(yīng)用層的開發(fā)。
*總結(jié):
下層為上層服務(wù),上層需要下層的支持,調(diào)用下層的服務(wù),這種嚴(yán)格分層的方式帶來的極大的穩(wěn)定性、靈活性和可擴(kuò)展性,使得不同層的開發(fā)人員可以按照規(guī)范專心特定層的開發(fā)。
?
2、Dalvik 和標(biāo)準(zhǔn) Java 虛擬機(jī)之間的主要差別?
Dalvik 和標(biāo)準(zhǔn) Java 虛擬機(jī)(JVM)之間的首要差別之一,就是 Dalvik 基于寄存器,而
JVM 基于棧。
Dalvik 和 Java 之間的另外一大區(qū)別就是運(yùn)行環(huán)境——Dalvik 經(jīng)過優(yōu)化,允許在有限的內(nèi)存中同時(shí)運(yùn)行多個(gè)虛擬機(jī)的實(shí)例,并且每一個(gè) Dalvik 應(yīng)用作為一個(gè)獨(dú)立的 Linux 進(jìn)程
執(zhí)行。
(1)虛擬機(jī)很小,使用的空間也??;
(2)Dalvik 沒有 JIT 編譯器;
(3)常量池已被修改為只使用 32 位的索引,以簡(jiǎn)化解釋器;
(4)它使用自己的字節(jié)碼,而非 Java 字節(jié)碼。
3、Manifest.xml 文件中主要包括哪些信息?
manifest:根節(jié)點(diǎn),描述了 package 中所有的內(nèi)容。
User-sdk:指定支持的手機(jī)系統(tǒng)的最小版本
application:包含 package 中 application 級(jí)別組件聲明的根節(jié)點(diǎn)。
activity:Activity 是用來與用戶交互的主要工具。
receiver:IntentReceiver 能使的 application 獲得數(shù)據(jù)的改變或者發(fā)生的操作,即使它當(dāng)前不在運(yùn)行。
service:Service 是能在后臺(tái)運(yùn)行任意時(shí)間的組件。
provider:ContentProvider 是用來管理持久化數(shù)據(jù)并發(fā)布給其他應(yīng)用程序使用的組件。
uses-permission:請(qǐng)求你的 package 正常運(yùn)作所需賦予的安全許可。
permission: 聲明了安全許可來限制哪些程序能你 package 中的組件和功能。
instrumentation:聲明了用來測(cè)試此 package 或其他 package 指令組件的代碼。
4、什么是 Activity?
Activity 是一個(gè)負(fù)責(zé)與用戶交互的組件,Activity 中所有操作都與用戶密切相關(guān),可以通過 setContentView(View)來顯示指定控件。
在一個(gè) android 應(yīng)用中,一個(gè) Activity 通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應(yīng)。
5、請(qǐng)描述一下 Activity 生命周期。
onCreate(Bundle savedInstanceState):
創(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 被暫停或收回 cpu 和其他資源時(shí)調(diào)用,該方法用于保存活動(dòng)狀態(tài)的,也是保護(hù)現(xiàn)場(chǎng),壓棧吧!
onStop():
activity 被停止并轉(zhuǎn)為不可見階段及后續(xù)的生命周期事件時(shí)調(diào)用。
onRestart():
重新啟動(dòng) activity 時(shí)調(diào)用。該活動(dòng)仍在棧中,而不是啟動(dòng)新的活動(dòng)。
onDestroy():
activity 被完全從系統(tǒng)內(nèi)存中移除時(shí)調(diào)用,該方法被調(diào)用
6、如何退出 Activity?如何安全退出已調(diào)用多個(gè)Activity 的 application?
在 Android 中退出程序比較麻煩,尤其是在多個(gè) Activity 的程序中,在 2.2 之前可
以采用如下代碼退出程序:
ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
am.restartPackage(getPackageName());
此種方法是一種最方便和最簡(jiǎn)單的退出程序的辦法,但是在 2.2 和 2.2 之后就不能用了,一種常用的方法是自定義一個(gè) Activity 的棧,在程序退出時(shí)將棧中的所有的 Activity進(jìn)行finish。
7、如果后臺(tái)的 Activity 由于某原因被系統(tǒng)回收了,如何在被系統(tǒng)回收之前保存當(dāng)前狀態(tài)?
重寫 onSaveInstanceState()方法,在此方法中保存需要保存的數(shù)據(jù),該方法將會(huì)在 activity 被回收之前調(diào)用。通過重寫 onRestoreInstanceState()方法可以從中提取保存好的數(shù)據(jù)
8、activity 在屏幕旋轉(zhuǎn)時(shí)的生命周期
不設(shè)置 Activity 的 android:configChanges 時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次;設(shè)置 Activity 的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次;設(shè)置 Activity 的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行 onConfigurationChanged 方法。
9、activity 的啟動(dòng)模式有哪些?是什么含義?
在 android 里,有 4 種 activity 的啟動(dòng)模式,分別為:
“standard” (默認(rèn))
“singleTop”
“singleTask”
“singleInstance”
當(dāng)應(yīng)用運(yùn)行起來后就會(huì)開啟一條線程,線程中會(huì)運(yùn)行一個(gè)任務(wù)棧,當(dāng) Activity 實(shí)例創(chuàng)建后就會(huì)放入任務(wù)棧中。Activity 啟動(dòng)模式的設(shè)置在 AndroidManifest.xml 文件中,通過配置
Activity 的屬性 android:launchMode=""設(shè)置。
1. Standared 模式(默認(rèn))
我們平時(shí)直接創(chuàng)建的 Activity 都是這種模式的 Activity,這種模式的 Activity 的特點(diǎn)是:只要你創(chuàng)建了 Activity 實(shí)例,一旦激活該 Activity,則會(huì)向任務(wù)棧中加入新創(chuàng)建的實(shí)例,
退出 Activity 則會(huì)在任務(wù)棧中銷毀該實(shí)例。
2. SingleTop 模式
這種模式會(huì)考慮當(dāng)前要激活的 Activity 實(shí)例在任務(wù)棧中是否正處于棧頂,如果處于棧頂則無需重新創(chuàng)建新的實(shí)例,會(huì)重用已存在的實(shí)例,否則會(huì)在任務(wù)棧中創(chuàng)建新的實(shí)例。
3. SingleTask 模式
如果任務(wù)棧中存在該模式的 Activity實(shí)例,則把棧中該實(shí)例以上的 Activity實(shí)例全部移除,調(diào)用該實(shí)例的 newInstance()方法重用該Activity,使該實(shí)例處於棧頂位置,否則就重新
創(chuàng)建一個(gè)新的 Activity 實(shí)例。
4. SingleInstance 模式
當(dāng)該模式 Activity 實(shí)例在任務(wù)棧中創(chuàng)建后,只要該實(shí)例還在任務(wù)棧中,即只要激活的是該類型的 Activity,都會(huì)通過調(diào)用實(shí)例的 newInstance()方法重用該 Activity,此時(shí)使用的都是同一個(gè) Activity 實(shí)例,它都會(huì)處于任務(wù)棧的棧頂。此模式一般用于加載較慢的,比較耗性能且不需要每次都重新創(chuàng)建的 Activity。
更多面試題請(qǐng)關(guān)注微信公眾號(hào)"demo鎖屏面試題",通過關(guān)聯(lián)的小程序或app輕松學(xué)習(xí)面試題