Android面試題精選

來源:互聯網
上載者:User

Android面試題精選

1.android dvm 的進程和Linux的進程,應用程式的進程是否為同一個概念:

答:dvm是dalivk虛擬機器。每一個android應用程式都在自己的進程中運行,都擁有一個dalivk虛擬機器執行個體。而每一個dvm都是在linux的一個進程。所以說可以認為是同一個概念。

2.android的動畫有哪幾種?他們的特點和區別是什嗎?

答:兩種,一種是tween動畫,一種是frame動畫。tween動畫,這種實現方式可以使視圖組件移動,放大或縮小以及產生透明度的變化。frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

3.handler進位的原理:

答:android提供了handler和looper來滿足線程間的通訊。Handler先進先出原則。looper用來管理特定線程內對象之間的訊息交換(message Exchange).

1)looper:一個線程可以產生一個looper對象,由它來管理此線程裡的message queue(訊息佇列)

2)handler:你可以構造一個handler對象來與looper溝通,以便push新訊息到messagequeue裡;或者接收looper(從messagequeue裡取出)所送來的訊息。

3)messagequeue:用來存放線程放入的訊息。

4)線程:UI thread 通常就是main thread,而android啟動程式時會為它建立一個message queue.

4.android view的重新整理:

答:Android中對View的更新有很多種方式,使用時要區分不同的應用場合。我感覺最要緊的是分清:多線程和雙緩衝的使用方式。

1).不使用多線程和雙緩衝

這種情況最簡單了,一般只是希望在View發生改變時對UI進行重繪。你只需在Activity中顯式地調用View對象中的invalidate()方法即可。系統會自動調用 View的onDraw()方法。

2).使用多線程和不使用雙緩衝

這種情況需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.

這時候你需要建立一個繼承了android.os.Handler的子類,並重寫handleMessage(Messagemsg)方法。android.os.Handler是能發送和處理訊息的,你需要在Activity中發出更新UI的訊息,然後再你的Handler(可以使用匿名內部類)中處理訊息(因為匿名內部類可以訪問父類變數,你可以直接調用View對象中的invalidate()方法 )。也就是說:在新線程建立並發送一個Message,然後再主線程中捕獲、處理該訊息。

3).使用多線程和雙緩衝

Android中SurfaceView是View的子類,她同時也實現了雙緩衝。你可以定義一個她的子類並實現SurfaceHolder.Callback介面。由於實現SurfaceHolder.Callback介面,新線程就不需要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪製玩新的映像後調用unlockCanvasAndPost(canvas)解鎖(顯示),還是比較方便得。

5.說說mvc模式的原理,它在android中的運用:

答:android的官方建議應用程式的開發採用mvc模式。何謂mvc?

 mvc是model,view,controller的縮寫,mvc包含三個部分:

  l模型(model)對象:是應用程式的主體部分,所有的商務邏輯都應該寫在該層。

  2視圖(view)對象:是應用程式中負責產生使用者介面的部分。也是在整個mvc架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。

  3控制器(control)對象:是根據使用者的輸入,控制使用者介面資料顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,想用使用者出發的相關事件,交給m哦得了處理。

 

 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裡面處理,當然對業務計算等操作也是必須放在的該層的。

 

6.Activity的生命週期:

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

 

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

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

  onPause: 到這一步是可見但不可互動的,系統會停止動畫 等消耗CPU 的事情從上文的描述已經知道,應該在這裡儲存你的一些資料,因為這個時候你的程式的優先順序降低,有可能被系統收回。在這裡儲存的資料,應該在

  onstop: 變得不可見,被下一個activity覆蓋了

onDestroy: 這是activity被幹掉前最後一個被呼叫者法了,可能是外面類調用finish方法或者是系統為了節省空間的將它暫時性的幹掉

 

7.讓Activity變成一個視窗:

答:Activity屬性設定:有時候會做個應用程式是漂浮在手機主介面的。這個只需要在設定下Activity的主題theme,即在Manifest.xml定義Activity的地方加一句:

