Android面試題整理(附有答案)

Java部分

1.GC是什么? 為什么要有GC?

GC是垃圾收集的意思(Gabage Collection),內(nèi)存處理是編程人員容易出現(xiàn)問題的地方,忘記或者錯誤的內(nèi)存回收會導(dǎo)致程序或系統(tǒng)的不穩(wěn)定甚至崩潰,Java 提供的GC功能可以自動監(jiān)測對象是否超過作用域從而達(dá)到自動回收內(nèi)存的目的,Java語言沒有提供釋放已分配內(nèi)存的顯示操作方法。

2.XML包括哪些解釋技術(shù),區(qū)別是什么?

DOM和SAX

DOM將文檔解析成一顆文檔樹,可在節(jié)點上進(jìn)行遍歷、增加、修改和刪除。一次性讀入內(nèi)存,對內(nèi)存消耗大。

SAX至上而下解析文檔,以事件進(jìn)行驅(qū)動。不會一次性讀入內(nèi)存,對內(nèi)存消耗小,不能任意讀取節(jié)點,并且不能對節(jié)點進(jìn)行增加、修改和刪除。

3.switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。

4.”==”和equals方法究竟有什么區(qū)別?

==和equals都可以比較地址。==是運算符,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字符串內(nèi)容。

5.構(gòu)造方法能否被重寫和重載?

構(gòu)造方法不能被重寫但是能被重載。

6.面向?qū)ο蟮奶卣饔心男?/p>

封裝、繼承、多態(tài)和抽象。

7.抽象類和接口的區(qū)別?

1).抽象類是abstract class修飾,接口是interface修飾。

2).抽象類可以有任意類型的屬性,接口只能有靜態(tài)常量修飾的屬性。

3).抽象類可以有普通方法和抽象法方法,接口的方法都是抽象方法。

4).抽象類和接口都不能實例化,但是抽象類有構(gòu)造方法,接口沒有構(gòu)造方法。

5).抽象類只能單根繼承,接口可以多重實現(xiàn)。

8.內(nèi)部類可以引用它的包含類的成員嗎?有沒有什么限制?

可以引用。如果需要指定當(dāng)前類時要用外部類.this來引用。如果引用局部變量,需要將局部變量指定為final。

9.String s = new String(“xyz”);創(chuàng)建了幾個String Object? 二者之間有什么區(qū)別?

2個對象。”xyz”創(chuàng)建在字符串常量池中,new String()創(chuàng)建在堆中。

10.try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執(zhí)行,什么時候被執(zhí)行,在return前還是后?

會在return前執(zhí)行。

11.Integer與int的區(qū)別

Integer為包裝類,int是基本數(shù)據(jù)類型。包裝類擁有方法和屬性,基本數(shù)據(jù)類型不具備。包裝類可以通過intValue來轉(zhuǎn)換成基本數(shù)據(jù)類型,也可以通過new Integer()將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝類。在JDK1.5后,包裝類和基本數(shù)據(jù)類型可以實現(xiàn)自動轉(zhuǎn)換。

12.sleep()和wait()有什么區(qū)別?

sleep是Thread類的方法,wait是Object類的方法。

sleep是自動喚醒,wait需要其他線程來喚醒。

sleep不會釋放同步鎖,wait會釋放同步鎖。

sleep可以用在任意方法中,wait只能用在同步方法或同步塊中。

Sleep()不會釋放對象鎖到時自動恢復(fù), wait()會釋放對象鎖 進(jìn)入等待此對象的等待鎖定池 發(fā)出notify()方法后 才進(jìn)入等待鎖定池準(zhǔn)備對象鎖的獲 取進(jìn)入運行狀態(tài)

13.同步和異步有何異同,在什么情況下分別使用他們?

同步指同一時間只能一個線程執(zhí)行該方法,其他線程需要等待。異步指多個線程可以同時執(zhí)行某個方法,并共享同一資源。

同步可以讓訪問的資源具有安全性,因為同一時間只能一個線程對其進(jìn)行訪問。但是效率不高。

異步對訪問的資源會造成不穩(wěn)定性,比如多個線程同時訪問一個資源,一個在修改、一個在刪除、一個在讀取,這樣可能會造成資源的混亂。但是由于同時運行, 執(zhí)行效率得到提高。

