android常見面試題
android面試中,有哪些常見的面試題呢?你有提前了解過了嗎?以下是小編幫你們整理的android常見面試題,一起來學習啦。
android常見面試題篇一
1、 android 中的動畫有哪幾類,它們的特點和區別是什么?
參考答案:
有兩種,一種是 Tween(補間) 動畫、還有一種是 Frame(幀) 動畫。Tween 動畫,這種實現方式可以使視圖組件移動、放大、縮小以及產生透明度的變化;另一種 Frame 動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。
2、 請簡述Handler的機制原理
參考答案:
andriod 提供了 Handler 和 Looper 來滿足線程間的通信。Handler 先進先出原則。
Looper類用來管理特定線程內對象之間的消息交換(Message Exchange)。
1)Looper: 一個線程可以產生一個 Looper 對象,由它來管理此線程里的 Message Queue(消息隊列)。
2)Handler: 你可以構造 Handler 對象來與 Looper 溝通,以便 push 新消息到 Message Queue 里;或者接收 Looper從 Message Queue 取出)所送來的消息。
3) Message Queue(消息隊列):用來存放線程放入的消息。
4)線程:UI thread 通常就是 main thread,而 Android 啟動程序時會替它建立一個Message Queue。
3、 說說mvc模式的原理,它在android中的運用
參考答案:
MVC 是 Model,View,Controller 的縮寫,從上圖可以看出 MVC 包含三個部分:
模型( Model )對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。
視圖( View )對象:是應用程序中負責生成用戶界面的部分。也是在整個MVC 架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。
控制器( Control )對象:是根據用戶的輸入,控制用戶界面數據顯示及更新Model 對象狀態的部分,控制器更重要的一種導航功能,想用用戶觸發的相關事件,交給 Model處理。
Android 鼓勵弱耦合和組件的重用,在 Android 中 MVC 的具體體現如下
1) 視圖層( view ) :一般采用 xml 文件進行界面的描述,使用的時候可以非常方便的引入,當然,如何你對 android 了解的比較的多了話,就一定可 以想到在 android 中也可以使用javascript+html 等的方式
作為 view 層,當然這里需要進行 java 和 javascript 之間的通 信,幸運的是, android 提供了它們之間非常方便的通信實現。
2) 控制層( controller ): android 的控制層的重任通常落在了眾多的 acitvity 的肩上,這句話也就暗含了不要在 acitivity 中寫代碼,要通過 activity 交割 model 業務邏輯層處理, 這樣做的另外一個原因是 android 中的 acitivity 的響應時間是 5s ,如果耗時的操作放在這里,程序就很容易被回收掉。
3) 模型層( model ): 對數據庫的操作、對網絡等的操作都應該在 model 里面處理,當然對業務計算等操作也是必須放在的該層的。
4、通過Intent傳遞一些二進制數據的方法有哪些?
參考答案:
1). 使用Serializable接口實現序列化,這是Java常用的方法。
2). 實現Parcelable接口,這里Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換數據也很常見的。
android常見面試題篇二
1、在onCreate方法中Bundle savedInstanceState這個參數有什么作用?
參考答案:
在onCreate方法中有saveInstanceState這個參數,其實這個參數對應兩個方法。void onSaveInstanceState(Bundle outState);void onRestoreInstanceState(Bundle savedInstanceState)。當某個activity變得“容易”被系統銷毀時,說白了就是系統在內存不足或者其他異常情況下把你的Activity銷毀時,將調用這個方法。需要注意的是它是系統調用的,并且你的Activity是被動得被銷毀。你可以在銷毀的時候保存一下數據。然后在onCreate方法中拿出來。那什么情況下能觸發這兩個方法呢?
1)、當用戶按下HOME鍵時。
這是顯而易見的,系統不知道你按下HOME后要運行多少其他的程序,自然也不知道activity A是否會被銷毀,故系統會調用onSaveInstanceState,讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則
2)、長按HOME鍵,選擇運行其他的程序時。
3)、按下電源按鍵(關閉屏幕顯示)時。
4)、從activity A中啟動一個新的activity時。
5)、屏幕方向切換時,例如從豎屏切換到橫屏時。
在屏幕切換之前,系統會銷毀activity A,在屏幕切換之后系統又會自動地創建activity A,所以onSaveInstanceState一定會被執行
總而言之,onSaveInstanceState的調用遵循一個重要原則,即當系統“未經你許可”時銷毀了你的activity,則onSaveInstanceState會被系統調用,這是系統的責任,因為它必須要提供一個機會讓你保存你的數據(當然你不保存那就隨便你了)。
至于onRestoreInstanceState方法,需要注意的是,onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成對的被調用的,onRestoreInstanceState被調用的前提是,activity A“確實”被系統銷毀了,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,然后用戶緊接著又返回到activity A,這種情況下activity A一般不會因為內存的原因被系統銷毀,故activity A的onRestoreInstanceState方法不會被執行
另外,onRestoreInstanceState的bundle參數也會傳遞到onCreate方法中,你也可以選擇在onCreate方法中做數據還原。
2、請談談Activity的生命周期?
參考答案:
在系統中的Activity被一個Activity棧所管理。當一個新的Activity啟動時,將被放置到棧頂,成為運行中的Activity,前一個Activity保留在棧中,不再放到前臺,直到新的Activity退出為止。
Activity有四種本質區別的狀態:
1)在屏幕的前臺(Activity棧頂),叫做活動狀態或者運行狀態(active or running)
2)如果一個Activity失去焦點,但是依然可見(一個新的非全屏的Activity 或者一個透明的Activity 被放置在棧頂),叫做暫停狀態(Paused)。一個暫停狀態的Activity依然保持活力(保持所有的狀態,成員信息,和窗口管理器保持連接),但是在系統內存極端低下的時候將被殺掉。
3)如果一個Activity被另外的Activity完全覆蓋掉,叫做停止狀態(Stopped)。它依然保持所有狀態和成員信息,但是它不再可見,所以它的窗口被隱藏,當系統內存需要被用在其他地方的時候,Stopped的Activity將被殺掉。
4)如果一個Activity是Paused或者Stopped狀態,系統可以將該Activity從內存中刪除,Android系統采用兩種方式進行刪除,要么要求該Activity結束,要么直接殺掉它的進程。當該Activity再次顯示給用戶時,它必須重新開始和重置前面的狀態。
3、談談你對BroadCastRceiver的理解?
參考答案:
廣播接收者,android四大組件之一,也是唯一一個能動態注冊的組件。
1)廣播接收者是一個專注于接收廣播通知信息,并做出對應處理的組件。很多廣播是源自于系統──比如,通知時區改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以進行廣播──比如說,通知其它應用程序一些數據下載完成并處于可用狀態。
2)應用程序可以擁有任意數量的廣播接收者以對所有它感興趣的通知信息予以響應。所有的接收器均繼承自BroadcastReceiver基類。
3)廣播接收者沒有用戶界面。然而,它們可以啟動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它并獲取消息。
4、廣播分幾種?他們有什么區別?
參考答案:
廣播被分為兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,并且無法終止廣播Intent的傳播。
然而有序廣播是按照接收者聲明的優先級別,被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么,廣播先傳給A,再傳給B,最后傳給C 。優先級別聲明在 intent-filter 元素的 android:priority 屬性中,數越大優先級別越高,取值范圍:-1000到1000,優先級別也可以調用IntentFilter對象的setPriority()進行設置 。有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。
另外,有序廣播的接收者可以將數據傳遞給下一個接收者,如:A得到廣播后,可以往它的結果對象中存入數據,當廣播傳給B時,B可以從A的結果對象中得到A存入的數據。
Context.sendBroadcast()
發送的是普通廣播,所有訂閱者都有機會獲得并進行處理。
Context.sendOrderedBroadcast()
發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者, 前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。對于有序廣播,前面的接收者可以將數據通過setResultExtras(Bundle)方法存放進結果對象,然后傳給下一個接收者,下一個接收者通過代碼:Bundle bundle = getResultExtras(true))可以獲取上一個接收者存入在結果對象中的數據。
android常見面試題篇三
1、廣播的生命周期?
參考答案:
廣播的生命周期是非常短的,當發送之后intent會到AndroidManifest.xml文件中找是不是有匹配的action,如果有就會調用Receiver ,然后獲得Receiver 對象,再執行onReceive方法,這時候Receiver對象就沒有用了,當我們再次點擊按鈕的時候就會重新獲得對象,這就是BroadcastReceiver的生命周期. 在BroadcastReceiver里不能做一些比較耗時的操作,否側會彈出ANR(Application NoResponse)的對話框.
如果需要完成一項比較耗時的工作,應該通過發送Intent給Service,由Service來完成.這里不能使用子線程來解決,因為BroadcastReceiver的生命周期很短,子線程可能還沒有結束,BroadcastReceiver就先結束了.BroadcastReceiver一旦結束,此時BroadcastReceiver的所在進程很容易在系統需要內存時被優先殺死,因為它屬于空進程(沒有任何活動組件的進程).如果它的宿主進程被殺死,那么正在工作的子線程也會被殺死.所以采用子線程來解決是不可靠的.
2、兩種注冊BroadcastReceiver的方法?
參考答案:
使用在manifest中注冊的方法注冊BroadcastReceiver,即使你的應用程序沒有啟動,或者已經被關閉,這個BroadcastReceiver依然會繼續運行,這樣的運行機制可能會給軟件的用戶造成困擾。所以作為程序的開發者,我們希望能夠有一種靈活的機制完成BroadcastReceiver的綁定和解除綁定操作。Android當然也考慮到了這些問題,所以在Context這個類當中提供了如下兩個函數可以在代碼中注冊:
i. registerReceiver(receiver,filter);
這個函數的作用就是將一個BroadcastReceiver注冊到應用程序當中,這個函數接收兩個參數,第一個參數是需要注冊的BroadcastReceiver對象,第二個是一個IntentFilter。第一個參數是非常容易理解的,第二個參數的作用是定義了哪些Intent才能觸發這個注冊的BroadcastReceiver對象。
ii. unregisterReceiver(receiver);
這個方法就非常的簡單了,用于解除BroadcastReceiver的綁定狀態。一旦解除完成,響應的BroadcastReceiver就不會再接收系統所廣播的Intent了。
兩種注冊BroadcastReceiver的方法
1.在應用程序的代碼中進行注冊
注冊BroadcastReceiver
registerReceiver(receiver,filter);
取消注冊BroadcastReceiver
unregisterReceiver(receiver);
2.在AndroidManifest.xml當中進行注冊
兩種注冊BroadcastReceiver方法的比較:
現在我們了解了兩種注冊BroadcastReceiver的方法之后,需要考慮一下這兩種方法適用的場合:
i. 第一種注冊的方法可以保證在應用程序安裝之后,BroadcastReceiver始終處于活動狀態,通常用于監聽系統狀態的改變,比如說手機的電量,wifi網卡的狀態(當然,監視這些東西也是取決于軟件的需求)。對于這樣的BroadcastReceiver,通常是在產生某個特定的系統事件之后,進行相應的操作,比如說wifi網卡打開時,給用戶一個提示;
ii. 第二種注冊方法相對第一種要靈活的多,這樣注冊的BroadcastReceiver通常用于更新UI的狀態。一般來說,都是在一個Activity啟動的時候使用這樣的方法注冊BroadcastReceiver,一旦接收到廣播的事件,就可以在onReceive方法當中更新當前的這個Activity當中的控件。但是需要注意的是如果這個Activity不可見了,就應該調用unregisterReceiver方法來解除注冊
3、android 中線程與線程,進程與進程之間如何通信 參考答案:
01 、一個 Android 程序開始運行時,會單獨啟動一個 Process 。
默認情況下,所有這個程序中的 Activity 或者 Service 都會跑在這個 Process 。
默認情況下,一個 Android 程序也只有一個 Process ,但一個 Process 下卻可以有許多個 Thread。
02 、一個 Android 程序開始運行時,就有一個主線程 Main Thread 被創建。該線程主要負責 UI 界面的顯示、更新和控件交互,所以又叫 UI Thread 。 一個 Android 程序創建之初,一個 Process 呈現的是單線程模型 — 即 Main Thread ,所有的任務都在一個線程中運行。所以, Main Thread 所調用的每一個函數,其耗時應該越短越好。而對于比較費時的工作,應該設法交給子線程去做,以避免阻塞主線程(主線程被阻塞,會導致程序假死 現象)。
03 、 Android 單線程模型: Android UI 操作并不是線程安全的并且這些操作必須在 UI 線程中執行。如果在子線程中直接修改 UI ,會導致異常。
看了“android常見面試題”的人還看過:
1.
2.
3.
4.
5.