android :theme="@android:style/Theme.Dialog"
如果是作半透明的效果:

android:theme="@android:style/Theme.Translucent"

8.Android中常用的五種布局:

答:LinearLayout線性布局;AbsoluteLayout絕對布局;TableLayout表格版面配置;RelativeLayout相對布局;FrameLayout幀布局;

9.Android的五種資料存放區方式:

答:sharedPreferences;檔案;SQLite;contentProvider;網路

10.請解釋下在單執行緒模式中Message、Handler、Message Queue、Looper之間的關係:

答:Handler擷取當前線程中的looper對象,looper用來從存有Message的Message Queue裡取出message,再由Handler進行message的分發和處理。

11.AIDL的全稱是什麼?如何工作?能處理哪些類型的資料?

答:AIDL(AndroidInterface Definition Language)android介面描述語言

12.系統上安裝了多種瀏覽器,能否指定某瀏覽器訪問指定頁面?請說明原由:

答:通過直接發送Uri把參數帶過去,或者通過manifest裡的intentfilter裡的data屬性。代碼如下:
Intent intent = new Intent();

Intent.setAction(“android.intent.action.View”);

Uri uriBrowsers = Uri.parse(“http://www.sina.com.cn”);

Intent.setData(uriBrowsers);

//包名、要開啟的activity
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);

startActivity(intent);

13.什麼是ANR,如何避免?

答:ANR的定義:

在android上,如果你的應用程式有一段時間響應不移靈敏,系統會向使用者提示“應用程式無響應”(ANR:application Not Responding)對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者。

如何避免:

首先來研究下為什麼它會在android的應用程式裡發生和如何最佳構建應用程式來避免ANR.
android應用程式通常是運行在一個單獨的線程(例如:main)裡,這就意味你的應用程式所做的事情如果在主線程裡佔用了大長時間的話,就會引發ANR對話方塊,因為你的應用程式並沒有給自己機會來處理輸入事件或者Intent廣播。

因此,運行在主線程裡的任何訪求都儘可能少做事情。特別是,activity應該在它的關鍵生命週期方法(onCreate()和onResume())裡儘可能少的去作建立操作。潛在的耗時操作,例如網路或資料庫操作,或者高耗時的計算如改變位元影像尺寸,應該在子線程裡(或者以資料庫操作為例,通過非同步請求的方式)來完成。然而,不是說你的主線程阻塞在那裡等待子線程的完成---也不是調用Thread.wait()或者Thread.sleep()。替代的方法是:主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。以這種方式設計你的應用程式,將能保證你的主線程保持對輸入的響應性並能避免由5秒輸入事件的逾時引發的ANR對話方塊。這種做法應該在其它顯示UI的線程裡效仿,因為它們都受相同的逾時影響。

IntentReceiver執行時間的特殊限制意味著它應該做:在後台裡做小的、瑣碎的工作,如儲存設定或註冊一個Notification。和在主線程裡調用的其它方法一樣,應用程式應該避免在BroadcastReceiver裡做耗時的操作或計算,但也不是在子線程裡做這些任務(因為BroadcastReceiver的生命週期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程式應該啟動一個Service。順便提及一句,你也應該避免在Intent Receiver裡啟動一個Activity,因為它會建立一個新的畫面,並從目前使用者正在啟動並執行程式上搶奪焦點。如果你的應用程式在響應Intent廣播時需要向使用者展示什麼,你應該使用Notification Manager來實現。

一般來說,在應用程式裡,100到200ms是使用者能感知阻滯的時間閾值,下面總結了一些技巧來避免ANR,並有助於讓你的應用程式看起來有響應性。

如果你的應用程式為響應使用者輸入正在後台工作的話,可以顯示工作的進度(ProgressBar和ProgressDialog對這種情況來說很有用)。特別是遊戲,在子線程裡做移動的計算。如果你的程式有一個耗時的初始化過程的話,考慮可以顯示一個Splash Screen或者快速顯示主畫面並非同步來填充這些資訊。在這兩種情況下,你都應該顯示進行中的進度,以免使用者認為程式被凍結了。

 

14.什麼情況會導致Force Close?如何避免?能否捕獲導致其的異常?

答:如null 指標等可以導致ForceClose;可以看Logcat,然後找到對應的程式碼來解決錯誤。

15.橫豎屏切換時候的activity的生命週期:

答:

1) 建立一個activity,並把各個生命週期列印出來

