1. 程式人生 > >Android開發工程師面試題整理(百度)

Android開發工程師面試題整理(百度)

偏簡單部分:

1. Android dvm(Dalvik VM)的程序和Linux的程序,應用程式的程序是否為同一個概念?

DVM是Dalvik虛擬機器。每一個Android應用程式都在自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個Dalvik虛擬機器都是在Linux中的一個程序,所以說可以認為是同一個概念。

2、SIM卡的 EF 檔案有何作用?

首先介紹下EF,SIM卡里德所有檔案按樹來組織:主檔案MF即Master File)、專用檔案DF(Dedicated File)、基本檔案EF(Elementary File)。

SIM卡的檔案系統有自己的規範,主要是為了和手機通訊,SIM本身可以有自己的作業系統,EF就是作儲存並和手機通訊用的。

3、嵌入式作業系統記憶體管理有哪幾種,各有何特性?

頁式,段式,段頁,用到了MMU(CPU核和外部儲存器之間對話實現是CPU核心通過MMU實現的),虛擬空間等技術。

4、什麼是嵌入式實時作業系統,Android作業系統屬於實時作業系統嗎?

嵌入式實時作業系統是指當外界事件或資料產生時,能夠接受並以足夠快的速度予以處理,其處理的結果又能在規定的時間之內來控制生產過程或對處理系統作出快速響應,並控制所有實時任務協調一致執行的嵌入式作業系統。主要用於工業控制、軍事裝置、航空航天等領域對系統的響應時間有苛刻的要求,這就需要使用實時系統。又可分為軟實時和硬實時兩種,而Android是基於linux核心的,因此屬於軟實時。

5、一條最長的簡訊息約佔多少byte?

中文70(包括標點),因為160個位元組

6、Android中的動畫有哪幾類,他們的特點和區別是什麼?

兩種,一是Tween動畫;二是Frame動畫。Tween動畫可以使試圖元件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

7、handler機制的原理

Android提供了Handler和Looper來滿足執行緒間的通訊。Handler先進先出原則。Looper類用來管理特定執行緒內物件之間的資訊交換(Message Exchange)。

Looper:一個執行緒可以產生一個Looper物件,由他來管理此執行緒裡的Message Queue(訊息佇列)。

Handler:你可以構造Handler物件來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出所送來的訊息。

Message Queue(訊息佇列):用來存放執行緒放入的訊息。

執行緒:UI thread通常就是main thread,而Android啟動程式時會替他建立一個Message Queue。

8、說說MVC模式的原理,他在Android中的運用

MVC(Model、view、controller)模型、檢視、控制器。MVC應用程式總是由這三個部分組成。Event(事件)導致Controller改變Model或View,或者同時改變兩者。只要Controller改變了Models的資料或者屬性,所有依賴的View都會自動更新。類似的,只要Controller改變了View,View會從潛在的Model中獲取資料來重新整理自己。

View重繪和記憶體洩露

View重繪和記憶體洩露好像是面試經常問的問題。

1、View的重新整理:在需要重新整理的地方,使用handle.sendmessage傳送訊息,然後在handle的getmessage裡面執行invaliate或者postinvaliate。

2、GC記憶體洩露

出現情況:資料庫的cursor沒有關閉。

構造adapter時,沒有使用快取contentview。衍生listview的優化問題:減少建立view的物件,充分使用contentview,可以使用一靜態類來優化處理getview的過程。

Bitmap物件不使用時採用recycle()釋放記憶體。

activity中的物件的生命週期大於activity。

Activity

1、activity的生命週期

你自己寫的Activity會按需要過載這些方法,onCreate是免不了的,在一個Activity正常啟動的過程中,他們被呼叫的順序是 onCreate -> onStart ->onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy,這樣就是一個完整的生命週期,但是有人問了,程式正執行著呢來電話了,這個程式咋辦?中止了唄,如果中止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,如果打斷這個應用程式的是一個Theme為Translucent 或者Dialog 的Activity那麼只是onPause ,恢復的時候onResume 。

onCreate:在這裡建立介面,做一些資料的初始化工作。

onStart:到這一步變成使用者可見不可互動的。

onResume:變成和使用者可互動的,(在activity棧系統通過棧的方法管理這些個Activity的最上面,執行完彈出棧,則回到上一個Activity)

onPause:到這一步是可見但不可互動的,系統會停止動畫等消耗CPU的事情,從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在onResume裡讀出來,注意:這個方法裡做的事情時間要端,因為下一個activity不會等到這個方法完成才啟動。

onStop:變的不可見,被下一個activity覆蓋了。

onDestroy:這是activity被幹掉前的最後一個唄呼叫的方法了,可能是外面類呼叫finish方法或者是系統為了節省空間將它暫時性的幹掉,可以用isFinishing()來判斷,如果你有一個Progress Dialog線上程中轉動,請在onDestroy裡把他cancel掉,不然等執行緒結束的時候,呼叫Dialog的cancel方法會丟擲異常。

onPause,onStop,onDestroy,三種狀態下activity都有可能被系統幹掉為了保證程式的正確性,你要在onPause()裡寫上持久層操作的程式碼,將使用者編輯的內容都儲存到儲存介質上(一般都是資料庫)。實際工作中因為生命週期的變化而帶來的問題也很多,比如你的應用程式起了新的執行緒在跑,這時候中斷了,你還要去維護那個執行緒,是暫停還是殺掉還是資料回滾。因為Activity可能被殺掉,所以執行緒中使用的變數和一些介面元素就千萬要注意了,一般我都是採用Android的訊息機制【Handler Message】來處理多執行緒和介面互動的問題。

2、讓Activity變成一個視窗:Activity屬性設定

可用來實現一個漂浮在手機主介面的東西,只需要設定一下Activity的主題就可以了,在AndroidManifest.xml中定義Activity的地方加一句:android:theme="@android:style/Theme.Dialog"這就使你的程式變成對話方塊的形式彈出來。若想變成半透明的,則新增:android:theme="@android:style/Theme.Translucent"。

3、你後臺的Activity被系統回收怎麼辦:onSaveInstanceState

當你的程式中某一個Activity A在執行時中,主動或被動地執行另一個新的Activity B 這個時候A會執行Java程式碼:

1 public void onSaveInstanceState(Bundle outState) {
2 super.onSaveInstanceState(outState);
3 outState.putLong("id", 1234567890);
4 }
B完成以後又會來找A,這個時候就有兩種情況,一種是A被回收,一種是沒有被回收,被回收的A就要重新呼叫onCreate()方法,不同於直接啟動的是執行onCreate()裡是帶上引數savedInstanceState,沒被收回的就還是onResume就好了。

savedInstanceState是一個Bundle物件,你基本上可以把它理解為系統幫你維護一個Map物件。在onCreate()裡你可能會用到它,如果正常啟動onCreate就不會有它,所以用的時候要判斷一下是否為空。

1 if(savedInstanceState !=null){
2 long id =savedInstanceState.getLong("id");
3 }
4、呼叫與被呼叫:通訊使者Intent

Intent就是這個意圖,應用程式間Intent進行交流。系統看到意圖就會喚醒響應的程式。

Intent通過什麼來告訴系統需要誰來接受自己,第一種方法是直接說明需要哪一個類來接收

1 Intent intent = new Intent(this,MyActivity.class);
2 intent.getExtras().putString("id""1");
3 startActivity(intent);
第一種方式很明顯,直接指定了MyActivity為接受者,並且傳了一些資料給MyActivity,在MyActivity裡可以用getIntent()來得到這個intent和資料;

第二種就需要先看一下AndroidManifest中的intentfilter的配置。