Android基礎面試題

來源:互聯網
上載者:User

標籤:

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

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

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

onStart(): Activity變為在螢幕上對使用者可見時調用。

onResume(): Activity開始與使用者互動時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用。

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

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

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

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

2、可見生命週期: 當Activity處於可以使用者看見的狀態,但不一定能與使用者互動時,將多次執行從onStart()到onStop()。

3、前景生命週期: 當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的生命週期。

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

2、設定Activity的android: configChanges=“orientation”時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次。

3、設定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?

答: 1、activity能進行綁定得益於Serviece的介面。為了支援Service的綁定,實現onBind方法。

2、Service和Activity的串連可以用ServiceConnection來實現。需要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦串連建立,就能得到Service執行個體的引用。

3、執行綁定,調用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間傳送資料一般有兩種常用的方法: 1、extra 2、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>

在代碼中註冊

1、 IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”);//和廣播中Intent的action對應;

2、 MyBroadcastReceiver br= new MyBroadcastReceiver();

3、 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中儲存資料的方式,分別是以下幾種

1、使用Shared Preferences儲存資料,用來儲存key-value,pairs格式的資料,它是一個輕量級的KVStore for Redis機制,只可以儲存基礎資料型別 (Elementary Data Type)。

2、使用檔案儲存體資料,通過FileInputStream和FileOutputStream對檔案進行操作。在Android中,檔案是一個應用程式私人的,一個應用程式無法讀寫其他應用程式的檔案。

3、使用SQLite資料庫儲存資料,Android提供的一個標準資料庫,支援SQL語句。

4、使用Content Provider儲存資料,是所有應用程式之間資料存放區和檢索的一個橋樑,它的作用就是使得各個應用程式之間實現資料共用。它是一個特殊的儲存資料的類型,它提供了一套標準的介面用來擷取資料,操作資料。系統也提供了音頻、視頻、映像和個人資訊等幾個常用的Content Provider。如果你想公開自己的私人資料,可以建立自己的Content Provider類,或者當你對這些資料擁有控制寫入的許可權時,將這些資料添加到Content Provider中實現共用。外部存取通過Content Resolver去訪問並操作這些被暴露的資料。

5、使用網路儲存資料

17. 請介紹下Android中常用的五種布局。

答: 最常用的布局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml設定檔或者代碼中進行布局。

1、Frame Layout是最簡單的布局方式,放置的控制項都只能羅列到左上方,控制項會有重疊,不能進行複雜的布局。

2、Linear Layout可以通過orientation屬性設定線性排列的方向是垂直還是縱向的,每行或每列只有一個元素,可以進行複雜的布局。

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

4、Relative Layout允許子項目制定他們相對於其他元素或父元素的位置(通過ID制定)。因此,你可以以靠右對齊,或上下,或置於螢幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在螢幕的中央,那麼相對於這個元素的其他元素將以螢幕中央的相對位置來排列。這個是相對於Absolute Layout的,採用相對座標,所以在實際中比較常用。

5、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如何提高其效率?

答:1、使用分頁載入,不要一次性載入所有資料。

2、複用convertView。在getItemView中,判斷converView是否為空白,如果不為空白,可複用。

3、非同步載入圖片。Item中如果包含有webimage,那麼最好非同步載入。

4、快速滑動時,不顯示圖片。當快速滑動列表(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++原始碼編譯來的本地機器代碼到各自的應用軟體包中。

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

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

NDK整合了交叉編輯器,並提供了相應的mk檔案隔離CPU、平台、API等差異,開發人員只需要簡單修改mk檔案(指出“那些檔案需要編譯”、“編譯特性要求”等),就可以建立出so。NDK可以自動將so和Java應用一起打包,極大的減輕了開發人員的打包工作。

2、NDK提供了一份穩定、功能有限的API標頭檔聲明。這些API支援的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、log庫(liblog)。

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

答: 優點如下所示:

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

2、android能夠有豐富的硬體選擇。

3、android是一款基於Linux平台的開源作業系統,從而避免了專利壁壘,是一款完全免費的只能手機平台。

4、由於android是google開發的,因此能夠無縫結合Google應用。

缺點如下所示:

1、安全與隱私。手機與互連網緊密聯絡,個人隱私很難得到保守。

24. Android系統中GC什麼情況下會出現記憶體泄露呢?

答: 導致記憶體泄露主要的原因是,先前申請了記憶體空間而忘記了釋放。如果程式中存在無用對象的引用,那麼這些對象就會駐留記憶體,消耗記憶體,因為無法讓記憶體回收行程GC驗證這些對象是否不再需要。如果存在對象的引用,這個對象就被定義為“有效活動”,同時不會被釋放。要確定對象所佔記憶體將被回收,我們就要確認該對象不會再被使用。典型的做法是把對象資料成員設為null或者從集合中移除該對象。當出現以下情況時,會造成記憶體泄露:

1、 資料庫的cursor沒有關閉。

2、 構造adapter時,沒有使用緩衝contentview。

3、 Bitmap對象不使用時,採用recycle()釋放記憶體。

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

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

25. Android UI中的View如何重新整理。

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

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

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

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

這種情況下需要開啟新的線程,新開的線程就不好訪問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,然後在主線程中捕獲、處理該訊息。

3、使用多線程和雙緩衝

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

Android基礎面試題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.