1. 程式人生 > >Android常用面試題

Android常用面試題

JAVA
1.GC是什麼? 為什麼要有GC?
GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。

2.XML包括哪些解釋技術,區別是什麼?
DOM和SAX
DOM將文件解析成一顆文件樹,可在節點上進行遍歷、增加、修改和刪除。一次性讀入記憶體,對記憶體消耗大。
SAX至上而下解析文件,以事件進行驅動。不會一次性讀入記憶體,對記憶體消耗小,不能任意讀取節點,並且不能對節點進行增加、修改和刪除。


3.switch語句能否作用在byte上,能否作用在long上,能否作用在String上?
switch能作用在byte、char、short和int上,JDK1.7後可以作用在String上。

4."=="和equals方法究竟有什麼區別?
==和equals都可以比較地址。==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。

5.構造方法能否被重寫和過載?
構造方法不能被重寫但是能被過載。

6.面向物件的特徵有哪些?
封裝、繼承、多型和抽象。
7.抽象類和介面的區別?
1).抽象類是abstract class修飾,介面是interface修飾。
2).抽象類可以有任意型別的屬性,介面只能有靜態常量修飾的屬性。

3).抽象類可以有普通方法和抽象法方法,介面的方法都是抽象方法。
4).抽象類和介面都不能例項化,但是抽象類有構造方法,介面沒有構造方法。
5).抽象類只能單根繼承,介面可以多重實現。

8.內部類可以引用它的包含類的成員嗎?有沒有什麼限制? 
可以引用。如果需要指定當前類時要用外部類.this來引用。如果引用區域性變數,需要將區域性變數指定為final。

9.String s = new String("xyz");建立了幾個String Object? 二者之間有什麼區別?
2個物件。"xyz"建立在字串常量池中,new String()建立在堆中。

10.try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後? 

會在return前執行。

11.Integer與int的區別
Integer為包裝類,int是基本資料型別。包裝類擁有方法和屬性,基本資料型別不具備。包裝類可以通過intValue來轉換成基本資料型別,也可以通過new Integer()將基本資料型別轉換為包裝類。在JDK1.5後,包裝類和基本資料型別可以實現自動轉換。

12.sleep()和wait()有什麼區別?
sleep是Thread類的方法,wait是Object類的方法。
sleep是自動喚醒,wait需要其他執行緒來喚醒。
sleep不會釋放同步鎖,wait會釋放同步鎖。
sleep可以用在任意方法中,wait只能用在同步方法或同步塊中。

13.Sleep() 不會釋放物件鎖 到時自動恢復 wait()會釋放物件鎖 進入等待此物件的等待鎖定池 發出notify()方法後 才進入等待鎖定池準備物件鎖的獲取進入執行狀態

14.同步和非同步有何異同,在什麼情況下分別使用他們?
同步指同一時間只能一個執行緒執行該方法,其他執行緒需要等待。非同步指多個執行緒可以同時執行某個方法,並共享同一資源。
同步可以讓訪問的資源具有安全性,因為同一時間只能一個執行緒對其進行訪問。但是效率不高。
非同步對訪問的資源會造成不穩定性,比如多個執行緒同時訪問一個資源,一個在修改、一個在刪除、一個在讀取,這樣可能會造成資源的混亂。但是由於同時執行,執行效率得到提高。

15.啟動一個執行緒是用run()還是start()? 
start()方法啟動執行緒,run方法是執行緒執行的主方法。

16.java中有幾種型別的流?JDK為每種型別的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
java中有三種流,分別是位元組流(InputStream、OutputStream)、字元流(Reader、Writer)、物件流(ObjectInputStream、ObjectOutputStream)。

17.位元組流與字元流的區別?
位元組流用於讀取或寫出二進位制資料,比如圖片、影像等資料。
字元流用於讀取或寫出字元資料,比如傳輸字串。
所有的資料都可以通過位元組流來進行處理,不過如果是字元資料,用位元組流還需要進行轉換後傳輸,如果使用字元流可以方便資料的轉換。

18.error和exception有什麼區別?
error是系統錯誤,程式碼不能處理的錯誤,比如記憶體溢位、堆疊溢位等。
exception是程式異常,可以通過程式碼try-catch進行處理,比如空指標異常,陣列越界等。

19.談談final,finally,finalize的區別?
final是修飾符,可以修飾類(不能被繼承)、屬性(常量)、和方法(不能被重寫)。
finally是異常處理塊中的程式碼塊,表示無論如何都會執行的程式碼塊。
finalize是Object類的方法,該方法在物件被垃圾回收之前執行的方法。