14.啟動一個線程是用run()還是start()?

start()方法啟動線程,run方法是線程執(zhí)行的主方法。

15.java中有幾種類型的流?JDK為每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?

java中有三種流,分別是字節(jié)流(InputStream、OutputStream)、字符流(Reader、Writer)、對象流(ObjectInputStream、 ObjectOutputStream)。

16.字節(jié)流與字符流的區(qū)別?

字節(jié)流用于讀取或?qū)懗龆M(jìn)制數(shù)據(jù),比如圖片、影像等數(shù)據(jù)。

字符流用于讀取或?qū)懗鲎址麛?shù)據(jù),比如傳輸字符串。

所有的數(shù)據(jù)都可以通過字節(jié)流來進(jìn)行處理,不過如果是字符數(shù)據(jù),用字節(jié)流還需要進(jìn)行轉(zhuǎn)換后傳輸,如果使用字符流可以方便數(shù)據(jù)的轉(zhuǎn)換。

17.error和exception有什么區(qū)別?

error是系統(tǒng)錯誤,代碼不能處理的錯誤,比如內(nèi)存溢出、堆棧溢出等。

exception是程序異常,可以通過代碼try-catch進(jìn)行處理,比如空指針異常,數(shù)組越界等。

18.談?wù)刦inal,finally,finalize的區(qū)別?

final是修飾符,可以修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。

finally是異常處理塊中的代碼塊,表示無論如何都會執(zhí)行的代碼塊。

finalize是Object類的方法,該方法在對象被垃圾回收之前執(zhí)行的方法。

19.當(dāng)一個線程進(jìn)入一個對象的一個synchronized方法后,其它線程是否可進(jìn)入此對象的其它方法?

如果其他方法沒有加synchronized的話是可以進(jìn)入的。

20.當(dāng)一個對象被當(dāng)作參數(shù)傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞?

java中只有值傳遞,如果傳遞的對象,實際也是傳遞該對象的地址。

21.作用域public,private,protected,以及不寫時的區(qū)別

public公共修飾符,表示任意類都可以訪問。

protected為受保護(hù)的修飾符,表示同類、同包以及不同包但是父子關(guān)系的是可以訪問。

不寫表示默認(rèn)修飾符,或者稱為package修飾符,該修飾符表示只有同類或同包下的類可以訪問,出了這個包就不能訪問了。

private為私有修飾符,表示只有同類中可以訪問,出了這個類就不能訪問了。

22.用最有效率的方法算出2乘以8等於幾 2《 3

將2的二進(jìn)制向左移3位。java中用<<來移位。

23.heap和stack有什么區(qū)別。

heap表示堆,stack表示棧。堆中放對象,棧中放引用變量。

堆空間是一個無序的空間,棧是先進(jìn)后出的結(jié)構(gòu)。

24.運行時異常與一般異常有何異

運行時異常是指繼承于RuntimeException的異常,這些異常在編譯時可以不進(jìn)行處理,當(dāng)運行時如果出現(xiàn)問題才會拋出。如NullPointException、 ArrayIndexOutOfBoundsException

一般異常也稱為編譯時異常,這些異常是繼承Exception但又不屬于RuntimeException的子類,如果程序中出現(xiàn)這些異常,在編譯時必須進(jìn)行捕獲或拋出,否 則編譯無法通過。如IOException、FileNotFoundException

25.垃圾回收的優(yōu)點和原理。并考慮2種回收機(jī)制

Java語言中一個顯著的特點就是引入了垃圾回收機(jī)制,使c++程序員最頭疼的內(nèi)存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內(nèi)存 管理。由于有個垃圾回收機(jī)制,Java中的對象不再有”作用域”的概念,只有對象的引用才有”作用域”。垃圾回收可以有效的防止內(nèi)存泄露,有效的使用可以使用 的內(nèi)存。垃圾回收器通常是作為一個單獨的低級別的線程運行,不可預(yù)知的情況下對內(nèi)存堆中已經(jīng)死亡的或者長時間沒有使用的對象進(jìn)行清楚和回收,程序員不能 實時的調(diào)用垃圾回收器對某個對象或所有對象進(jìn)行垃圾回收。回收機(jī)制有分代復(fù)制垃圾回收和標(biāo)記垃圾回收,增量垃圾回收。

26.描述一下JVM加載class文件的原理機(jī)制?

JVM中類的裝載是由ClassLoader和它的子類來實現(xiàn)的,Java ClassLoader 是一個重要的Java運行時系統(tǒng)組件。它負(fù)責(zé)在運行時查找和裝入類文件的類。

27.是否可以從一個static方法內(nèi)部發(fā)出對非static方法的調(diào)用?

不能,除非先創(chuàng)建非static方法所在類的對象。

28.什么是java序列化,如何實現(xiàn)java序列化?

序列化就是一種用來處理對象流的機(jī)制,所謂對象流也就是將對象的內(nèi)容進(jìn)行流化。可以對流化后的對象進(jìn)行讀寫操作,也可將流化后的對象傳輸于網(wǎng)絡(luò)之間。序 列化是為了解決在對對象流進(jìn)行讀寫操作時所引發(fā)的問題。

序列化的實現(xiàn):將需要被序列化的類實現(xiàn)Serializable接口,該接口沒有需要實現(xiàn)的方法,implements Serializable只是為了標(biāo)注該對象是可被序列化 的,然后使用一個輸出流(如:FileOutputStream)來構(gòu)造一個ObjectOutputStream(對象流)對象,接著,使用ObjectOutputStream對象的 writeObject(Object obj)方法就可以將參數(shù)為obj的對象寫出(即保存其狀態(tài)),要恢復(fù)的話則用輸入流。

29.Anonymous Inner Class(匿名內(nèi)部類)是否可以extends(繼承)其它類,是否可以implements(實現(xiàn))interface(接口)?

匿名內(nèi)部類可以繼承類或?qū)崿F(xiàn)接口,但不是顯示的使用extends或implements來繼承或?qū)崿F(xiàn)。

30.ArrayList和Vector的區(qū)別,HashMap和Hashtable的區(qū)別?

ArrayList是JDK1.2的集合類并且線程不安全,Vector是1.0的集合類并且線程安全,二者用法類似。

HashMap線程不安全且能放空鍵或空值,Hashtable線程安全且不能放空鍵或空值。

31.String 和StringBuffer有什么差別?在什么情況下使用它們?

String字符串的基本類,該字符串是不可變的。StringBuffer是利用堆來存儲字符串,并且可以對字符串的內(nèi)容進(jìn)行改變。

32.new一個類對象和使用類名創(chuàng)建一個對象有什么區(qū)別?二者使用時應(yīng)該注意什么?

new對象是最常見的創(chuàng)建對象的方式,利用類模板是通過反射來創(chuàng)建對象。雖然new對象時在底層也會通過類模板來創(chuàng)建對象,但是new對象的效率要比直接通過類 模板創(chuàng)建對象的方式要高。

但是使用類模板的方式可以讓程序的靈活性提高。

33.LinkedList和ArrayList的區(qū)別?

1)LinkedList是鏈表結(jié)構(gòu)的集合,ArrayList數(shù)組結(jié)構(gòu)的集合。

2)LinkedList在中間或前面增加或刪除數(shù)據(jù)時效率比ArrayList高。

3)LinkedList在最后添加或刪除數(shù)據(jù)時效率比ArrayList低。

4)遍歷數(shù)據(jù)時ArrayList效率高于LinkedList。

34.介紹JAVA開發(fā)中常用的Collection FrameWork(集合框架)?

Java中集合框架分為Collection和Map接口,Collection接口下的集合每個元素都由一個值組成,Map接口下的集合類每個元素都是由鍵值對組成。

Collection接口下面有List和Set接口,List接口下常見的類有ArrayList、LinkedList、Vector。它們中的元素可以重復(fù),并且是有序的。Set接口下常 見的類有HashSet、TreeSet。它們中的元素不能重復(fù),并且是無序的。

35.在異常當(dāng)中 throw和throws 有什么區(qū)別和聯(lián)系?

throw是在代碼中拋出一個異常,后面跟的是異常對象,虛擬機(jī)運行到這里時會立即引發(fā)一個異常。

throws是寫在方法聲明上的,表示聲明該方法可能會拋出異常,后面跟的是異常類型。調(diào)用該方法的時候可以選擇處理它或繼續(xù)往外拋。

36.重載和重寫的區(qū)別

重載是指在一個類中,兩個或兩個以上的方法具有相同方法名和不同參數(shù)列表,則表示這些方法為重載方法。

重寫是指在父類和子類中,子類的方法和父類的方法具有相同方法名、相同參數(shù)列表、相同返回類型、子類的訪問修飾符范圍不小于父類的訪問修飾符范圍,異常 的類型和個數(shù)不大于或多于父類的異常類型和個數(shù),則表示該方法為重寫方法。換句話說重載方法是區(qū)分同一個類中相同方法名的方法,重寫方法是找到父類相同 方法名的方法并重新改變方法的行為。

37.Java中try catch finally的執(zhí)行順序

先執(zhí)行try中代碼發(fā)生異常執(zhí)行catch中代碼,最后一定會執(zhí)行finally中代碼

38.內(nèi)存泄露的原因:

資源對象沒關(guān)閉。

如Cursor、File等資源。他們會在finalize中關(guān)閉,但這樣效率太低。容易造成內(nèi)存泄露。

SQLiteCursor,當(dāng)數(shù)據(jù)量大的時候容易泄露

使用Adapter時,沒有使用系統(tǒng)緩存的converView。

即時調(diào)用recycle()釋放不再使用的Bitmap。

適當(dāng)降低Bitmap的采樣率,如:

BitmapFactory.Options options = newBitmapFactory.Options();

options.inSampleSize = 2;//圖片寬高都為原來的二分之一,即圖片為原來的四分之一

Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);

使用application的context來替代activity相關(guān)的context。

盡量避免activity的context在自己的范圍外被使用,這樣會導(dǎo)致activity無法釋放。

注冊沒取消造成內(nèi)存泄露

如:廣播

集合中的對象沒清理造成的內(nèi)存泄露我們通常把一些對象的引用加入到了集合中,當(dāng)我們不需要該對象時,并沒有把它的引用從集合中清理掉,這樣這個集合就會 越來越大。如果這個集合是static的話,那情況就更嚴(yán)重了。

Handler應(yīng)該申明為靜態(tài)對象, 并在其內(nèi)部類中保存一個對外部類的弱引用。如下:

static class MyHandler extends Handler

{

WeakReference mActivityReference;

MyHandler(Activity activity)

{

? ? ? mActivityReference= new WeakReference(activity);

}

@Override

public void handleMessage(Message msg)

{

final Activity activity = mActivityReference.get();

if (activity != null)

{

? ? ? mImageView.setImageBitmap(mBitmap);

}? ?

}

}

39.Iterator和Enumeration的不同

函數(shù)接口不同

Enumeration只有2個函數(shù)接口。通過Enumeration,我們只能讀取集合的數(shù)據(jù),而不能對數(shù)據(jù)進(jìn)行修改。 Iterator只有3個函數(shù)接口。Iterator除了能讀 取集合的數(shù)據(jù)之外,也能數(shù)據(jù)進(jìn)行刪除操作。

Iterator支持fail-fast機(jī)制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函數(shù)包括Vector、Hashtable等類,這些類 都是JDK 1.0中加入的,Enumeration存在的目的就是為它們提供遍歷接口。Enumeration本身并沒有支持同步,而在Vector、Hashtable實現(xiàn) Enumeration時,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是為了HashMap、ArrayList等集合提供遍歷接口。

Iterator是支持fail-fast 機(jī)制的:當(dāng)多個線程對同一個集合的內(nèi)容進(jìn)行操作時,就可能會產(chǎn)生fail-fast事件。

ail-fast 機(jī)制是java集合(Collection)中的一種錯誤機(jī)制。當(dāng)多個線程對同一個集合的內(nèi)容進(jìn)行操作時,就可能會產(chǎn)生fail-fast事件。例如:當(dāng)某一個線 程A通過iterator去遍歷某集合的過程中,若該集合的內(nèi)容被其他線程所改變了;那么線程A訪問集合時,就會拋出ConcurrentModificationException異 常,產(chǎn)生fail-fast事件。

40.接口的注意點

接口中的字段全部默認(rèn)為 public static類型。

接口中的方法全部默認(rèn)為 public類型。

接口中可以申明內(nèi)部類,而默認(rèn)為public static,正因為是static,只是命名空間屬于接口,代碼邏輯不屬于接口。所以不違法接口定義。

接口本身可以申明為public或者缺省。

抽象類繼承自某接口。如果在抽象類中實現(xiàn)了父類(接口)中的方法,在其子類可以不用實現(xiàn),否則在子類必須實現(xiàn)。

41.final方法

將方法聲明為final那有兩個原因,第一就是說明你已經(jīng)知道這個方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。第二就是允許編譯器將所有對此方法的調(diào)用轉(zhuǎn)化為inline調(diào)用的機(jī)制,它會使你在調(diào)用final方法時,直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當(dāng)你的方法主體非常龐大時,或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進(jìn)行方法定義。

ANDROID部分

1.activity、Service、BroadcastReceiver的作用(android)

Activity:Activity是Android程序與用戶交互的窗口,是Android構(gòu)造塊中最基本的一種,它需要為保持各界面的狀態(tài),做很多持久化的事情,妥善管理生命周期以及一些跳轉(zhuǎn)邏輯

service:后臺服務(wù)于Activity,封裝有一個完整的功能邏輯實現(xiàn),接受上層指令,完成相關(guān)的指令,定義好需要接受的Intent提供同步和異步的接口

BroadCast Receiver:接受一種或者多種Intent作觸發(fā)事件,接受相關(guān)消息,做一些簡單處理,轉(zhuǎn)換成一條Notification,統(tǒng)一了Android的事件廣播模型

2.描述一個完整的Android activity lifecycle

activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

3.顯式intent和隱式intent的區(qū)別是什么(android)

Intent定義:Intent是一種在不同組件之間傳遞的請求消息,是應(yīng)用程序發(fā)出的請求和意圖。作為一個完整的消息傳遞機(jī)制,Intent不僅需要發(fā)送端,還需要接收端。

顯式Intent定義:對于明確指出了目標(biāo)組件名稱的Intent,我們稱之為顯式Intent。

隱式Intent定義:對于沒有明確指出目標(biāo)組件名稱的Intent,則稱之為隱式Intent。

說明:Android系統(tǒng)使用IntentFilter 來尋找與隱式Intent相關(guān)的對象。

4.Android中線程同步的方法

線程同步的方法可以采用同步方法和同步塊。

5.怎么將一個Activity封裝成對話框的樣子? 怎樣將Activity封裝成長按Menu菜單的樣子?

簡單你只需要設(shè)置 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的地方一句話:

Xml代碼

android :theme=”@android:style/Theme.Dialog”

android:theme=”@android:style/Theme.Dialog”

這就使你的應(yīng)用程序變成對話框的形式彈出來了,或者

Xml代碼

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

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

就變成半透明的。

重寫OnCreateOptionMenu方法來處理按下menu后的行為,然后再該方法中彈出對話框形式的Activity。

也可以利用事件監(jiān)聽來監(jiān)聽menu按鍵,并在該按鈕按下后彈出對話框形式的Activity。

6.介紹一下Android系統(tǒng)的體系結(jié)構(gòu)

應(yīng)用層:android的應(yīng)用程序通常涉及用戶界面和交互。

應(yīng)用框架層:UI組件、各種管理器等。

函數(shù)庫層:系統(tǒng)C庫、媒體庫、webkit、SQLite等。

linux核心庫:linux系統(tǒng)運行的組件。

7.描述下橫豎屏切換時候 activity 的生命周期

不設(shè)置Activity的android:configChanges時,切屏?xí)匦抡{(diào)用各個生命周期,切橫屏?xí)r會執(zhí)行一次,切豎屏?xí)r會執(zhí)行兩次.

設(shè)置Activity的android:configChanges=”orientation”時,切屏還是會重新調(diào)用各個生命周期,切橫、豎屏?xí)r只會執(zhí)行一次.

設(shè)置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法.

8.android 中的動畫有哪幾種,它們的特點和區(qū)別是什么 ?

兩種,一種是補(bǔ)間動畫(Tween)動畫、還有一種是幀動畫(Frame)動畫。Tween動畫,這種實現(xiàn)方式可以使視圖組件移動、放大、縮小以及產(chǎn)生透明度的變化;另一種Frame動畫,傳統(tǒng)的動畫方法,通過順序的播放排列好的圖片來實現(xiàn),類似電影。

9.一條最長的短信息約占多少 byte?

140byte,70個漢字。

