當前位置:編程學習大全網 - 圖片素材 - android面試題會出現什麽內容

android面試題會出現什麽內容

這是壹篇介紹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(“”);

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?如何避免?能否捕獲導致其的異常?

答:如空指針等可以導致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開發人員工發的程序也處於該層,而且和內置的應用程序具有平等的地位,可以調用內置的應用程序,也可以替換內置的應用程序

  • 上一篇:年金現值怎麽求?
  • 下一篇:意大利女子19年11月已感染新冠是最早的病例嗎?
  • copyright 2024編程學習大全網