20.當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?
如果其他方法沒有加synchronized的話是可以進入的。

21.當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
java中只有值傳遞,如果傳遞的物件,實際也是傳遞該物件的地址。

22.作用域public,private,protected,以及不寫時的區別
public公共修飾符,表示任意類都可以訪問。
protected為受保護的修飾符,表示同類、同包以及不同包但是父子關係的是可以訪問。
不寫表示預設修飾符,或者稱為package修飾符,該修飾符表示只有同類或同包下的類可以訪問,出了這個包就不能訪問了。
private為私有修飾符,表示只有同類中可以訪問,出了這個類就不能訪問了。

23.用最有效率的方法算出2乘以8等於幾 2《 3
將2的二進位制向左移3位。java中用<<來移位。

24.heap和stack有什麼區別。
heap表示堆,stack表示棧。堆中放物件,棧中放引用變數。
堆空間是一個無序的空間,棧是先進後出的結構。

25.執行時異常與一般異常有何異
執行時異常是指繼承於RuntimeException的異常,這些異常在編譯時可以不進行處理,當執行時如果出現問題才會丟擲。如NullPointException、ArrayIndexOutOfBoundsException
一般異常也稱為編譯時異常,這些異常是繼承Exception但又不屬於RuntimeException的子類,如果程式中出現這些異常,在編譯時必須進行捕獲或丟擲,否則編譯無法通過。如IOException、FileNotFoundException

26.垃圾回收的優點和原理。並考慮2種回收機制
Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程式設計師最頭疼的記憶體管理的問題迎刃而解,它使得Java程式設計師在編寫程式的時候不再需要考慮記憶體管理。由於有個垃圾回收機制,Java中的物件不再有"作用域"的概念,只有物件的引用才有"作用域"。垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體。垃圾回收器通常是作為一個單獨的低級別的執行緒執行,不可預知的情況下對記憶體堆中已經死亡的或者長時間沒有使用的物件進行清楚和回收,程式設計師不能實時的呼叫垃圾回收器對某個物件或所有物件進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

27.描述一下JVM載入class檔案的原理機制?
JVM中類的裝載是由ClassLoader和它的子類來實現的,Java ClassLoader 是一個重要的Java執行時系統元件。它負責在執行時查詢和裝入類檔案的類。

28.是否可以從一個static方法內部發出對非static方法的呼叫?
不能,除非先建立非static方法所在類的物件。

29.什麼是java序列化,如何實現java序列化?

30.使用serializable關鍵字 使用一個輸出流構造一個物件流流物件 然後使用物件流物件的writeObject()就可以將引數為obj的物件寫出

31.Anonymous Inner Class(匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?
匿名內部類可以繼承類或實現介面,但不是顯示的使用extends或implements來繼承或實現。

32.ArrayList和Vector的區別,HashMap和Hashtable的區別?
ArrayList是JDK1.2的集合類並且執行緒不安全,Vector是1.0的集合類並且執行緒安全,二者用法類似。
HashMap執行緒不安全且能放空鍵或空值,Hashtable執行緒安全且不能放空鍵或空值。

33.String 和StringBuffer有什麼差別?在什麼情況下使用它們?
String字串的基本類,該字串是不可變的。StringBuffer是利用堆來儲存字串,並且可以對字串的內容進行改變。

34.new一個類物件和使用類名建立一個物件有什麼區別?二者使用時應該注意什麼?
new物件是最常見的建立物件的方式,利用類模板是通過反射來建立物件。雖然new物件時在底層也會通過類模板來建立物件,但是new物件的效率要比直接通過類模板建立物件的方式要高。
但是使用類模板的方式可以讓程式的靈活性提高。

35.LinkedList和ArrayList的區別?
1)LinkedList是連結串列結構的集合,ArrayList陣列結構的集合。
2)LinkedList在中間或前面增加或刪除資料時效率比ArrayList高。
3)LinkedList在最後新增或刪除資料時效率比ArrayList低。
4)遍歷資料時ArrayList效率高於LinkedList。

36.介紹JAVA開發中常用的Collection FrameWork(集合框架)?
Java中集合框架分為Collection和Map介面,Collection介面下的集合每個元素都由一個值組成,Map介面下的集合類每個元素都是由鍵值對組成。
Collection介面下面有List和Set介面,List介面下常見的類有ArrayList、LinkedList、Vector。它們中的元素可以重複,並且是有序的。Set介面下常見的類有HashSet、TreeSet。它們中的元素不能重複,並且是無序的。