2) 運行activity,得到如下資訊:

onCreate()à

onStart()à

onResume()à

3) 按ctrl+F12切換成橫屏時

onSaveInstanceState()à

onPause()à

onStop()à

onDestroy()à

onCreate()à

onStart()à

onRestoreInstanceState()à

onResume()à

4) 再按ctrl+f12切換成豎屏時,發現列印了兩次相同的Log

onSaveInstanceState()à

onPause()à

onStop()à

onDestroyà

onCreate()à

onStart()à

onRestoreInstanceState()à

onResume()à

 

onSaveInstanceState()à

onPause()à

onStop()à

onDestroyà

onCreate()à

onStart()à

onRestoreInstanceState()à

onResume()à

5) 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執行步驟3

onSaveInstanceState()à

onPause()à

onStop()à

onDestroy()à

onCreate()à

onStart()à

onRestoreInstanceState()à

onResume()à

6) 修改AndroidManifest.xml,把該Activity添加android:configChanges=“orientation”,執行步驟4,發現不會再列印相同資訊,但多列印了一行onConfigChanged

onSaveInstanceState()à

onPause()à

onStop()à

onDestroy()à

onCreate()à

onStart()à

onRestoreInstanceState()à

onResume()à

onConfigurationChanged()à

7) 把步驟5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,執行步驟3,就只列印onConfigChanged

onConfigurationChanged()à

8) 把步驟5的android:configChanges=“orientation”改成

android:configChanges=“orientation|keyboradHidden”,執行步驟4

onConfigurationChanged()à

onConfigurationChanged()à

總結:

1) 不設定activity的android:configChanges時切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。

2) 設定activity的android:configChanges=“orientation”時, 切屏會重新調用各個生命週期,切橫屏、豎屏時都只會執行一次,但是豎屏最後多列印一條onConfigurationChanged()

3) 設定activity的android:configChanges=“orientation|keyboardHidden”時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged(),橫屏一次,豎屏兩次

再總結下整個activity的生命週期:

1) 當前activity產生事件彈出Toast和AlertDialog的時候Activity的生命週期不會有改變

2) Activity運行時按下HOME鍵(跟被完全覆蓋一樣的)

onSavaInstanceStateà

onPauseà

onStopà

 

onRestartà

onStartà

onResumeà

3) 未被完全覆蓋,只是失去焦點:

onPauseà

onResumeà

16.如何將SQLite資料庫(.db檔案)與apk檔案一起發布?

答:可以將.db檔案複製到Eclipse Android工程中的res aw目錄中。所有在res aw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。可以將.db檔案複製到res aw目錄中

17.如何將開啟res aw目錄中的資料庫檔案?

答:在Android中不能直接開啟res aw目錄中的資料庫檔案,而需要在程式第一次啟動時將該檔案複製到手機記憶體或SD卡的某個目錄中,然後再開啟該資料庫檔案。複製的基本方法是使用getResources().openRawResource方法獲得res aw目錄中資源的 InputStream對象,然後將該InputStream對象中的資料寫入其他的目錄中相應檔案中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法來開啟任意目錄中的SQLite資料庫檔案。

18.android 中有哪幾種解析xml的類?官方推薦哪種?以及它們的原理和區別:

答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕鬆些,但一些效能敏感的資料庫或手機上還是主要採用SAX方 式,SAX讀取是單向的,優點:不佔記憶體空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML檔案載入到記憶體 中去,這裡Android開發網提醒大家該方法在尋找方面可以和XPath很好的結合如果資料量不是很大推薦使用,而PULL常常用在J2ME對於節點處 理比較好,類似SAX方式,同樣很節省記憶體,在J2ME中我們經常使用的KXML庫來解析。

