Android面試題收集【上】
Android面試題收集
Android是一種基於Linux的自由及開放原始碼的作業系統,主要使用於移動裝置,如智慧手機和平板電腦,由Google公司和開放手機聯盟領導及開發。這裡會不斷收集和更新Android基礎相關的面試題,目前已收集100題。
1.Android系統的架構
Android系統架構之應用程式
Android會同一系列核心應用程式包一起釋出,該應用程式包包括email客戶端,SMS短訊息程式,日曆,地圖,瀏覽器,聯絡人管理程式等。所有的應用程式都是使用JAVA語言編寫的。
Android系統架構之應用程式框架
開發人員可以完全訪問核心應用程式所使用的API框架(android.jar)。該應用程式的架構設計簡化了元件的重用;任何一個應用程式都可以釋出它的功能塊並且任何其它的應用程式都可以使用其所釋出的功能塊。
Android系統架構之系統執行庫
Android 包含一些C/C++庫,這些庫能被Android系統中不同的元件使用。它們通過 Android 應用程式框架為開發者提供服務。
Android系統架構之Linux 核心
Android 的核心繫統服務依賴於 Linux 2.6 核心,如安全性,記憶體管理,程序管理, 網路協議棧和驅動模型。 Linux 核心也同時作為硬體和軟體棧之間的抽象層。
2.activity的生命週期
Activity生命週期方法主要有onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()和onRestart()等7個方法。
啟動一個A Activity,分別執行onCreate()、onStart()、onResume()方法。
從A Activity開啟B Activity分別執行A onPause()、B onCreate()、B onStart()、B onResume()、A onStop()方法。
關閉B Activity,分別執行B onPause()、A onRestart()、A onStart()、A onResume()、B onStop()、B onDestroy()方法。
橫豎屏切換A Activity,清單檔案中不設定android:configChanges屬性時,先銷燬onPause()、onStop()、onDestroy()再重新建立onCreate()、onStart()、onResume()方法,設定orientation|screenSize(一定要同時出現)屬性值時,不走生命週期方法,只會執行onConfigurationChanged()方法。
Activity之間的切換可以看出onPause()、onStop()這兩個方法比較特殊,切換的時候onPause()方法不要加入太多耗時操作否則會影響體驗。
3.Fragment的生命週期
Fragment的生命週期
Fragment與Activity生命週期對比
Fragment的生命週期方法主要有onAttach()、onCreate()、onCreateView()、onActivityCreated()、onstart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()等11個方法。
切換到該Fragment,分別執行onAttach()、onCreate()、onCreateView()、onActivityCreated()、onstart()、onResume()方法。
鎖屏,分別執行onPause()、onStop()方法。
亮屏,分別執行onstart()、onResume()方法。
覆蓋,切換到其他Fragment,分別執行onPause()、onStop()、onDestroyView()方法。
從其他Fragment回到之前Fragment,分別執行onCreateView()、onActivityCreated()、onstart()、onResume()方法。
4.Service生命週期
在Service的生命週期裡,常用的有:
4個手動呼叫的方法
startService() 啟動服務
stopService() 關閉服務
bindService() 繫結服務
unbindService() 解綁服務複製程式碼
5個內部自動呼叫的方法
onCreat() 建立服務
onStartCommand() 開始服務
onDestroy() 銷燬服務
onBind() 繫結服務
onUnbind() 解綁服務複製程式碼
手動呼叫startService()啟動服務,自動呼叫內部方法:onCreate()、onStartCommand(),如果一個Service被startService()多次啟動,那麼onCreate()也只會呼叫一次。
手動呼叫stopService()關閉服務,自動呼叫內部方法:onDestory(),如果一個Service被啟動且被繫結,如果在沒有解綁的前提下使用stopService()關閉服務是無法停止服務的。
手動呼叫bindService()後,自動呼叫內部方法:onCreate()、onBind()。
手動呼叫unbindService()後,自動呼叫內部方法:onUnbind()、onDestory()。
startService()和stopService()只能開啟和關閉Service,無法操作Service,呼叫者退出後Service仍然存在;bindService()和unbindService()可以操作Service,呼叫者退出後,Service隨著呼叫者銷燬。
5.Android中動畫
Android中動畫分別幀動畫、補間動畫和屬性動畫(Android 3.0以後的)
幀動畫
幀動畫是最容易實現的一種動畫,這種動畫更多的依賴於完善的UI資源,他的原理就是將一張張單獨的圖片連貫的進行播放,從而在視覺上產生一種動畫的效果;有點類似於某些軟體製作gif動畫的方式。在有些程式碼中,我們還會看到android:oneshot="false" ,這個oneshot 的含義就是動畫執行一次(true)還是迴圈執行多次。
<?xml version="1.0"encoding="utf-8"?>
android:drawable="@drawable/a_0"
android:duration="100"/>
android:drawable="@drawable/a_1"
android:duration="100"/>
android:drawable="@drawable/a_2"
android:duration="100"/>
複製程式碼
補間動畫
補間動畫又可以分為四種形式,分別是 alpha(淡入淡出),translate(位移),scale(縮放大小),rotate(旋轉)。
補間動畫的實現,一般會採用xml 檔案的形式;程式碼會更容易書寫和閱讀,同時也更容易複用。Interpolator 主要作用是可以控制動畫的變化速率 ,就是動畫進行的快慢節奏。pivot 決定了當前動畫執行的參考位置
<?xml version="1.0"encoding="utf-8"?>
android:interpolator="@[package:]anim/interpolator_resource"
android:shareInterpolator=["true" | "false"] >
android:fromAlpha="float"
android:toAlpha="float"/>
android:fromXScale="float"
android:toXScale="float"
android:fromYScale="float"
android:toYScale="float"
android:pivotX="float"
android:pivotY="float"/>
android:fromXDelta="float"
android:toXDelta="float"
android:fromYDelta="float"
android:toYDelta="float"/>
android:fromDegrees="float"
android:toDegrees="float"
android:pivotX="float"
android:pivotY="float"/>
...
複製程式碼
屬性動畫
屬性動畫,顧名思義它是對於物件屬性的動畫。因此,所有補間動畫的內容,都可以通過屬性動畫實現。屬性動畫的執行機制是通過不斷地對值進行操作來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。它的內部使用一種時間迴圈的機制來計算值與值之間的動畫過渡,我們只需要將初始值和結束值提供給ValueAnimator,並且告訴它動畫所需執行的時長,那麼ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結束值這樣的效果。除此之外,ValueAnimator還負責管理動畫的播放次數、播放模式、以及對動畫設定監聽器等。
6.Android中4大元件
Activity:Activity是Android程式與使用者互動的視窗,是Android構造塊中最基本的一種,它需要為保持各介面的狀態,做很多持久化的事情,妥善管理生命週期以及一些跳轉邏輯。
BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關訊息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。
Content Provider:是Android提供的第三方應用資料的訪問方案,可以派生Content Provider類,對外提供資料,可以像資料庫一樣進行選擇排序,遮蔽內部資料的儲存細節,向外提供統一的介面模型,大大簡化上層應用,對資料的整合提 供了更方便的途徑。
service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事務,定義好需要接受的Intent提供同步和非同步的介面。
7.Android中常用佈局
常用的佈局:
FrameLayout(幀佈局):所有東西依次都放在左上角,會重疊
LinearLayout(線性佈局):按照水平和垂直進行資料展示
RelativeLayout(相對佈局):以某一個元素為參照物,來定位的佈局方式複製程式碼
不常用的佈局:
TableLayout(表格佈局): 每一個TableLayout裡面有表格行TableRow,TableRow裡面可以具體定義每一個元素(Android TV上使用)
AbsoluteLayout(絕對佈局):用X,Y座標來指定元素的位置,元素多就不適用。(機頂盒上使用)複製程式碼
新增佈局:
PercentRelativeLayout(百分比相對佈局)可以通過百分比控制控制元件的大小。
PercentFrameLayout(百分比幀佈局)可以通過百分比控制控制元件的大小。複製程式碼
8.訊息推送的方式
方案1、使用極光和友盟推送。
方案2、使用XMPP協議(Openfire + Spark + Smack)
簡介:基於XML協議的通訊協議,前身是Jabber,目前已由IETF國際標準化組織完成了標準化工作。
優點:協議成熟、強大、可擴充套件性強、目前主要應用於許多聊天系統中,且已有開源的Java版的開發例項androidpn。
缺點:協議較複雜、冗餘(基於XML)、費流量、費電,部署硬體成本高。
方案3、使用MQTT協議
簡介:輕量級的、基於代理的“釋出/訂閱”模式的訊息傳輸協議。
優點:協議簡潔、小巧、可擴充套件性強、省流量、省電,目前已經應用到企業領域。
缺點:不夠成熟、實現較複雜、服務端元件rsmb不開源,部署硬體成本較高。
方案4、使用HTTP輪循方式
簡介:定時向HTTP服務端介面(Web Service API)獲取最新訊息。
優點:實現簡單、可控性強,部署硬體成本低。
缺點:實時性差。
9.android的資料儲存
使用SharedPreferences儲存資料;它是Android提供的用來儲存一些簡單配置資訊的一種機制,採用了XML格式將資料儲存到裝置中。只能在同一個包內使用,不能在不同的包之間使用。
檔案儲存資料;檔案儲存方式是一種較常用的方法,在Android中讀取/寫入檔案的方法,與Java中實現I/O的程式是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取裝置上的檔案。
SQLite資料庫儲存資料;SQLite是Android所帶的一個標準的資料庫,它支援SQL語句,它是一個輕量級的嵌入式資料庫。
使用ContentProvider儲存資料;主要用於應用程式之間進行資料交換,從而能夠讓其他的應用儲存或讀取此Content Provider的各種資料型別。
網路儲存資料;通過網路上提供給我們的儲存空間來上傳(儲存)和下載(獲取)我們儲存在網路空間中的資料資訊。
10.Activity啟動模式
介紹 Android 啟動模式之前,先介紹兩個概念task和taskAffinity
task:翻譯過來就是“任務”,是一組相互有關聯的 activity 集合,可以理解為 Activity 是在 task 裡面活動的。 task 存在於一個稱為 back stack 的資料結構中,也就是說, task 是以棧的形式去管理 activity 的,所以也叫可以稱為“任務棧”。
taskAffinity:官方文件解釋是:"The task that the activity has an affinity for.",可以翻譯為 activity 相關或者親和的任務,這個引數標識了一個 Activity 所需要的任務棧的名字。預設情況下,所有Activity所需的任務棧的名字為應用的包名。 taskAffinity 屬性主要和 singleTask 啟動模式或者 allowTaskReparenting 屬性配對使用。
4種啟動模式
standard:標準模式,也是系統預設的啟動模式。假如 activity A 啟動了 activity B , activity B 則會執行在 activity A 所在的任務棧中。而且每次啟動一個 Activity ,都會重新建立新的例項,不管這個例項在任務中是否已經存在。非 Activity 型別的 context (如 ApplicationContext )啟動 standard 模式的 Activity 時會報錯。非 Activity 型別的 context 並沒有所謂的任務棧,由於上面第 1 點的原因所以系統會報錯。此解決辦法就是為待啟動 Activity 指定 FLAG_ACTIVITY_NEW_TASK 標記位,這樣啟動的時候系統就會為它建立一個新的任務棧。這個時候待啟動 Activity 其實是以 singleTask 模式啟動的。
singleTop:棧頂複用模式。假如 activity A 啟動了 activity B ,就會判斷 A 所在的任務棧棧頂是否是 B 的例項。如果是,則不建立新的 activity B 例項而是直接引用這個棧頂例項,同時 onNewIntent 方法會被回撥,通過該方法的引數可以取得當前請求的資訊;如果不是,則建立新的 activity B 例項。
singleTask:棧內複用模式。在第一次啟動這個 Activity 時,系統便會建立一個新的任務,並且初始化 Activity 的例項,放在新任務的底部。不過需要滿足一定條件的。那就是需要設定 taskAffinity 屬性。前面也說過了, taskAffinity 屬性是和 singleTask 模式搭配使用的。

