android名企面試題總結及解析

1.下面異常是屬於Runtime Exception 的是(abcd)(多選)
A、ArithmeticException   B、IllegalArgumentException  
C、NullPointerException   D、BufferUnderflowException

解析: Java提供了兩類主要的異常:runtime exception和checked exception。checked 異常也就是我們經常遇到的IO異常,以及SQL異常都是這種異常。對於這種異常,JAVA編譯器強制要求我們必需對出現的這些異常進行catch。所以,面對這種異常不管我們是否願意,只能自己去寫一大堆catch塊去處理可能的異常。
出現運行時異常後,系統會把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由Thread.run()拋出,如果是單線程就被main()拋出。拋出之後,如果是線程,這個線程也就退出了。如果是主程序拋出的異常,那麼這整個程序也就退出了。運行時異常是Exception的子類,也有一般異常的特點,是可以被Catch塊處理的。只不過往往我們不對他處理罷了。也就是說,你如果不對運行時異常進行處理,那麼出現運行時異常之後,要麼是線程中止,要麼是主程序終止。
編譯時被檢查的異常和運行時異常的區別:  編譯被檢查的異常在函數內被拋出,函數必須要聲明,否編譯失敗。  聲明的原因:是需要調用者對該異常進行處理。  運行時異常如果在函數內被拋出,在函數上不需要聲明。

2.Math.round(11.5)等於多少(). Math.round(-11.5)等於多少©
A、11 ,-11 B、11 ,-12 C、12 ,-11 D、12 ,-12

解析: Math.ceil()用作向上取整。 Math.floor()用作向下取整。 Math.round() 我們數學中常用到的四捨五入取整。

3.對一些資源以及狀態的操作保存,最好是保存在生命週期的哪個函數中進行(d)
A、onPause() B、onCreate() C、 onResume() D、onStart()

解析:
系統殺死程序會調用onSaveInstanceState(Bundle)進行數據保存,這裏保存的數據會出現在在程序下一次onStart(Bundle)這個Bundle中,onStart時可以將Bundle中數據取出。

4.Intent傳遞數據時,下列的數據類型哪些可以被傳遞(abcd)(多選)
A、Serializable B、charsequence C、Parcelable D、Bundle

解析:
Serializable :將 Java 對象序列化爲二進制文件的 Java 序列化技術是 Java系列技術中一個較爲重要的技術點,在大部分情況下,開發人員只需要瞭解被序列化的類需要實現 Serializable 接口,使用ObjectInputStream 和 ObjectOutputStream 進行對象的讀寫。

charsequence :實現了這個接口的類有:CharBuffer、String、StringBuffer、StringBuilder這個四個類。
CharBuffer爲nio裏面用的一個類,String實現這個接口理所當然,StringBuffer也是一個CharSequence,StringBuilder是Java抄襲C#的一個類,基本和StringBuffer類一樣,效率高,但是不保證線程安全,在不需要多線程的環境下可以考慮。
提供這麼一個接口,有些處理String或者StringBuffer的類就不用重載了。但是這個接口提供的方法有限,只有下面幾個:charat、length、subSequence、toString這幾個方法,感覺如果有必要,還是重載的比較好,避免用instaneof這個操作符。

Parcelable :android提供了一種新的類型:Parcel。本類被用作封裝數據的容器,封裝後的數據可以通過Intent或IPC傳遞。 除了基本類型以 外,只有實現了Parcelable接口的類才能被放入Parcel中。 是GOOGLE在安卓中實現的另一種序列化,功能和Serializable相似,主要是序列化的方式不同

Bundle是將數據傳遞到另一個上下文中或保存或回覆你自己狀態的數據存儲方式。它的數據不是持久化狀態。

5.下列屬於SAX解析xml文件的優點的是(b)
A、將整個文檔樹在內存中,便於操作,支持刪除,修改,重新排列等多種功能
B、不用事先調入整個文檔,佔用資源少
C、整個文檔調入內存,浪費時間和空間
D、不是長久駐留在內存,數據不是持久的,事件過後,若沒有保存數據,數據就會消失

解析: 在Android中提供了三種解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推薦的Pull解析方式。

SAX: 是事件驅動型XML解析的一個標準接口,簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。

DOM:即對象文檔模型,它是將整個XML文檔載入內存(所以效率較低,不推薦使用),使用DOM API遍歷XML樹、檢索所需的數據,每一個節點當做一個對象。

Pull:運行方式與 SAX 解析器相似。它提供了類似的事件,SAX解析器的工作方式是自動將事件推入事件處理器進行處理,因此你不能控制事件的處理主動結束;而Pull解析器的工作方式爲允許你的應用程序代碼主動從解析器中獲取事件,正因爲是主動獲取事件,因此可以在滿足了需要的條件後不再獲取事件,結束解析。pull是一個while循環,隨時可以跳出,而sax是隻要解析了,就必須解析完成。

