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)還是循環執行多次。

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 決定了當前動畫執行的參考位置

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 模式搭配使用的。


Android面試題合集【上】

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

View

顯示視圖,內置畫布,提供圖形繪製函數、觸屏事件、按鍵事件函數等,必須在UI主線程內更新畫面,速度較慢

SurfaceView

基於view視圖進行拓展的視圖類,更適合2D遊戲的開發,是view的子類,類似使用雙緩機制,在新的線程中更新畫面所以刷新界面速度比view快

GLSurfaceView

基於SurfaceView視圖再次進行拓展的視圖類,專用於3D遊戲開發的視圖,是surfaceView的子類,openGL專用

AsyncTask

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 加載不同的佈局文件。


分享到:


相關文章: