常見Android面試題及答案(詳細整理)

如下是一些經常使用的Android面試題及答案,有須要沒須要均可以備着,但願能幫到你們。html

 

1. 請描述一下Activity 生命週期。java

答: 以下圖所示。共有七個周期函數,按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。android

onCreate(): 建立Activity時調用,設置在該方法中,還以Bundle的形式提供對之前存儲的任何狀態的訪問。web

onStart(): Activity變爲在屏幕上對用戶可見時調用。面試

onResume(): Activity開始與用戶交互時調用(不管是啓動仍是從新啓動一個活動,該方法老是被調用。數據庫

onPause(): Activity被暫停或收回cpu和其餘資源時調用,該方法用戶保護活動狀態的,也是保護現場。緩存

onStop(): Activity被中止並轉爲不可見階段及後續的生命週期事件時調用。安全

onRestart(): Activity被從新啓動時調用。該活動仍然在棧中,而不是啓動新的Activity。微信

一、完整生命週期: 即從一個Activity從出現到消失,對應的週期方法是從onCreate()到onDestroy()。網絡

二、可見生命週期: 當Activity處於能夠用戶看見的狀態,但不必定能與用戶交互時,將屢次執行從onStart()到onStop()。

三、前景生命週期: 當Activity處於Activity棧最頂端,可以與其餘用戶進行交互時,將屢次執行從onResume()到onPause()。

 

2. 兩個Activity之間跳轉時必然會執行的是哪幾個方法。

答: 兩個Activity之間跳轉必然會執行的是下面幾個方法。

onCreate()//在Activity生命週期開始時調用。

onRestoreInstanceState()//用來恢復UI狀態。

onRestart()//當Activity從新啓動時調用。

onStart()//當Activity對用戶即將可見時調用。

onResume()//當Activity與用戶交互時,繪製界面。

onSaveInstanceState()//即將移出棧頂保留UI狀態時調用。

onPause()//暫停當前活動Activity,提交持久數據的改變,中止動畫或其餘佔用GPU資源的東西,因爲下一個Activity在這個方法返回以前不會resume,因此這個方法的代碼執行要快。

onStop()//Activity再也不可見時調用。

onDestroy()//Activity銷燬棧時被調用的最後一個方法。

 

3. 橫豎屏切換時候Activity的生命週期。

答: 

一、不設置Activity的android: configChanges時,切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次。

二、設置Activity的android: configChanges=「orientation」時,切屏仍是會從新調用各個生命週期,切橫、豎屏時只會執行一次。

三、設置Activity的android: configChanges=「orientation|keyboardHidden」時,切屏不會從新調用各個生命週期,只會執行onConfiguration方法

 

4. 如何將一個Activity設置成窗口的樣式。

答: 第一種方法,在styles.xml文件中,能夠新建以下的相似Dialog的style。

<style name=「Theme.FloatActivity」 parent=「android:style/Theme.Dialog」> </style>。

第二種方法,在AndroidManifest.xml中在須要顯示爲窗口的Activity中添加以下屬性:  android: theme=「@style/Theme.FloatActivity」便可。也能夠直接添加對應須要展現爲Dialog style的Activity的android: theme屬性爲android: theme=「@ android: style/Theme.Dialog」。

 

5. 兩個Activity之間怎麼傳遞數據?

答: 能夠在Intent對象中利用Extra來傳遞存儲數據。

在Intent的對象請求中,使用putExtra(「鍵值對的名字」,」鍵值對的值」);在另一個Activity中將Intent中的請求數據取出來: 

Intent intent = getIntent();

String value = intent.getStringExtra(「testIntent」);

 

6. 怎麼讓在啓動一個Activity是就啓動一個service?

答: 首先定義好一個service,而後在Activity的onCreate裏面進行鏈接並bindservice或者直接startService。

 

7. Activity怎麼和service綁定,怎麼在activity中啓動本身對應的service?

答: 

一、activity能進行綁定得益於Serviece的接口。爲了支持Service的綁定,實現onBind方法。

二、Service和Activity的鏈接能夠用ServiceConnection來實現。須要實現一個新的 ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦鏈接創建,就能 獲得Service實例的引用。

三、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的實例

 

8.什麼是Service以及描述下它的生命週期。Service有哪些啓動方法,有什麼區別,怎樣停用Service?

答: Android Service是運行在後臺的代碼,不能與用戶交互,能夠運行在本身的進程,也能夠運行在其餘應用程序進程的上下文裏。須要經過某一個Activity或 者Context對象來調用。Service有兩個啓動方法,分別是Context.startService()和 Context.bindService()。若是在Service執行耗時的操做須要啓動一個新線程來執行。

Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當咱們第一次啓動Service時,前後調用onCreate(), onStart()這兩個方法,當中止Service時,則執行onDestroy()方法時。若是Service已經啓動了,當咱們再次啓動 Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。

 

9. 何時使用Service?

答: 好比播放多媒體的時候,用戶啓動了其餘Activity,這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記錄你的地理信息位置的改變等等。

 

10. 請描述一下Intent 和 Intent Filter。

答: Intent在Android中被翻譯爲」意圖」,他是三種應用程序基本組件-Activity,Service和broadcast receiver之間相互激活的手段。在調用Intent名稱時使用ComponentName也就是類的全名時爲顯示調用。這種方式通常用於應用程序的 內部調用,由於你不必定會知作別人寫的類的全名。而Intent Filter是指意圖過濾,不出如今代碼中,而是出如今android Manifest文件中,以<intent-filter>的形式。(有一個例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動態設定的,其中intent filter也是在代碼中建立的)

一個intent有action,data,category等字段。一個隱式intent爲了可以被某個intent filter接收,必須經過3個測試,一個intent爲了被某個組件接收,則必須經過它全部的intent filter中的一個。

 

11. Intent傳遞數據時,能夠傳遞哪些類型數據?

答: intent間傳送數據通常有兩種經常使用的方法: 一、extra 二、data。

extra能夠用Intent.putExtra放入數據。新啓動的Activity可用Intent.getExtras取出Bundle,而後用Bundles.getLong,getInt,getBoolean,getString等函數來取放進去的值。

Data則是傳輸url。url能夠是指咱們熟悉的http,ftp等網絡地址,也能夠指content來指向ContentProvider提供的資源。Intent.setData能夠放入數據,Intent.getData能夠取出數據。

 

12. 說說Activity,Intent,Service是什麼關係 ?

答: 一個Activity一般是一個單獨的屏幕,每個Activity都被實現爲一個單獨的類,這些類都是從Activity基類中繼承而來的。Activity類會顯示由視圖控件組成的用戶接口,並對視圖控件的事件作出響應。

Intent的調用是用來進行屏幕之間的切換。Intent描述應用想要作什麼。Intent數據結構中兩個最重要的部分是動做和動做對應的數據,一個動做對應一個動做數據。

Service是運行在後臺的代碼,不能與用戶交互,能夠運行在本身的進程裏,也能夠運行在其餘應用程序進程的上下文裏。須要一個Activity或者其餘Context對象來調用。

Activity跳轉Activity,Activity啓動Service,Service打開Activity都須要Intent代表意圖,以及傳遞參數,Intent是這些組件間信號傳遞的承載着。

 

13. 請描述一下BroadcastReceiver。

答: Broadcast Receiver用於接收並處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電短信等。程序也能夠播放一個廣播。程序能夠有任意數量的 broadcast receivers來響應它以爲重要的通知。Broadcast receiver能夠經過多種方式通知用戶: 啓動activity、使用NotificationManager、開啓背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就可 以點它打開看通知內容。一般咱們的某個應用或系統自己在某些事件(電池電量不足、來電短信)來臨時會廣播一個Intent出去,咱們利用註冊一個 broadcast
receiver來監聽這些Intent並獲取Intent中的數據。

 

14. 在manifest和代碼中如何註冊和使用 broadcast receiver 。

答: 在android的manifest中註冊

<receiver android: name =「Receiver1」>

     <intent-filter>

         <!----和Intent中的action對應--->

         <actionandroid: name=「com.forrest.action.mybroadcast」/>

     </intent-filter>

</receiver>

在代碼中註冊

一、 IntentFilter filter = new IntentFilter(「com.forrest.action.mybroadcast」);//和廣播中Intent的action對應;

二、 MyBroadcastReceiver br= new MyBroadcastReceiver();

三、 registerReceiver(br, filter);

 

15. 請介紹下ContentProvider是如何實現數據共享的。

答: 一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content provider是以相似數據庫中的表的方式將本身的數據暴露。Content provider存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。

要想使應用程序的數據公開化,可經過2種方法:建立一個數據本身的Content Provider或者將你的數據添加到一個已經存在的Content Provider中,前提是有相同數據類型而且有寫入Content Provider的權限,Android提供了Content Resolverr,外界的程序能夠經過Content Resolver接口訪問Content Provider提供的數據。

 

16. 請介紹下Android的數據存儲方式。

答: Android提供了5中存儲數據的方式,分別是如下幾種

一、使用Shared Preferences存儲數據,用來存儲key-value,pairs格式的數據,它是一個輕量級的鍵值存儲機制,只能夠存儲基本數據類型。

二、使用文件存儲數據,經過FileInputStream和FileOutputStream對文件進行操做。在Android中,文件是一個應用程序私有的,一個應用程序沒法讀寫其餘應用程序的文件。

三、使用SQLite數據庫存儲數據,Android提供的一個標準數據庫,支持SQL語句。

四、使用Content Provider存儲數據,是全部應用程序之間數據存儲和檢索的一個橋樑,它的做用就是使得各個應用程序之間實現數據共享。它是一個特殊的存儲數據的類 型,它提供了一套標準的接口用來獲取數據,操做數據。系統也提供了音頻、視頻、圖像和我的信息等幾個經常使用的Content Provider。若是你想公開本身的私有數據,能夠建立本身的Content Provider類,或者當你對這些數據擁有控制寫入的權限時,將這些數據添加到Content Provider中實現共享。外部訪問經過Content Resolver去訪問並操做這些被暴露的數據。

五、使用網絡存儲數據

 

17. 請介紹下Android中經常使用的五種佈局。

答: 最經常使用的佈局方式爲Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最經常使用的方式,他們能夠經過在xml配置文件或者代碼中進行佈局。

一、Frame Layout是最簡單的佈局方式,放置的控件都只能羅列到左上角,控件會有重疊,不能進行復雜的佈局。

二、Linear Layout能夠經過orientation屬性設置線性排列的方向是垂直仍是縱向的,每行或每列只有一個元素,能夠進行復雜的佈局。

三、Absolute Layout可讓子元素指定準確的x、y座標值,並顯示在屏幕上。Absolute Layout沒有頁邊框,容許元素之間相互重疊。它是絕對座標,因此在實際中不提倡使用。

 

四、Relative Layout容許子元素制定他們相對於其餘元素或父元素的位置(經過ID制定)。所以,你能夠以右對齊,或上下,或置於屏幕中央的形式來排列兩個元素。元 素按順序排列,所以若是第一個元素在屏幕的中央,那麼相對於這個元素的其餘元素將以屏幕中央的相對位置來排列。這個是相對於Absolute Layout的,採用相對座標,因此在實際中比較經常使用。

五、Table Layout將以子元素的位置分配到行或列。一個Table Layout由許多的Table Row組成,每一個Table Row都會定義一個row。Table Layout容器不會顯示row、column或者cell的邊線框。每一個row擁有0個或多個的cell; 和html中的table差很少。在實際中也常用。

 

18. 談談UI中, Padding和Margin有什麼區別?

答: Padding是控件的內容相對控件的邊緣的邊距,而Margin是控件邊緣相對於其餘控件的邊距。以下圖所示:

 

19.  android自己的一些限制,好比apk包大小限制,讀取大文件時的時間限。

答:apk包大小限制很差說,有的apk爲100M,仍是能裝到手機上。通常的apk大小爲5~10M左右。讀取大文件的時間應該是在main線程裏面,時間限制爲5秒左右。

 

20. ListView如何提升其效率?

答:一、使用分頁加載,不要一次性加載全部數據。

二、複用convertView。在getItemView中,判斷converView是否爲空,若是不爲空,可複用。

三、異步加載圖片。Item中若是包含有webimage,那麼最好異步加載。

四、快速滑動時,不顯示圖片。當快速滑動列表(SCROLL_STATE_FLING),item中的圖片或獲取須要消耗資源的 view,能夠不顯示出來;而處於其餘兩種狀態(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些 view顯示出來

 

21. Android程序與Java程序的區別?

區別

Java程序

Android程序

執行入口點

Main

Android Mainfest.xml配置文件中的intent-filter

UI

Frame·

Activity

是否基於配置文件

是否基於組件

是Activity,Service,Broadcast Receiver,Content Provider

 

22. 談談對Android NDK的理解。

答: android NDK是一套工具,容許Android應用開發者嵌入從C、C++源代碼編譯來的本地機器代碼到各自的應用軟件包中。

一、 NDK是一系列工具的集合。

NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一塊兒打包成apk。這些工具對開發者幫助時巨大的。

NDK集成了交叉編輯器,並提供了相應的mk文件隔離CPU、平臺、API等差別,開發人員只須要簡單修改mk文件(指出「那些文件須要編譯」、「編譯特性要求」等),就能夠建立出so。NDK能夠自動將so和Java應用一塊兒打包,極大的減輕了開發人員的打包工做。

二、NDK提供了一份穩定、功能有限的API頭文件聲明。這些API支持的功能很是有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、log庫(liblog)。

 

23. 談談Android的優勢和不足之處。

答: 優勢以下所示:

一、android是開源、市場佔有率大。

二、android可以有豐富的硬件選擇。

三、android是一款基於Linux平臺的開源操做系統,從而避免了專利壁壘,是一款徹底免費的只能手機平臺。

四、因爲android是google開發的,所以可以無縫結合Google應用。

缺點以下所示:

一、安全與隱私。手機與互聯網緊密聯繫,我的隱私很可貴到保守。

 

24. Android系統中GC什麼狀況下會出現內存泄露呢?

答: 致使內存泄露主要的緣由是,先前申請了內存空間而忘記了釋放。若是程序中存在無用對象的引用,那麼這些對象就會駐留內存,消耗內存,由於沒法讓垃圾回收器 GC驗證這些對象是否再也不須要。若是存在對象的引用,這個對象就被定義爲「有效的活動」,同時不會被釋放。要肯定對象所佔內存將被回收,咱們就要確認該對 象不會再被使用。典型的作法是把對象數據成員設爲null或者從集合中移除該對象。當出現如下狀況時,會形成內存泄露:

一、 數據庫的cursor沒有關閉。

二、 構造adapter時,沒有使用緩存contentview。

三、 Bitmap對象不使用時,採用recycle()釋放內存。

四、 Activity中的對象的生命週期大於activity。

調試方法: DDMS==>HEAPSIZE==>dataobject==>[TotalSize]

 

25. Android UI中的View如何刷新。

答: Android中對View的更新方式有不少種,使用時要區分不一樣的應用場合。要分清的是:多線程和雙緩衝。

一、不使用多線程和雙緩衝

這種狀況最簡單,通常只但願View在發生改變時對UI進行重繪。你只須要Activity中顯式調用View對象中的invalidate()方法便可。系統會自動調用View的onDraw()方法。

二、使用多線程和不使用雙緩衝

這種狀況下須要開啓新的線程,新開的線程就很差訪問View對象了。強行訪問的話會報 錯:android.view.ViewRoot$ CalledFromWrongThreadException: only theoriginal thread that created a view hierarchy can touch its views。

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

 

三、使用多線程和雙緩衝

Android的SurfaceView是View的子類,她同時也實現了雙緩衝。你能夠定義一個她的子類並實現 Surfaceholder.Callback接口。因爲SurfaceHolder.Callback接口,新線程就不要 android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法能夠鎖定畫布,繪製完新的圖像後調用 unlockCanvasand Post解鎖。

 (來自威哥幹Java的微信文章)

相關文章
相關標籤/搜索