37.在異常當中 throw和throws 有什麼區別和聯絡?
throw是在程式碼中丟擲一個異常,後面跟的是異常物件,虛擬機器執行到這裡時會立即引發一個異常。
throws是寫在方法宣告上的,表示宣告該方法可能會丟擲異常,後面跟的是異常型別。呼叫該方法的時候可以選擇處理它或繼續往外拋。

38.過載和重寫的區別
過載是指在一個類中,兩個或兩個以上的方法具有相同方法名和不同引數列表,則表示這些方法為過載方法。
重寫是指在父類和子類中,子類的方法和父類的方法具有相同方法名、相同引數列表、相同返回型別、子類的訪問修飾符範圍不小於父類的訪問修飾符範圍,異常的型別和個數不大於或多於父類的異常型別和個數,則表示該方法為重寫方法。換句話說過載方法是區分同一個類中相同方法名的方法,重寫方法是找到父類相同方法名的方法並重新改變方法的行為。

Android

39.activity、Service、BroadcastReceiver的作用(android)
Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的指令,定義好需要接受的Intent提供同步和非同步的介面
BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型

40.描述一個完整的Android activity lifecycle
activity的生命週期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory();

41.顯式intent和隱式intent的區別是什麼(android)
Intent定義:Intent是一種在不同元件之間傳遞的請求訊息,是應用程式發出的請求和意圖。作為一個完整的訊息傳遞機制,Intent不僅需要傳送端,還需要接收端。
顯式Intent定義:對於明確指出了目標元件名稱的Intent,我們稱之為顯式Intent。
隱式Intent定義:對於沒有明確指出目標元件名稱的Intent,則稱之為隱式Intent。
說明:Android系統使用IntentFilter 來尋找與隱式Intent相關的物件。

42.Android中執行緒同步的方法
執行緒同步的方法可以採用同步方法和同步塊。

43.怎麼將一個Activity封裝成對話方塊的樣子? 怎樣將Activity封裝成長按Menu選單的樣子?
簡單你只需要設定 一下Activity的主題就可以了在AndroidManifest.xml 中定義 Activity的地方一句話: 
Xml程式碼 
android :theme="@android:style/Theme.Dialog" 
android:theme="@android:style/Theme.Dialog" 
這就使你的應用程式變成對話方塊的形式彈出來了,或者 
Xml程式碼 
android:theme="@android:style/Theme.Translucent" 
android:theme="@android:style/Theme.Translucent" 
就變成半透明的。
重寫OnCreateOptionMenu方法來處理按下menu後的行為,然後再該方法中彈出對話方塊形式的Activity。
也可以利用事件監聽來監聽menu按鍵,並在該按鈕按下後彈出對話方塊形式的Activity。

44.介紹一下Android系統的體系結構
應用層:android的應用程式通常涉及使用者介面和互動。
應用框架層:UI元件、各種管理器等。
函式庫層:系統C庫、媒體庫、webkit、SQLite等。
linux核心庫:linux系統執行的元件。

*45.描述下橫豎屏切換時候 activity 的生命週期
不設定Activity的android:configChanges時,切屏會重新呼叫各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次. 
設定Activity的android:configChanges="orientation"時,切屏還是會重新呼叫各個生命週期,切橫、豎屏時只會執行一次. 
設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新呼叫各個生命週期,只會執行onConfigurationChanged方法.

46.android 中的動畫有哪幾種,它們的特點和區別是什麼 ?
兩種,一種是補間動畫(Tween)動畫、還有一種是幀動畫(Frame)動畫。Tween動畫,這種實現方式可以使檢視元件移動、放大、縮小以及產生透明度的變化;另一種Frame動畫,傳統的動畫方法,通過順序的播放排列好的圖片來實現,類似電影。

47.一條最長的簡訊息約佔多少 byte?
140byte,70個漢字。

48.描述handler 機制的原理
andriod提供了 Handler 和 Looper 來滿足執行緒間的通訊。
Handler 先進先出原則。
Looper類用來管理特定執行緒內物件之間的訊息交換(Message Exchange)。 
1)Looper: 一個執行緒可以產生一個Looper物件,由它來管理此執行緒裡的Message Queue(訊息佇列)。 
2)Handler: 你可以構造Handler物件來與Looper溝通,以便push新訊息到Message Queue裡;或者接收Looper從Message Queue取出)所送來的訊息。 
3) Message Queue(訊息佇列):用來存放執行緒放入的訊息。 
4)執行緒:UI thread 通常就是main thread,而Android啟動程式時會替它建立一個Message Queue。