10.描述handler 機(jī)制的原理

andriod提供了 Handler 和 Looper 來滿足線程間的通信。

Handler 先進(jìn)先出原則。

Looper類用來管理特定線程內(nèi)對象之間的消息交換(Message Exchange)。

1)Looper: 一個線程可以產(chǎn)生一個Looper對象,由它來管理此線程里的Message Queue(消息隊列)。

2)Handler: 你可以構(gòu)造Handler對象來與Looper溝通,以便push新消息到Message Queue里;或者接收Looper從Message Queue取出)所送來的消息。

3) Message Queue(消息隊列):用來存放線程放入的消息。

4)線程:UI thread 通常就是main thread,而Android啟動程序時會替它建立一個Message Queue。

11.如何將 SQLite 數(shù)據(jù)庫 (dictionary.db 文件 ) 與 apk 文件一起發(fā)布 ?

可以將dictionary.db文件復(fù)制到Eclipse Android工程中的res\raw目錄中。所有在res\raw目錄中的文件不會被壓縮,這樣可以直接提取該目錄中的文件。

使用openDatabase方法來打開數(shù)據(jù)庫文件,如果該文件不存在,系統(tǒng)會自動創(chuàng)建/sdcard/dictionary目錄,并將res\raw目錄中的 dictionary.db文件復(fù)制到/sdcard/dictionary目錄中

12.說說 android 中 mvc 的具體體現(xiàn)

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

模型(model)對象:是應(yīng)用程序的主體部分,所有的業(yè)務(wù)邏輯都應(yīng)該寫在該層。

視圖(view)對象:是應(yīng)用程序中負(fù)責(zé)生成用戶界面的部分。也是在整個mvc架構(gòu)中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結(jié)果。

控制器(control)對象:是根據(jù)用戶的輸入,控制用戶界面數(shù)據(jù)顯示及更新model對象狀態(tài)的部分,控制器更重要的一種導(dǎo)航功能,響應(yīng)用戶出發(fā)的相關(guān)事件,交給m層處理。

android鼓勵弱耦合和組件的重用,在android中mvc的具體體現(xiàn)如下:

1)視圖(view):一般采用xml文件進(jìn)行界面的描述,使用的時候可以非常方便的引入。

2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫過多的代碼,要通過activity交割model業(yè)務(wù)邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應(yīng)時間是5s,如果耗時的操作放在這里,程序就很容易被回收掉。

3)模型層(model):對數(shù)據(jù)庫的操作、對網(wǎng)絡(luò)等的操作都應(yīng)該在model里面處理,當(dāng)然對業(yè)務(wù)計算等操作也是必須放在的該層的。

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

幀布局(FrameLayout)

線性布局(LinearLayout)

表格布局(TableLayout)

相對布局(RelativeLayout)

絕對布局(AbsoluteLayout)

14.如何啟用 Service ,如何停用 Service

1)startService用于啟動Service、stopService停止Service。

2)bindService綁定Service,unbindService解除Service的綁定。

15.如何優(yōu)化ListView

1、如果自定義適配器,那么在getView方法中要考慮方法傳進(jìn)來的參數(shù)contentView是否為null,如果為null就創(chuàng)建contentView并返回,如果不為null則直接使用。在這個方法中盡可能少創(chuàng)建view。

2、給contentView設(shè)置tag(setTag()),傳入一個viewHolder對象,用于緩存要顯示的數(shù)據(jù),可以達(dá)到圖像數(shù)據(jù)異步加載的效果。

3、如果listview需要顯示的item很多,就要考慮分頁加載。比如一共要顯示100條或者更多的時候,我們可以考慮先加載20條,等用戶拉到列表底部的時候再去加載接下來的20條。

16.描述4 種 activity 的啟動模式

1)standard :系統(tǒng)的默認(rèn)模式,一次跳轉(zhuǎn)即會生成一個新的實例。假設(shè)有一個activity命名為MainActivity,執(zhí)行語句:

startActivity(new Intent(MainActivity.this, MainActivity.class))后,MainActivity將跳轉(zhuǎn)到另外一個MainActivity,也就是現(xiàn)在的Task棧里面有MainActivity的兩個實例。按返回鍵后你會發(fā)現(xiàn)仍然是在MainActivity(第一個)里面。