19.DDMS和TraceView的區別?

答:DDMS是一個程式執行查看器,在裡面可以看見線程和堆棧等資訊,TraceView是程式效能分析器

20.談談Android的IPC機制:

答:IPC是內部進程通訊的簡稱,是共用"具名管道"的資源。Android中的IPC機制是為了讓Activity和Service之間可以隨時的進行互動,故在Android中該機制,只適用於Activity和Service之間的通訊,類似於遠程方法調用,類似於C/S模式的訪問。通過定義AIDL介面檔案來定義IPC介面。Servier端實現IPC介面,Client端調用IPC介面本地代理。

21.NDK是什麼:

答:NDK是一系列工具的集合

NDK提供了一系列的工具,協助開發人員迅速的開發C/C++的動態庫,並能自動將so和java應用打成apk包

NDK整合了交叉編譯器,並提供了相應的mk檔案和隔離cpu,平台等的差異,開發人員只需簡單的修改mk檔案就可以建立出so

22.描述一下android的系統架構:

答:android系統架構分從下往上為Linux核心層、運行庫、應用程式架構層和應用程式層。

Linux核心層:負責硬體的驅動程式、網路、電源、系統安全以及記憶體管理等功能。

運行庫和androidruntion:運行庫:即c/c++函數庫部分,大多數都是開放原始碼的函數庫,例如webkit,該函數庫負責android網頁瀏覽器的運行;例如標準的c函數庫libc、openssl、sqlite等,當然也包括支援遊戲開發的2dsgl和3dopengles,在多媒體方面有mediaframework架構來支援各種影音和圖形檔案的播放與顯示,如mpeg4、h.264、mp3、aac、amr、jpg和png等眾多的多媒體檔案格式。Androidruntion負責解釋和執行產生的dalvik格式的位元組碼

應用軟體架構:java應用程式開發人員主要是使用該層封裝好的api進行快速開發的。

應用程式層:該層是java的應用程式層,android內建的googlemaps、email、IM、瀏覽器等,都處於該層,java開發人員工發的程式也處於該層,而且和內建的應用程式具有平等的地位,可以調用內建的應用程式,也可以替換內建的應用程式

 

23.Activity 與 Task的啟動模式有哪些,它們含義具體是什麼?

答:在一個activity中,有多次調用startActivity來啟動另一個activity,要想只產生一個activity執行個體,可以設定啟動模式。

一個activity有四種啟動模式:standed,signleTop,singleTask,singleInstance

Standed:標準模式,一調用startActivity()方法就會產生一個新的執行個體。

SingleTop:如果已經有一個執行個體位於activity棧頂,就不產生新的執行個體,而只是調用activity中的newInstance()方法。如果不位於棧頂,會產生一個新的執行個體。

singleTask:會在一個新的task中產生這個執行個體,以後每次調用都會使用這個,不會去產生新的執行個體了。

SingleInstance:這個和singleTask基本一樣,只有一個區別:在這個模式下的activity執行個體所處的task中,只能有這個activity執行個體,不能有其他執行個體

24.Application類的作用:

答:API裡的第一句是:

Base class for those who need to maintain global application state

如果想在整個應用中使用全域變數,在java中一般是使用靜態變數,public類型;而在android中如果使用這樣的全域變數就不符合Android的架構架構,但是可以使用一種更優雅的方式就是使用Application context。
首先需要重寫Application,主要重寫裡面的onCreate方法,就是建立的時候,初始設定變數的值。然後在整個應用中的各個檔案中就可以對該變數進行操作了。
啟動Application時,系統會建立一個PID,即進程ID,所有的Activity就會在此進程上運行。那麼我們在Application建立的時候初始化全域變數,同一個應用的所有Activity都可以取到這些全域變數的值,換句話說,我們在某一個Activity中改變了這些全域變數的值,那麼在同一個應用的其他Activity中值就會改變