49.如何將 SQLite 資料庫 (dictionary.db 檔案 ) 與 apk 檔案一起釋出 ?
可以將dictionary.db檔案複製到Eclipse Android工程中的res\raw目錄中。所有在res\raw目錄中的檔案不會被壓縮,這樣可以直接提取該目錄中的檔案。 
使用openDatabase方法來開啟資料庫檔案,如果該檔案不存在,系統會自動建立/sdcard/dictionary目錄,並將res\raw目錄中的 dictionary.db檔案複製到/sdcard/dictionary目錄中

50.說說 android 中 mvc 的具體體現
mvc是model,view,controller的縮寫,mvc包含三個部分:
模型(model)物件:是應用程式的主體部分,所有的業務邏輯都應該寫在該層。
檢視(view)物件:是應用程式中負責生成使用者介面的部分。也是在整個mvc架構中使用者唯一可以看到的一層,接收使用者的輸入,顯示處理結果。
控制器(control)物件:是根據使用者的輸入,控制使用者介面資料顯示及更新model物件狀態的部分,控制器更重要的一種導航功能,響應使用者出發的相關事件,交給m層處理。
android鼓勵弱耦合和元件的重用,在android中mvc的具體體現如下:
1)檢視(view):一般採用xml檔案進行介面的描述,使用的時候可以非常方便的引入。
2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫過多的程式碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裡,程式就很容易被回收掉。
3)模型層(model):對資料庫的操作、對網路等的操作都應該在model裡面處理,當然對業務計算等操作也是必須放在的該層的。

51.請介紹下 Android 中常用的五種佈局
幀佈局(FrameLayout)
線性佈局(LinearLayout)
表格佈局(TableLayout)
相對佈局(RelativeLayout)
絕對佈局(AbsoluteLayout)

52.如何啟用 Service ,如何停用 Service
1)startService用於啟動Service、stopService停止Service。
2)bindService繫結Service,unbindService解除Service的繫結。

53.如何優化ListView
1、如果自定義介面卡,那麼在getView方法中要考慮方法傳進來的引數contentView是否為null,如果為null就建立contentView並返回,如果不為null則直接使用。在這個方法中儘可能少建立view。
2、給contentView設定tag(setTag()),傳入一個viewHolder物件,用於快取要顯示的資料,可以達到影象資料非同步載入的效果。
3、如果listview需要顯示的item很多,就要考慮分頁載入。比如一共要顯示100條或者更多的時候,我們可以考慮先載入20條,等使用者拉到列表底部的時候再去載入接下來的20條。

54.描述4 種 activity 的啟動模式
1)standard :系統的預設模式,一次跳轉即會生成一個新的例項。假設有一個activity命名為MainActivity,執行語句:
startActivity(new Intent(MainActivity.this, MainActivity.class))後,MainActivity將跳轉到另外一個MainActivity,也就是現在的Task棧裡面有MainActivity的兩個例項。按返回鍵後你會發現仍然是在MainActivity(第一個)裡面。
2)singleTop:singleTop 跟standard 模式比較類似。如果已經有一個例項位於Activity棧的頂部時,就不產生新的例項,而只是呼叫Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的例項。例:當MainActivity為 singleTop 模式時,執行跳轉後棧裡面依舊只有一個例項,如果現在按返回鍵程式將直接退出。
3)singleTask: singleTask模式和後面的singleInstance模式都是隻建立一個例項的。在這種模式下,無論跳轉的物件是不是位於棧頂的activity,程式都不會生成一個新的例項(當然前提是棧裡面已經有這個例項)。這種模式相當有用,在以後的多activity開發中,經常會因為跳轉的關係導致同個頁面生成多個例項,這個在使用者體驗上始終有點不好,而如果你將對應的activity宣告為 singleTask 模式,這種問題將不復存在。
4)singleInstance: 設定為 singleInstance 模式的 activity 將獨佔一個task(感覺task可以理解為程序),獨佔一個task的activity與其說是activity,倒不如說是一個應用,這個應用與其他activity是獨立的,它有自己的上下文activity。

55.什麼是Intent,如何使用?
Android基本的設計理念是鼓勵減少元件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的訊息系統,它允許在你的應用程式與其它的應用程式間傳遞Intent來執行動作和產生事件。使用Intent可以啟用Android應用的三個核心元件:活動、服務和廣播接收器。
通過startActivity() orstartActivityForResult()啟動一個Activity;
過 startService() 啟動一個服務,或者通過bindService() 和後臺服務互動;
通過廣播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())發給broadcast receivers