6.在android中使用Menu時可能需要重寫的方法有(ac)。(多選)
A、onCreateOptionsMenu() B、onCreateMenu() C、onOptionsItemSelected() D、onItemSelected()

解析:
android中有三種菜單

1.選項菜單Options menus :一個Activity只能有一個選項菜單,在按下Menu鍵時,顯示在屏幕下方。

重寫 onCreateContextMenu 用以創建上下文菜單 
重寫 onContextItemSelected 用以響應上下文菜單  

2.上下文菜單Context menus :爲Activity中的任何一個視圖註冊一個上下文菜單,“長按”出現。

重寫 onCreateOptionsMenu 用以創建選項菜單 
重寫 onOptionsItemSelected 用以響應選項菜單 

3.彈出式菜單Popup menus :依賴於Activity中的某個一個視圖

7.android 關於service生命週期的onCreate()和onStart()說法正確的是(ad)(多選題)
A、當第一次啓動的時候先後調用onCreate()和onStart()方法
B、當第一次啓動的時候只會調用onCreate()方法
C、如果service已經啓動,將先後調用onCreate()和onStart()方法
D、如果service已經啓動,只會執行onStart()方法,不在執行onCreate()方法

在這裏插入圖片描述
1). 被啓動的服務的生命週期:如果一個Service被某個Activity 調用 Context.startService 方法啓動,那麼不管是否有Activity使用bindService綁定或unbindService解除綁定到該Service,該Service都在後臺運行。如果一個Service被startService 方法多次啓動,那麼onCreate方法只會調用一次,onStart將會被調用多次(對應調用startService的次數),並且系統只會創建Service的一個實例(因此你應該知道只需要一次stopService調用)。該Service將會一直在後臺運行,而不管對應程序的Activity是否在運行,直到被調用stopService,或自身的stopSelf方法。當然如果系統資源不足,android系統也可能結束服務。

2). 被綁定的服務的生命週期:如果一個Service被某個Activity 調用 Context.bindService 方法綁定啓動,不管調用 bindService 調用幾次,onCreate方法都只會調用一次,同時onStart方法始終不會被調用。當連接建立之後,Service將會一直運行,除非調用Context.unbindService 斷開連接或者之前調用bindService 的 Context 不存在了(如Activity被finish的時候),系統將會自動停止Service,對應onDestroy將被調用。

3). 被啓動又被綁定的服務的生命週期:如果一個Service又被啓動又被綁定,則該Service將會一直在後臺運行。並且不管如何調用,onCreate始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。 4). 當服務被停止時清除服務:當一個Service被終止(1、調用stopService;2、調用stopSelf;3、不再有綁定的連接(沒有被啓動))時,onDestroy方法將會被調用,在這裏你應當做一些清除工作,如停止在Service中創建並運行的線程。 特別注意:

1、你應當知道在調用 bindService 綁定到Service的時候,你就應當保證在某處調用 unbindService 解除綁定(儘管 Activity 被 finish 的時候綁定會自動解除,並且Service會自動停止);
2、你應當注意 使用 startService 啓動服務之後,一定要使用 stopService停止服務,不管你是否使用bindService;
3、同時使用 startService 與 bindService 要注意到,Service 的終止,需要unbindService與stopService同時調用,才能終止 Service,不管 startService 與 bindService 的調用順序,如果先調用 unbindService 此時服務不會自動終止,再調用 stopService 之後服務纔會停止,如果先調用 stopService 此時服務也不會終止,而再調用 unbindService 或者 之前調用 bindService 的 Context 不存在了(如Activity 被 finish 的時候)之後服務纔會自動停止;
4、當在旋轉手機屏幕的時候,當手機屏幕在“橫”“豎”變換時,此時如果你的 Activity 如果會自動旋轉的話,旋轉其實是 Activity 的重新創建,因此旋轉之前的使用 bindService 建立的連接便會斷開(Context 不存在了),對應服務的生命週期與上述相同。
5、在 sdk 2.0 及其以後的版本中,對應的 onStart 已經被否決變爲了 onStartCommand,不過之前的 onStart 任然有效。這意味着,如果你開發的應用程序用的 sdk 爲 2.0 及其以後的版本,那麼你應當使用 onStartCommand 而不是 onStart。

8. 下面是屬於GLSurFaceView特性的是(abc)(多選)
A、管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
B、管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
C、讓渲染器在獨立的線程裏運作,和UI線程分離。
D、可以直接從內存或者DMA等硬件接口取得圖像數據

解析:
Android遊戲當中主要的除了控制類外就是顯示類View。SurfaceView是從View基類中派生出來的顯示類。android遊戲開發中常用的三種視圖是:view、SurfaceView和GLSurfaceView。
  View:顯示視圖,內置畫布,提供圖形繪製函數、觸屏事件、按鍵事件函數等;必須在UI主線程內更新畫面,速度較慢。

SurfaceView:基於view視圖進行拓展的視圖類,更適合2D遊戲的開發;是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快。