2)singleTop:singleTop 跟standard 模式比較類似。如果已經(jīng)有一個實例位于Activity棧的頂部時,就不產(chǎn)生新的實例,而只是調(diào)用Activity中的newInstance()方法。如果不位于棧頂,會產(chǎn)生一個新的實例。例:當(dāng)MainActivity為 singleTop 模式時,執(zhí)行跳轉(zhuǎn)后棧里面依舊只有一個實例,如果現(xiàn)在按返回鍵程序?qū)⒅苯油顺觥?/p>

3)singleTask: singleTask模式和后面的singleInstance模式都是只創(chuàng)建一個實例的。在這種模式下,無論跳轉(zhuǎn)的對象是不是位于棧頂?shù)腶ctivity,程序都不會生成一個新的實例(當(dāng)然前提是棧里面已經(jīng)有這個實例)。這種模式相當(dāng)有用,在以后的多activity開發(fā)中,經(jīng)常會因為跳轉(zhuǎn)的關(guān)系導(dǎo)致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應(yīng)的activity聲明為 singleTask 模式,這種問題將不復(fù)存在。

4)singleInstance: 設(shè)置為 singleInstance 模式的 activity 將獨占一個task(感覺task可以理解為進(jìn)程),獨占一個task的activity與其說是activity,倒不如說是一個應(yīng)用,這個應(yīng)用與其他activity是獨立的,它有自己的上下文activity。

17.什么是Intent,如何使用?

Android基本的設(shè)計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統(tǒng),它允許在你的應(yīng)用程序與其它的應(yīng)用程序間傳遞Intent來執(zhí)行動作和產(chǎn)生事件。使用Intent可以激活A(yù)ndroid應(yīng)用的三個核心組件:活動、服務(wù)和廣播接收器。

通過startActivity() orstartActivityForResult()啟動一個Activity;

過 startService() 啟動一個服務(wù),或者通過bindService() 和后臺服務(wù)交互;

通過廣播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())發(fā)給broadcast receivers

18.Android用的數(shù)據(jù)庫是什么樣的?它和sql有什么區(qū)別?為什么要用ContentProvide?它和sql的實現(xiàn)上有什么差別?

Adnroid用的是SQLite數(shù)據(jù)庫。它和其他網(wǎng)絡(luò)數(shù)據(jù)庫類似,也是通過SQL對數(shù)據(jù)進(jìn)行管理。SQLite的操作非常簡單,包括數(shù)據(jù)類型在建表時也可以不指定。

使用ContentProvider 可以將數(shù)據(jù)共享給其他應(yīng)用,讓除本應(yīng)用之外的應(yīng)用也可以訪問本應(yīng)用的數(shù)據(jù)。它的底層是用SQLite 數(shù)據(jù)庫實現(xiàn)的,所以其對數(shù)據(jù)做的各種操作都是以Sql實現(xiàn),只是在上層提供的是Uri。

19.通過Intent傳遞一些二進(jìn)制數(shù)據(jù)的方法有哪些?

1)使用Serializable接口實現(xiàn)序列化,這是Java常用的方法。

2)實現(xiàn)Parcelable接口,這里Android的部分類比如Bitmap類就已經(jīng)實現(xiàn)了,同時Parcelable在Android AIDL中交換數(shù)據(jù)也很常見的。

20.對一些資源以及狀態(tài)的操作保存,最好是保存在生命周期的哪個函數(shù)中進(jìn)行?

onResume()恢復(fù)數(shù)據(jù)、onPause()保存數(shù)據(jù)。

21.如何一次性退出所有打開的Activity

編寫一個Activity作為入口,當(dāng)需要關(guān)閉程序時,可以利用Activity的SingleTop模式跳轉(zhuǎn)該Activity,它上面的所有Activity都會被銷毀掉。然后再將該Activity關(guān)閉。

或者再跳轉(zhuǎn)時,設(shè)置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能將上面的Activity銷毀掉。

22.說說Service的生命周期?

啟動Service的方式有兩種,各自的生命周期也有所不同。

一、通過startService啟動Service:onCreate、onStartCommand、onDestory。

二、通過bindService綁定Service:onCreate、onBind、onUnbind、onDestory。

23.什么是AIDL?AIDL是如何工作的?