56.Android用的資料庫是什麼樣的?它和sql有什麼區別?為什麼要用ContentProvide?它和sql的實現上有什麼差別?
Adnroid用的是SQLite資料庫。它和其他網路資料庫類似,也是通過SQL對資料進行管理。SQLite的操作非常簡單,包括資料型別在建表時也可以不指定。
使用ContentProvider 可以將資料共享給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite 資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri。

57.通過Intent傳遞一些二進位制資料的方法有哪些?
1)使用Serializable介面實現序列化,這是Java常用的方法。
2)實現Parcelable介面,這裡Android的部分類比如Bitmap類就已經實現了,同時Parcelable在Android AIDL中交換資料也很常見的。 

58.對一些資源以及狀態的操作儲存,最好是儲存在生命週期的哪個函式中進行?
onResume()恢復資料、onPause()儲存資料。

59.如何一次性退出所有開啟的Activity
編寫一個Activity作為入口,當需要關閉程式時,可以利用Activity的SingleTop模式跳轉該Activity,它上面的所有Activity都會被銷燬掉。然後再將該Activity關閉。
或者再跳轉時,設定intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);這樣也能將上面的Activity銷燬掉。

60.說說Service的生命週期?
啟動Service的方式有兩種,各自的生命週期也有所不同。
一、通過startService啟動Service:onCreate、onStartCommand、onDestory。
二、通過bindService繫結Service:onCreate、onBind、onUnbind、onDestory。

61.什麼是AIDL?AIDL是如何工作的?
AIDL(Android介面描述語言)是一種介面描述語言; 編譯器可以通過aidl檔案生成一段程式碼,通過預先定義的介面達到兩個程序內部通訊程序的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個物件, 需要先將物件轉化成AIDL可識別的引數(可能是多個引數), 然後使用AIDL來傳遞這些引數, 在訊息的接收端, 使用這些引數組裝成自己需要的物件。AIDL是基於介面的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值.。

62.Android如何把檔案存放在SDCard上?
在AndroidManifest.xml中加入訪問SDCard的許可權如下:
<!– 在SDCard中建立與刪除檔案許可權 –>
<uses-permission android:name=”android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/>
<!– 往SDCard寫入資料許可權 –>
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
要往SDCard存放檔案,程式必須先判斷手機是否裝有SDCard,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權。
Environment.getExternalStorageState()方法用於獲取SDCard的狀態,如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用於獲取SDCard的目錄。

63.註冊廣播有幾種方式,這些方式有何優缺點?
兩種。一種是通過程式碼註冊,這種方式註冊的廣播會跟隨程式的生命週期。二種是在AndroidManifest.xml中配置廣播,這種常駐型廣播當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。

64.什麼是ANR 如何避免它? 
在Android上,如果你的應用程式有一段時間響應不夠靈敏,系統會向用戶顯示一個對話方塊,這個對話方塊稱作應用程式無響應(ANR:Application Not Responding)對話方塊。使用者可以選擇讓程式繼續執行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話方塊。因此,在程式裡對響應效能的設計很重要,這樣,系統不會顯示ANR給使用者。要避免它,應該儘量少在主執行緒做耗時太長的操作,應該將這些操作放線上程當中去做。

65.Android本身的api並未宣告會丟擲異常,則其在執行時有無可能丟擲runtime異常,你遇到過嗎?諾有的話會導致什麼問題?如何解決? 
有可能,比如空指標異常、陣列下表越界等異常,這些異常丟擲後可能會導致程式FC。在編寫程式碼時應該做好檢測,多考慮可能會發生錯誤的情況,從程式碼層次解決這些問題。

66.為什麼要用 ContentProvider?它和 sql 的實現上有什麼差別?
使用ContentProvider 可以將資料共享給其他應用,讓除本應用之外的應用也可以訪問本應用的資料。它的底層是用SQLite 資料庫實現的,所以其對資料做的各種操作都是以Sql實現,只是在上層提供的是Uri。

67.談談 UI 中, Padding 和 Margin 有什麼區別?
padding指內邊距,表示元件內部元素距離元件邊框的距離。
marin指外邊距,表示元件與元件之間的距離。

68.請介紹下 Android 的資料儲存方式。
Android 提供了5種方式儲存資料:
1)使用SharedPreferences儲存資料;
2)檔案儲存資料;
3)SQLite資料庫儲存資料;
4)使用ContentProvider儲存資料;
5)網路儲存資料;