singleInstance:單例項模式。這個是 singleTask 模式的加強版,它除了具有 singleTask 模式的所有特性外,它還有一點獨特的特性,那就是此模式的 Activity 只能單獨地位於一個任務棧,不與其他 Activity 共存於同一個任務棧。
11.廣播註冊
首先寫一個類要繼承BroadCastReceiver
第一種:在清單檔案中宣告,新增
複製程式碼
第二種:使用程式碼進行註冊如:
IntentFilterfilter=newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
BroadCastReceiverDemo receiver =newBroadCastReceiver();
registerReceiver(receiver,filter);複製程式碼
兩種註冊型別的區別是:
a.第一種是常駐型廣播,也就是說當應用程式關閉後,如果有信息廣播來,程式也會被系統呼叫自動執行。
b.第二種不是常駐廣播,也就是說廣播跟隨程式的生命週期。
12.Android中的ANR
ANR的全稱application not responding 應用程式未響應。
在android中Activity的最長執行時間是5秒。
BroadcastReceiver的最長執行時間則是10秒。
Service的最長執行時間則是20秒。複製程式碼
超出執行時間就會產生ANR。注意:ANR是系統丟擲的異常,程式是捕捉不了這個異常的。
解決方法:
執行在主執行緒裡的任何方法都儘可能少做事情。特別是,Activity應該在它的關鍵生命週期方法 (如onCreate()和onResume())裡儘可能少的去做建立操作。(可以採用重新開啟子執行緒的方式,然後使用Handler+Message 的方式做一些操作,比如更新主執行緒中的ui等)
應用程式應該避免在BroadcastReceiver裡做耗時的操作或計算。但不再是在子執行緒裡做這些任務(因為 BroadcastReceiver的生命週期短),替代的是,如果響應Intent廣播需要執行一個耗時的動作的話,應用程式應該啟動一個 Service。
13.ListView優化
convertView重用,利用好 convertView 來重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View,如果重用 view 不改變寬高,重用View可以減少重新分配快取造成的記憶體頻繁分配/回收;
ViewHolder優化,使用ViewHolder的原因是findViewById方法耗時較大,如果控制元件個數過多,會嚴重影響效能,而使用ViewHolder主要是為了可以省去這個時間。通過setTag,getTag直接獲取View。
減少Item View的佈局層級,這是所有layout都必須遵循的,佈局層級過深會直接導致View的測量與繪製浪費大量的時間。
adapter中的getView方法儘量少使用邏輯
圖片載入採用三級快取,避免每次都要重新載入。
嘗試開啟硬體加速來使ListView的滑動更加流暢。
使用 RecycleView 代替。
14.Android數字簽名
所有的應用程式都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程式
Android程式包使用的數字證書可以是自簽名的,不需要一個權威的數字證書機構簽名認證
如果要正式釋出一個Android ,必須使用一個合適的私鑰生成的數字證書來給程式簽名。
數字證書都是有有效期的,Android只是在應用程式安裝的時候才會檢查證書的有效期。如果程式已經安裝在系統中,即使證書過期也不會影響程式的正常功能。
15.Android root機制
root指的是你有許可權可以再系統上對所有檔案有 "讀" "寫" "執行"的權力。root機器不是真正能讓你的應用程式具有root許可權。它原理就跟linux下的像sudo這樣的命令。在系統的bin目錄下放個su程式並屬主是root並有suid許可權。則通過su執行的命令都具有Android root許可權。當然使用臨時使用者許可權想把su拷貝的/system/bin目錄並改屬性並不是一件容易的事情。這裡用到2個工具跟2個命令。把busybox拷貝到你有許可權訪問的目錄然後給他賦予4755許可權,你就可以用它做很多事了。
16.View、surfaceView、GLSurfaceView/">SurfaceView
View
顯示檢視,內建畫布,提供圖形繪製函式、觸屏事件、按鍵事件函式等,必須在UI主執行緒內更新畫面,速度較慢
SurfaceView
基於view檢視進行拓展的檢視類,更適合2D遊戲的開發,是view的子類,類似使用雙緩機制,在新的執行緒中更新畫面所以重新整理介面速度比view快
GLSurfaceView
基於SurfaceView檢視再次進行拓展的檢視類,專用於3D遊戲開發的檢視,是surfaceView的子類,openGL專用
AsyncTask的三個泛型引數說明
第一個引數:傳入doInBackground()方法的引數型別
第二個引數:傳入onProgressUpdate()方法的引數型別
第三個引數:傳入onPostExecute()方法的引數型別,也是doInBackground()方法返回的型別
執行在主執行緒的方法:
onPostExecute()
onPreExecute()
onProgressUpdate(Progress...)複製程式碼
執行在子執行緒的方法:
doInBackground()複製程式碼
控制AsyncTask停止的方法:
cancel(booleanmayInterruptIfRunning)複製程式碼
AsyncTask的執行分為四個步驟
繼承AsyncTask。
實現AsyncTask中定義的下面一個或幾個方法onPreExecute()、doInBackground(Params...)、onProgressUpdate(Progress...)、onPostExecute(Result)。
呼叫execute方法必須在UI thread中呼叫。
該task只能被執行一次,否則多次呼叫時將會出現異常,取消任務可呼叫cancel。
17.Android i18n
I18n 叫做國際化。android 對i18n和L10n提供了非常好的支援。軟體在res/vales 以及 其他帶有語言修飾符的資料夾。如: values-zh 這些資料夾中 提供語言,樣式,尺寸 xml 資源。
18.NDK
NDK是一系列工具集合,NDK提供了一系列的工具,幫助開發者迅速的開發C/C++的動態庫,並能自動將so和Java應用打成apk包。
NDK集成了交叉編譯器,並提供了相應的mk檔案和隔離cpu、平臺等的差異,開發人員只需要簡單的修改mk檔案就可以創建出so檔案。
19.啟動一個程式,可以主介面點選圖示進入,也可以從一個程式中跳轉過去,二者有什麼區別?
通過主介面進入,就是設定預設啟動的activity。在manifest.xml檔案的activity標籤中,寫以下程式碼
複製程式碼
從另一個元件跳轉到目標activity,需要通過intent進行跳轉。具體
Intent intent=new Intent(this,activity.class),startActivity(intent)複製程式碼
20.記憶體溢位和記憶體洩漏有什麼區別?何時會產生記憶體洩漏?
記憶體溢位:當程式執行時所需的記憶體大於程式允許的最高記憶體,這時會出現記憶體溢位;
記憶體洩漏:在一些比較消耗資源的操作中,如果操作中記憶體一直未被釋放,就會出現記憶體洩漏。比如未關閉io,cursor。
21.sim卡的EF 檔案有何作用
sim卡就是電話卡,sim卡內有自己的作業系統,用來與手機通訊的。Ef檔案用來儲存資料的。
22.Activity的狀態有幾種?
執行
暫停
停止複製程式碼
23.讓Activity變成一個視窗
設定activity的style屬性=”@android:style/Theme.Dialog”
24.android:gravity與android:layout_gravity的區別
gravity:表示元件內元素的對齊方式
layout_gravity:相對於父類容器,該檢視元件的對齊方式
25.如何退出Activity
結束當前activity
Finish()
killProgress()
System.exit(0)複製程式碼
關閉應用程式時,結束所有的activity
可以建立一個List集合,每新建立一個activity,將該activity的例項放進list中,程式結束時,從集合中取出迴圈取出activity例項,呼叫finish()方法結束
26.如果後臺的Activity由於某原因被系統回收了,如何在被系統回收之前儲存當前狀態?
在onPuase方法中呼叫onSavedInstanceState()
27.Android中的長度單位詳解
Px:畫素
Sp與dp也是長度單位,但是與螢幕的單位密度無關。複製程式碼
28.activity,service,intent之間的關係
這三個都是android應用頻率非常的元件。Activity與service是四大核心元件。Activity用來載入佈局,顯示視窗介面,service執行後臺,沒有介面顯示,intent是activity與service的通訊使者。
29.activity之間傳遞引數,除了intent,廣播接收器,contentProvider之外,還有那些方法?
Fie:檔案儲存,推薦使用sharedPreferecnces
靜態變數。複製程式碼
30.Adapter是什麼?你所接觸過的adapter有那些?
是介面卡,用來為列表提供資料適配的。經常使用的adapter有baseadapter,arrayAdapter,SimpleAdapter,cursorAdapter,SpinnerAdapter等
31.Fragment與activity如何傳值和互動?
Fragment物件有一個getActivity的方法,通過該方法與activity互動
使用framentmentManager.findFragmentByXX可以獲取fragment物件,在activity中直接操作fragment物件複製程式碼
32.如果Listview中的資料來源發生改變,如何更新listview中的資料
使用adapter的notifyDataSetChanged方法
33.廣播接受者的生命週期?
廣播接收者的生命週期非常短。當執行onRecieve方法之後,廣播就會銷燬
在廣播接受者不能進行耗時較長的操作
在廣播接收者不要建立子執行緒。廣播接收者完成操作後,所在程序會變成空程序,很容易被系統回收複製程式碼
34.ContentProvider與sqlite有什麼不一樣的?
ContentProvider會對外隱藏內部實現,只需要關注訪問contentProvider的uri即可,contentProvider應用在應用間共享。
Sqlite操作本應用程式的資料庫。
ContentProiver可以對本地檔案進行增刪改查操作複製程式碼
35.如何儲存activity的狀態?
預設情況下activity的狀態系統會自動儲存,有些時候需要我們手動呼叫儲存。
當activity處於onPause,onStop之後,activity處於未活動狀態,但是activity物件卻仍然存在。當記憶體不足,onPause,onStop之後的activity可能會被系統摧毀。
當通過返回退出activity時,activity狀態並不會儲存。
儲存activity狀態需要重寫onSavedInstanceState()方法,在執行onPause,onStop之前呼叫onSavedInstanceState方法,onSavedInstanceState需要一個Bundle型別的引數,我們可以將資料儲存到bundle中,通過實參傳遞給onSavedInstanceState方法。
Activity被銷燬後,重新啟動時,在onCreate方法中,接受儲存的bundle引數,並將之前的資料取出。
36.Android中activity,context,application有什麼不同。
Content與application都繼承與contextWrapper,contextWrapper繼承於Context類。
Context:表示當前上下文物件,儲存的是上下文中的引數和變數,它可以讓更加方便訪問到一些資源。
Context通常與activity的生命週期是一樣的,application表示整個應用程式的物件。
對於一些生命週期較長的,不要使用context,可以使用application。
在activity中,儘量使用靜態內部類,不要使用內部類。內部裡作為外部類的成員存在,不是獨立於activity,如果記憶體中還有記憶體繼續引用到context,activity如果被銷燬,context還不會結束。
37.Service 是否在 main thread 中執行, service 裡面是否能執行耗時的操作?
預設情況service在main thread中執行,當service在主執行緒中執行,那在service中不要進行一些比較耗時的操作,比如說網路連線,檔案拷貝等。
38.Service 和 Activity 在同一個執行緒嗎
預設情況下service與activity在同一個執行緒,都在main Thread,或者ui執行緒中。
如果在清單檔案中指定service的process屬性,那麼service就在另一個程序中執行。
39.Service 裡面可以彈吐司麼
可以。
40.在 service 的生命週期方法 onstartConmand()可不可以執行網路操作?如何在 service 中執行網路操作?
可以的,就在onstartConmand方法內執行。
41.說說 ContentProvider、ContentResolver、ContentObserver 之間的關係
ContentProvider:內容提供者,對外提供資料的操作,contentProvider.notifyChanged(uir):可以更新資料
contentResolver:內容解析者,解析ContentProvider返回的資料
ContentObServer:內容監聽者,監聽資料的改變,contentResolver.registerContentObServer()複製程式碼
42.請介紹下 ContentProvider 是如何實現資料共享的
ContentProvider是一個對外提供資料的介面,首先需要實現ContentProvider這個介面,然後重寫query,insert,getType,delete,update方法,最後在清單檔案定義contentProvider的訪問uri
43.Intent 傳遞資料時,可以傳遞哪些型別資料?
基本資料型別以及對應的陣列型別
可以傳遞bundle型別,但是bundle型別的資料需要實現Serializable或者parcelable介面複製程式碼
44.Serializable 和 Parcelable 的區別?
如果儲存在記憶體中,推薦使用parcelable,使用serialiable在序列化的時候會產生大量的臨時變數,會引起頻繁的GC
如果儲存在硬碟上,推薦使用Serializable,雖然serializable效率較低
Serializable的實現:只需要實現Serializable介面,就會自動生成一個序列化id
Parcelable的實現:需要實現Parcelable介面,還需要Parcelable.CREATER變數
45.請描述一下 Intent 和 IntentFilter
Intent是元件的通訊使者,可以在元件間傳遞訊息和資料。
IntentFilter是intent的篩選器,可以對intent的action,data,catgory,uri這些屬性進行篩選,確定符合的目標元件。複製程式碼
46.什麼是IntentService?有何優點?
IntentService 是 Service 的子類,比普通的 Service 增加了額外的功能。先看 Service 本身存在兩個問題:
Service 不會專門啟動一條單獨的程序,Service 與它所在應用位於同一個程序中;
Service 也不是專門一條新執行緒,因此不應該在 Service 中直接處理耗時的任務;複製程式碼
特徵
會建立獨立的 worker 執行緒來處理所有的 Intent 請求;
會建立獨立的 worker 執行緒來處理 onHandleIntent()方法實現的程式碼,無需處理多執行緒問題;
所有請求處理完成後,IntentService 會自動停止,無需呼叫 stopSelf()方法停止 Service;
為 Service 的 onBind()提供預設實現,返回null;
為 Service 的 onStartCommand 提供預設實現,將請求 Intent 新增到佇列中複製程式碼
使用
讓service類繼承IntentService,重寫onStartCommand和onHandleIntent實現複製程式碼
47.Android 引入廣播機制的用意
從 MVC 的角度考慮(應用程式內) 其實回答這個問題的時候還可以這樣問,android 為什麼要有那 4 大元件,現在的移動開發模型基本上也是照搬的 web 那一套 MVC 架構,只不過稍微做了修改。android 的四大元件本質上就是為了實現移動或者說嵌入式裝置上的 MVC 架構,它們之間有時候是一種相互依存的關係,有時候又是一種補充關係,引入廣播機制可以方便幾大元件的資訊和資料互動。
程式間互通訊息(例如在自己的應用程式內監聽系統來電)
效率上(參考 UDP 的廣播協議在區域網的方便性)
設計模式上(反轉控制的一種應用,類似監聽者模式)
48.ListView 如何提高其效率?
當 convertView 為空時,用 setTag()方法為每個 View 繫結一個存放控制元件的 ViewHolder 物件。當convertView 不為空, 重複利用已經建立的 view 的時候, 使用 getTag()方法獲取繫結的 ViewHolder物件,這樣就避免了 findViewById 對控制元件的層層查詢,而是快速定位到控制元件。 複用 ConvertView,使用歷史的 view,提升效率 200%
自定義靜態類 ViewHolder,減少 findViewById 的次數。提升效率 50%
非同步載入資料,分頁載入資料。
使用 WeakRefrence 引用 ImageView 物件
49.ListView 如何實現分頁載入
設定 ListView 的滾動監聽器:setOnScrollListener(new OnScrollListener{….})在監聽器中有兩個方法: 滾動狀態發生變化的方法(onScrollStateChanged)和 listView 被滾動時呼叫的方法(onScroll)
在滾動狀態發生改變的方法中,有三種狀態:手指按下移動的狀態: SCROLL_STATE_TOUCH_SCROLL:觸控滑動,慣性滾動(滑翔(flgin)狀態): SCROLL_STATE_FLING: 滑翔,靜止狀態: SCROLL_STATE_IDLE: // 靜止,對不同的狀態進行處理:
分批載入資料,只關心靜止狀態:關心最後一個可見的條目,如果最後一個可見條目就是資料介面卡(集合)裡的最後一個,此時可載入更多的資料。在每次載入的時候,計算出滾動的數量,當滾動的數量大於等於總數量的時候,可以提示使用者無更多資料了。
50.ListView 可以顯示多種型別的條目嗎
這個當然可以的,ListView 顯示的每個條目都是通過 baseAdapter 的 getView(int position,View convertView, ViewGroup parent)來展示的,理論上我們完全可以讓每個條目都是不同型別的view。
比如:從伺服器拿回一個標識為 id=1,那麼當 id=1 的時候,我們就載入型別一的條目,當 id=2的時候,載入型別二的條目。常見佈局在資訊類客戶端中可以經常看到。
除此之外 adapter 還提供了 getViewTypeCount()和 getItemViewType(int position)兩個方法。在 getView 方法中我們可以根據不同的 viewtype 載入不同的佈局檔案。