AIDL(Android接口描述語言)是一種接口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預(yù)先定義的接口達(dá)到兩個進(jìn)程內(nèi)部通信進(jìn)程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉(zhuǎn)化成AIDL可識別的參數(shù)(可能是多個參數(shù)), 然后使用AIDL來傳遞這些參數(shù), 在消息的接收端, 使用這些參數(shù)組裝成自己需要的對象。AIDL是基于接口的,但它是輕量級的。它使用代理類在客戶端和實現(xiàn)層間傳遞值.。

24.Android如何把文件存放在SDCard上?

在AndroidManifest.xml中加入訪問SDCard的權(quán)限如下:



要往SDCard存放文件,程序必須先判斷手機(jī)是否裝有SDCard,并且可以進(jìn)行讀寫。

注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的權(quán)限。

Environment.getExternalStorageState()方法用于獲取SDCard的狀態(tài),如果手機(jī)裝有SDCard,并且可以進(jìn)行讀寫,那么方法返回的狀態(tài)等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于獲取SDCard的目錄。

25.注冊廣播有幾種方式,這些方式有何優(yōu)缺點?

兩種。一種是通過代碼注冊,這種方式注冊的廣播會跟隨程序的生命周期。二種是在AndroidManifest.xml中配置廣播,這種常駐型廣播當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會被系統(tǒng)調(diào)用自動運行。

26.什么是ANR 如何避免它?

在Android上,如果你的應(yīng)用程序有一段時間響應(yīng)不夠靈敏,系統(tǒng)會向用戶顯示一個對話框,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:Application Not Responding)對話框。用戶可以選擇讓程序繼續(xù)運行,但是,他們在使用你的應(yīng)用程序時,并不希望每次都要處理這個對話框。因此,在程序里對響應(yīng)性能的設(shè)計很重要,這樣,系統(tǒng)不會顯示ANR給用戶。要避免它,應(yīng)該盡量少在主線程做耗時太長的操作,應(yīng)該將這些操作放在線程當(dāng)中去做。

27.Android本身的api并未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導(dǎo)致什么問題?如何解決?

有可能,比如空指針異常、數(shù)組下表越界等異常,這些異常拋出后可能會導(dǎo)致程序FC。在編寫代碼時應(yīng)該做好檢測,多考慮可能會發(fā)生錯誤的情況,從代碼層次解決這些問題。

28.為什么要用 ContentProvider?它和 sql 的實現(xiàn)上有什么差別?

使用ContentProvider 可以將數(shù)據(jù)共享給其他應(yīng)用,讓除本應(yīng)用之外的應(yīng)用也可以訪問本應(yīng)用的數(shù)據(jù)。它的底層是用SQLite 數(shù)據(jù)庫實現(xiàn)的,所以其對數(shù)據(jù)做的各種操作都是以Sql實現(xiàn),只是在上層提供的是Uri。

29.談?wù)?UI 中, Padding 和 Margin 有什么區(qū)別?

padding指內(nèi)邊距,表示組件內(nèi)部元素距離組件邊框的距離。

marin指外邊距,表示組件與組件之間的距離。

30.請介紹下 Android 的數(shù)據(jù)存儲方式。

Android 提供了5種方式存儲數(shù)據(jù):

1)使用SharedPreferences存儲數(shù)據(jù);

2)文件存儲數(shù)據(jù);

3)SQLite數(shù)據(jù)庫存儲數(shù)據(jù);

4)使用ContentProvider存儲數(shù)據(jù);

5)網(wǎng)絡(luò)存儲數(shù)據(jù);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,057評論 25 708
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
    侯蛋蛋_閱讀 2,490評論 1 4
  • 轉(zhuǎn)自 1. 什么是Activity? 四大組件之一,一般的,一個用戶交互界面對應(yīng)一個activity setCon...
    joe1632閱讀 1,414評論 0 7
  • 許久沒來簡書了,今天來看到朋友一篇寫秋的文章,不經(jīng)讓我想起之前一家人出門看到滿地的金黃,拍了好多照片,準(zhǔn)備寫一...
    楊小浠浠閱讀 370評論 0 2
  • 最近縈繞在我腦海里的總是本杰明巴頓奇事這部電影。或許是因為真實本身就很有力量啊,更何況目標(biāo)對象是如此完整漫長的一生...
    方頭記閱讀 687評論 0 50