GLSurfaceView:基於SurfaceView視圖再次進行拓展的視圖類,專用於3D遊戲開發的視圖;是SurfaceView的子類,openGL專用。

GLSurfaceView提供了下列特性:
1.管理一個surface,這個surface就是一塊特殊的內存,能直接排版到android的視圖view上。
2.管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。
3.用戶自定義渲染器(render)。
4 . 讓渲染器在獨立的線程裏運作,和UI線程分離。
5.支持按需渲染(on-demand)和連續渲染(continuous)。
6.一些可選工具,如調試。
9.關於ContenValues類說法正確的是(a)
A、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的名是String類型,而值都是基本類型  
B、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的名是任意類型,而值都是基本類型   
C、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的名,可以爲空,而值都是String類型   
D、他和Hashtable比較類似,也是負責存儲一些名值對,但是他存儲的名值對當中的名是String類型,而值也是String類型

解析: ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的區別就在於,contenvalues Key只能是String類型,values只能存儲基本類型的數據,像string,int之類的,不能存儲對象這種東西。ContentValues 常用在數據庫中的操作。

HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。
10.下面退出Activity錯誤的方法是( c )
A、finish() B、拋異常強制退出 C、System.exit() D、onStop()

在這裏插入圖片描述
解析:finish():在你的activity動作完成的時候,或者Activity需要關閉的時候,調用此方法。當你調用此方法的時候,系統只是將最上面的Activity移出了棧,並沒有及時的調用onDestory()方法,其佔用的資源也沒有被及時釋放。因爲移出了棧,所以當你點擊手機上面的“back”按鍵的時候,也不會再找到這個Activity。finish函數僅僅把當前Activity退出了,但是並沒有釋放他的資源。安卓系統自己決定何時從內存中釋放應用程序。當系統沒有可用內存到時候,會按照優先級,釋放部分應用。

onDestory():系統銷燬了這個Activity的實例在內存中佔據的空間。 在Activity的生命週期中,onDestory()方法是他生命的最後一步,資源空間等就被回收了。當重新進入此Activity的時候,必須重新創建,執行onCreate()方法。

System.exit(0):退出整個應用程序(不僅僅是當前activity)。將整個進程直接Kill掉。

11.關於res/raw目錄說法正確的是(a)
A、 這裏的文件是原封不動的存儲到設備上不會轉換爲二進制的格式
B、這裏的文件是原封不動的存儲到設備上會轉換爲二進制的格式
C、 這裏的文件最終以二進制的格式存儲到指定的包中
D、這裏的文件最終不會以二進制的格式存儲到指定的包中

解析:
res/raw和assets的相同點:
兩者目錄下的文件在打包後會原封不動的保存在apk包中,不會被編譯成二進制。

res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類。

android中常用的四個佈局是framlayout,linenarlayout,relativelayout和tablelayout。
android 的四大組件是activiey,service,broadcast和contentprovide。
activity一般會重載7個方法用來維護其生命週期,除了onCreate(),onStart(),onDestory() 外還有onpause,onresume,onstop,onrestart。
android的數據存儲的方式sharedpreference,文件,SQlite,contentprovider,網絡。

什麼是ANR 如何避免它?

在Android裏,應用程序的響應性是由Activity Manager和Window Manager系統服務監視的。當它監測到以下情況中的一個時,Android就會針對特定的應用程序顯示ANR:
在5秒內沒有響應輸入的事件(例如,按鍵按下,屏幕觸摸)
BroadcastReceiver在10秒內沒有執行完畢。
Android應用程序通常是運行在一個單獨的線程(例如,main)裏。這意味着你的應用程序所做的事情如果在主線程裏佔用了太長的時間的話,就會引發ANR對話框,因爲你的應用程序並沒有給自己機會來處理輸入事件或者Intent廣播。
在主線程裏儘量的少做事情,比如高耗時的計算和網絡、數據庫等潛在的耗時操作都應該放在子線程來完成。

ContentProvider:

提供了我們在應用程序之前共享數據的一種機制,而我們知道每一個應用程序都是運行在不同的應用程序的,數據和文件在不同應用程序之間達到數據的共享不是沒有可能,而是顯得比較複雜,而正好Android中的ContentProvider則達到了這一需求,比如有時候我們需要操作手機裏的聯繫人,手機裏的多媒體等一些信息,我們都可以用到這個ContentProvider來達到我們所需。
1)、ContentProvider爲存儲和獲取數據提供了統一的接口。ContentProvide對數據進行封裝,不用關心數據存儲的細節。使用表的形式來組織數據。 2)、使用ContentProvider可以在不同的應用程序之間共享數據。 3)、Android爲常見的一些數據提供了默認的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。 總的來說使用ContentProvider對外共享數據的好處是統一了數據的訪問方式。
Uri爲系統的每一個資源給其一個名字,比方說通話記錄。每一個ContentProvider都擁有一個公共的URI,這個URI用於表示這個ContentProvider所提供的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章