25.說明onSaveInstanceState() 和 onRestoreInstanceState()在什麼時候被調用:

答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命週期方法,它們不同於 onCreate()、onPause()等生命週期方法,它們並不一定會被觸發。當應用遇到意外情況(如:記憶體不足、使用者直接按Home鍵)由系統銷毀一個Activity時,onSaveInstanceState()才會被調用。但是當使用者主動去銷毀一個Activity時,例如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,使用者的行為決定了不需要儲存Activity的狀態。通常onSaveInstanceState()只適合用於儲存一些臨時性的狀態,而onPause()適合用於資料的持久化儲存。

另外,當螢幕的方向發生了改變, Activity會被摧毀並且被重新建立,如果你想在Activity被摧毀前緩衝一些資料,並且在Activity被重新建立後恢複緩衝的資料。可以重寫Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。

26.android的service的生命週期?哪個方法可以多次被調用:

答:1)與採用Context.startService()方法啟動服務有關的生命週期方法

onCreate() -> onStart() -> onDestroy()

onCreate()該方法在服務被建立時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被建立一次。
onStart() 只有採用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法儘管不會多次建立服務,但onStart() 方法會被多次調用。
onDestroy()該方法在服務被終止時調用。


2)與採用Context.bindService()方法啟動服務有關的生命週期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()

onBind()只有採用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。
onUnbind()只有採用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用。
如果先採用startService()方法啟動服務,然後調用bindService()方法綁定到服務,再調用unbindService()方法解除綁定,最後調用bindService()方法再次綁定到服務,觸發的生命週期方法如下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重載後的方法需返回true] ->onRebind()

27.android的broadcast的生命週期:

答:1)Broadcast receiver生命週期中僅有一個回調方法:
void onReceive(Context curContext, Intent broadcastMsg)
當接收器接收到一條broadcast訊息,Android就會調用onReceiver(),並傳遞給它一個Intent對象,這個對象攜帶著那條broadcast訊息。我們認為僅當執行這個方式時,Broadcast receiver是活動的;這個方法返回時,它就終止了。這就是Broadcast receiver的生命週期。


2)由於Broadcast receiver的生命週期很短,一個帶有活動的Broadcast receiver的進程是受保護的,以避免被幹掉;但是別忘了有一點,Android會在任意時刻幹掉那些攜帶不再活動的組件的進程,所以很可能會造成這個問題。


3)解決上述問題的方案採用一個Service來完成這項工作,Android會認為那個進程中(Service所在的進程)仍然有在活動的組件。

28.android view,surfaceview,glsurfaceview的區別:

答:SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView,可以看出GL和視頻播放以及Camera網路攝影機一般均使用SurfaceView
SurfaceView和View最本質的區別在於,surfaceView是在一個新起的單獨線程中可以重新繪製畫面而View必須在UI的主線程中更新畫面。
那麼在UI的主線程中更新畫面 可能會引發問題,比如你更新畫面的時間過長,那麼你的主UI線程會被你正在畫的函數阻塞。那麼將無法響應按鍵,觸屏等訊息。
當使用surfaceView 由於是在新的線程中更新畫面所以不會阻塞你的UI主線程。但這也帶來了另外一個問題,就是事件同步。比如你觸屏了一下,你需要surfaceView中thread處理,一般就需要有一個event queue的設計來儲存touch event,這會稍稍複雜一點,因為涉及到線程同步。

所以基於以上,根據遊戲特點,一般分成兩類。

1)被動更新畫面的。比如棋類,這種用view就好了。因為畫面的更新是依賴於 onTouch 來更新,可以直接使用 invalidate。 因為這種情況下,這一次Touch和下一次的Touch需要的時間比較長些,不會產生影響。

2)主動更新。比如一個人在一直跑動。這就需要一個單獨的thread不停的重繪人的狀態,避免阻塞main UI thread。所以顯然view不合適,需要surfaceView來控制。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.