預備知識
1. Intent
Intent
是信使,負責完成Android
四大組件之間的信息傳遞,同類、不同類的組件無法直接傳遞對象,一旦需要溝通只能通過Intent
(不建議通過靜態變量或靜態方法傳遞數據,容易造成數據異常、內存泄露等問題)。
2. 生命週期
生命週期是指組件的實例對象從創建到銷燬可能會被系統調用的一些方法,每個方法的調用都有特定的條件,可以根據需要重寫生命週期方法來達到在某些特定時刻執行特定任務的目的。生命週期方法不建議自行調用,應由系統管理。
3. 註冊組件
四大組件都需要通過項目中的AndroidManifest.xml
文件進行靜態註冊後纔可正常使用,其中BroadcastReceiver
可以在其他組件中動態註冊(Android
自6.0
版本開始限制靜態註冊,除少部分廣播如開機廣播之外,大部分廣播的靜態註冊是無效的)。
4. 響應時間
應用主線程未在規定的時間內執行完任務,系統會報ANR(應用程序無響應)錯誤,因此應將耗時任務交由子線程完成,具體的限定時間和執行位置如下:
- Activity:5秒內執行完成,包括各個生命週期方法、View的觸摸點擊事件、輸入輸出操作等。
- Service:20秒內執行完成,主要是各個生命週期方法。
- BroadcastReceiver:10秒內執行完成,主要是onReceive()方法。
1. Activity
1.1 基本知識
概念
Activity
直譯爲“活動”,在應用中的一個Activity
可以理解爲一個界面,可以包含各類佈局與控件展現豐富的可視化效果,主要用於和用戶進行交互。一個應用必須通過Activity
來啓動和運行,一個應用可以只有一個Activity
,也可以由多個Activity
組成。
應用中的所有Activity
都被系統保存在TaskStack
任務棧中,一般一個應用只有一個TaskStack
任務棧,但也可以調整Activity
的啓動模式來開啓多個TaskStack
任務棧。既然叫棧,自然是有棧的特性,當前可交互的Activity
在棧頂,先啓動的Activity
在棧底,棧頂Activity
出棧則底層Activity
被用戶可見並開始交互,任務棧清空時應用結束。
作用
Activity
是應用最直觀的入口,一個應用可以沒有其他組件,但是不能沒有Activity
。用戶的IO操作都由Activity
進行處理,應用的數據展示、吸引人的動畫、優秀的界面設計等都需要Activity
進行展示,用戶只關心看得見的東西,看不見效果再好的應用都沒用戶量,再牛逼的應用最少也得有文字展示一下不是嗎?
生命週期
Activity
的生命週期已經是翻爛的書了,最基礎的知識點,千萬不可忽視。首先就得上個圖:
生命週期大多是成對出現的:
- onCreate()和onDestroy(),生命的起始與終結。
- onStart()和onStop(),界面的可見與否。
- onResume()和onPause(),是否可進行交互。
詳細介紹:
- onCreate():第一個調用的方法,通常在該方法中加載佈局文件、初始化資源、註冊事件與
BroadcastReceiver
等較重的任務。 - onStart():在
onCreate()
方法後調用,通常在該方法中處理UI的顯示控制邏輯,任務不可過重,用戶此時無法交互也無法直接看見當前Activity
。 - onResume():在
onStart()
方法後調用,通常在該方法中進行簡單的數據處理與UI控制,如開始動畫,只執行輕量任務,方法執行後用戶可進行交互並可直接看見當前Activity
。此時,當前Activity
進入Resumed
狀態(運行狀態),當一個Paused
狀態的Activity
重新位於棧頂時(從其他Activity
返回),會再次調用該方法。 - onPause():當前
Activity
被其他Activity
覆蓋時調用,讓當前Activity
進入Paused
狀態(暫停狀態),此時當前Activity
可見但不可交互。通常在此方法中進行簡單的數據處理與UI控制,如暫停動畫,只執行輕量任務。內存不足且無其他優先級更低的Activity
時,當前Activity
可能會被銷燬。當前Activity
重新位於棧頂時(從其他Activity
返回),會調用onResume()
方法。 - onStop(): 當前
Activity
被其他Activity
完全覆蓋(若上層Activity
透明或半透明時,只調用onPause()
方法)時調用,當前Activity
進入Stopped
狀態(停止狀態),當前Activity
不可見。通常在此方法中處理UI的顯示控制邏輯,任務不可過重。內存不足且無其他優先級更低的Activity
時,當前Activity
可能會被銷燬。還行當前Activity
重新位於棧頂時(從其他Activity
返回),會調用onRestart()
方法。 - onRestat(): 當一個
Stopped
狀態的Activity
被返回時,該方法被調用,之後再調用onStart()
方法和onResume()
方法進入運行狀態。 - onDestroy(): 當前
Activity
被銷燬時調用,通常在該方法中用來執行釋放資源等較重的任務。
啓動
啓動模式
- Standard:標準模式,
Activity
的默認啓動模式。在這種模式下,Activity
可以有多個實例,每次啓動Activity
,無論任務棧中是否已經存在這個Activity
的實例,系統都會創建一個新的Activity
實例。 - SingleTop:棧頂模式,棧頂
Activity
複用的模式。當一個SingleTop
模式的Activity
已經位於棧頂時,再去啓動它則不再創建新的實例;如果不在棧頂,無論任務棧中是否已經存在這個Activity
的實例,系統都會創建一個新的Activity
實例。 - SingleTask:單任務模式,棧內
Activity
複用的模式。如果啓動的Activity
已經存在於任務棧中,則會將此Activity
上層的其他Activity
出棧,使此Activity
位於棧頂;否則創建一個新的Activity
實例。 - SingleInstance:單實例模式。在該模式下,系統會啓動一個新的棧來管理該
Activity
,不同應用之間可以共享該Activity
。
Activity跳轉
- 顯式啓動:
Intent
直接指定要啓動的Activity
所對應的的class
,可以通過Intent
構造方法、setClass
、setClassName
三種方式指定。 - 隱式啓動:
Intent
指定匹配條件,由Activity
註冊在AndroidManifest.xml
文件中的intent-filter
節點進行匹配,條件有action
、category
、data
三種,全部或者部分匹配都可以。
1.2 疑難點
兩個Activity跳轉時的生命週期
常見的場景就是兩個Activity跳轉,如A跳轉到B,此時A和B的生命週期交織在一起,並不是簡單的A執行完所有的生命週期再從頭執行B的生命週期。
- 當B無實例,且不是透明或半透明時:A.onPause() > B.onCreate() > B.onStart() > B.onResume() > A.onStop()。
此時從B返回A:B.onPause() > A.onRestart() > A.onStart() > A.onResume() > B.onStop() > B.onDestroy()。 - 當B無實例,且爲透明或半透明時:A.onPause() > B.onCreate() > B.onStart() > B.onResume()。
此時從B返回A:B.onPause() > A.onResume() > B.onStop() > B.onDestroy()。
透明的B將導致A被B覆蓋時不執行A.onStop()方法,B返回A時也不執行A.onRestart() > A.onStart()這兩個方法。接下來的就不考慮透明的情況了,舉一反三。
- 當B有實例,B爲SingleTop模式,且B位於棧頂(B不位於棧頂時相當於無實例,參考1、2兩點):此時A不在棧頂,其生命週期並不執行,B無生命週期變化,但系統會調用B.onNewIntent()方法告知B接收到了新的Intent。
- 當B有實例,B爲SingleTask模式:A.onPause() > B.onRestart() > B.onStart() > B.onNewIntent() > B.onResume()(onNewIntent()與onResume()無確定先後順序,位置可能交換)> A.onStop() > 原本棧內位於B之上的Activity進入銷燬流程。
1.3 面試常考
說一下Activity的生命週期 / 各個生命週期的作用 ?
考察基礎,必背知識點。答案見上
onStart()和onResume()/onPause()和onStop()的區別?
是否位於前臺,對用戶是否可見的區別。
Activity A啓動另一個Activity B會回調哪些方法?如果Activity B是完全透明呢?如果啓動的是一個Dialog呢?
參考本文《1.2 疑難點 - 兩個Activity跳轉時的生命週期》,對話框則不會調用生命週期方法。
如何將一個 Activity 設置成窗口的樣式?
只需要給我們的 Activity 配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"
談談onSaveInstanceState()方法?何時會調用?
當Activity意外銷燬時再重新創建時會調用此方法,比如橫豎屏切換,會導致重新創建Activity,onSaveInstanceState()方法的調用在onStop()之前,用於保存當前Activity的狀態,當Activity被重新創建後,會調用onRestoreInstanceState()來恢復Activity的狀態,onRestoreInstanceState()的調用在onStart()之前。
onSaveInstanceState()被執行的場景有哪些:
系統不知道你按下HOME後要運行多少其他的程序,自然也不知道activity是否會被銷燬,因此係統都會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則:
- 當用戶按下HOME鍵時
- 長按HOME鍵,選擇運行其他的程序時
- 鎖屏時
- 從activity A中啓動一個新的activity時
- 屏幕方向切換時
onSaveInstanceState()與onPause()的區別?
兩者執行沒有固定的先後順序。
onSavedinstance()方法的觸發時機,其典型的情景是按Home鍵或者切換Activity,這樣的Activity可能被銷燬的場合,但是按Back鍵退出程序,則不會調用此方法,適合保存一些非持久性的數據(即程序運行期間需要儲存的數據)。
而onPause(),不管是可能銷燬還是退出程序,都必須調用,適合保存持久性的數據,但是Android本身沒有爲此方法提供Bundle參數,因此我們可以選用做一個靜態變量或者是提供一個SharedPreference作爲數據載體。
如何避免配置改變 / 橫豎屏切換時Activity重建?
在清單文件下每個activity註冊時寫上android:configChanges=“XXX”
比如橫豎屏切換:android:configChanges=“orientation”
優先級低的Activity在內存不足被回收後怎樣做可以恢復到銷燬前狀態?
- Task和Activity棧以及相應的Intent和數據會被系統保存起來。當APP被切回前臺時,系統會恢復Task和Activity棧以及相應的Intent和數據。Activity之間傳數據應該用系統提供的intent機制。
- 不要在Application類和全局單例類中存放數據,會導致app無法正確恢復狀態。運行時的臨時數據應存放在SharedPreference、臨時文件或數據庫中。
- 充分利用onSaveInstanceState()和onRestoreInstanceState()方法,當Activity被重新創建後方便恢復Activity的狀態。
說下Activity的四種啓動模式?(有時會出個實際問題來分析返回棧中Activity的情況)
參考本文《1.1 基本知識 - 啓動》,《1.2 疑難點 - 兩個Activity跳轉時的生命週期》。
談談singleTop和singleTask的區別以及應用場景?onNewIntent()調用時機?
參考本文《1.1 基本知識 - 啓動》,《1.2 疑難點 - 兩個Activity跳轉時的生命週期》。
瞭解哪些Activity啓動模式的標記位?
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//指定singleTask模式,與在AndroidManifest.xml中指定android:launchMode"singleTask"效果相同
Intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
//指定singleTop模式,與在AndroidManifest.xml中指定android:launchMode"singleTop"效果相同
Intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//具有這個標誌的Activity啓動時,在同一個任務棧中所以位於它上面的Activity都要出棧,一般會和singleTask模式一起出現
Intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
//具有這個標誌的Activity不會出現在歷史的Activity列表中,它等同於在AndroidManifest.xml中指定android:excludeFromRecents=“true”
標記位優先級比在AndroidManifest中指定優先級高
如何啓動其他應用的Activity?
SingleTask和taskAfiinity配合使用。
談一談Fragment的生命週期?
Activity和Fragment的異同?
1、從最基礎的開始說—>生命週期
Activity有7個生命週期:onCreate(); onStart(); onResume(); onPause(); onStop(); onDestroy(); onRestart();
Fragment有11個生命週期:onAttach(); onCreate(); onCreateView(); onActivityCreate(); onStart(); onResume(); onPause(); onStop(); onDestroyView(); onDestroy(); onDetach();
所以Fragment比較與Activity來說會更加靈活,因爲生命週期多了,你可以控制的地方也就多了。
2、從靈活性上來說
Activity是四大組件之一,是每個頁面的承載,一個就是一個,Fragment的顯示要依賴於Activity,從Fragment的生命週期中就可以瞭解到。
Fragment是一個一個的小碎片
(1)相比較與Activity來說更加靈活,可以在XML文件中直接進行寫入,也可以在Activity中動態添加;
(2)可以使用show()/hide()或者replace()隨時對Fragment進行切換,並且切換的時候不會出現明顯的效果,用戶體驗會好;Activity雖然也可以進行切換,但是Activity之間切換會有明顯的翻頁或者其他的效果,在小部分內容的切換上給用戶的感覺不是很好
Activity和Fragment的關係?
Fragment的顯示要依賴於Activity,從Fragment的生命週期中就可以瞭解到。
何時會考慮使用Fragment?
類似微信下方菜單欄,以及手機和平板適配等。
2. Service
2.1 基本知識
概念
Service直譯爲“服務”,主要用於在後臺處理一些耗時的邏輯,或者執行一些需要長期運行的任務。必要的時候,甚至可以讓服務在程序退出的情況下繼續運行。
作用
承擔大部分的數據處理工作,爲其他組件提供繁重耗時的後臺服務,可監控其他組件的運行狀態。
生命週期
Service的生命週期得分兩種情況,根據Service的啓動方式分爲Unbounded和Bounded兩種,如下圖:
- Unbounded是Service被startService()方法啓動時經歷的生命週期,Service不處於活動狀態時,經歷onCreate() > onStartCommand()流程進入活動狀態,此時再次啓動Service只調用onStartCommand()方法。
- Bounded是Service被bindService()方法啓動時經歷的生命週期,Service不處於綁定狀態時,經歷onCreate() > onBind()流程進入綁定狀態,此時再次綁定Service只調用onBind()方法。
啓動
Service的啓動方式有兩種:startService()和bindService()。
- 使用startService()方法啓動Service,調用者與Service之間沒有關係,即使調用者退出了,Service仍然運行。Service不會自動銷燬,需要外部調用stopService()方法或在Service內部調用stopSelf()方法,此時Service的onDestroy()方法被調用。
- 使用bindService()方法啓動Service,調用者與Service綁定在了一起,調用者一旦銷燬,Service也就終止了,調用者需要解綁時可調用unBindService()方法。Service被解綁或調用者銷燬時,Service經歷onUnbind() > onDestroy()的過程。
2.2 疑難點
Service超時ANR/啓動子線程
通常出現ANR時,應用在主線程執行了較重的耗時任務,所以需要將耗時任務交給子線程進行。Service面臨需要啓動子線程的情況時,直接使用多線程也是可以的,但是如果Service必然是需要子線程的情況,建議使用IntentService完成任務。
IntentService是Service的子類,它和Service的不同點在於:
- 內部有一個工作線程來完成耗時的操作,只需實現onHandleIntent方法即可。
- 完成全部工作任務後,會自動終止服務。
- 如果同時執行多個任務時,會以工作隊列的方式依次執行。
IntentService非常適合用於處理應用中的耗時任務,當然如果需要並行執行還是考慮線程池,建議將應用中可串行執行的耗時任務都交由IntentService來完成。
2.3 面試常考
談一談Service的生命週期?
參考本文《2.1 基本知識 - 生命週期》。
Service的兩種啓動方式?區別在哪?
參考本文《2.1 基本知識 - 生命週期》,《2.1 基本知識 - 啓動》。
一個Activty先start一個Service後,再bind時會回調什麼方法?此時如何做才能回調Service的destory()方法?
如果一個Service又被啓動又被綁定,則該Service將會一直在後臺運行。並且不管如何調用,onCreate始終只會調用一次,對應startService調用多少次,Service的onStart便會調用多少次。調用unbindService將不會停止Service,而必須調用 stopService 或 Service的 stopSelf 來停止服務。
Service如何和Activity進行通信?
- Binder:
通過 Binder 接口的形式實現,當 Activity 綁定 Service 成功的時候 Activity 會在 ServiceConnection 的類 的 onServiceConnected()回調方法中獲取到 Service 的 onBind()方法 return 過來的 Binder 的子類,然後通過對象調用方法。 - Aidl:
aidl 比較適合當客戶端和服務端不在同一個應用下的場景。 - Messenger:
它引用了一個Handler對象,以便others能夠向它發送消息(使用mMessenger.send(Message msg)方法)。該類允許跨進程間基於Message的通信(即兩個進程間可以通過Message進行通信),在服務端使用Handler創建一個Messenger,客戶端持有這個Messenger就可以與服務端通信了。一個Messeger不能同時雙向發送,兩個就就能雙向發送了。 - 廣播,具體邏輯同3.。
用過哪些系統Service?
如進行窗口相關的操作會用到窗口管理服務WindowManager,進行電源相關的操作會用到電源管理服務PowerManager,還有很多其他的系統管理服務,如通知管理服務NotifacationManager、振動管理服務Vibrator、電池管理服務BatteryManager……
是否能在Service進行耗時操作/網絡操作?如果非要可以怎麼做?
Service是運行在主線程中的,一般不能在Service進行耗時操作。參考本文《2.2 疑難點 - Service超時ANR/啓動子線程》。
IntentService與Service的區別(intentservice的優點)
- 內部有一個工作線程來完成耗時的操作,只需實現onHandleIntent方法即可,其他方法提供默認實現。
- 完成全部工作任務後,會自動終止服務。
- 如果同時執行多個任務時,會以工作隊列的方式依次執行。
前臺服務是什麼?和普通服務的不同?如何去開啓一個前臺服務?
前臺服務是那些被認爲用戶知道(用戶所認可的)且在系統內存不足的時候不允許系統殺死的服務。
前臺服務必須給狀態欄提供一個通知,前臺服務的系統優先級更高、不易被回收。
服務啓動時,創建一個Notification,再調用setForground()方法。
是否瞭解ActivityManagerService,談談它發揮什麼作用?
ActivityManagerService(簡稱AMS)是Android中最核心的服務 , 主要負責系統中四大組件的啓動、切換、調度及應用進程的管理和調度等工作,其職責與操作系統中的進程管理和調度模塊類似。
Activity、Intent、Service 是什麼關係?
Activity 和 Service 都是 Android 四大組件之一。Activity 負責用戶界面的顯示和交互,Service 負責後臺任務的處理。Activity 和 Service 之間可以通過 Intent 傳遞數據。
Service 和 Activity 在同一個線程嗎?
對於同一 app 來說默認情況下是在同一個線程中的,都在main Thread (UI Thread)。
如何保證Service不被殺死?
- 在AndroidManifest.xml文件中對於intent-filter可以通過android:priority = “1000”這個屬性設置最高優先級,1000是最高值,如果數字越小則優先級越低,同時實用於廣播。
- 在onStartCommand裏面調用 startForeground()方法把Service提升爲前臺進程級別,然後再onDestroy裏面要記得調用stopForeground ()方法。
- onStartCommand方法,手動返回START_STICKY。
- 在onDestroy方法裏發廣播重啓service。service +broadcast 方式,就是當service走ondestory的時候,發送一個自定義的廣播,當收到廣播的時候,重新啓動service。(第三方應用或是在setting裏-應用-強制停止時,APP進程就直接被幹掉了,onDestroy方法都進不來,所以無法保證會執行)可以通過雙Service互相喚起,提高成功率。
- 監聽系統廣播判斷Service狀態。
通過系統的一些廣播,比如:手機重啓、界面喚醒、應用狀態改變等等監聽並捕獲到,然後判斷我們的Service是否還存活。 - Application加上Persistent屬性。
Service 的 onStartCommand 方法有幾種返回值?各代表什麼意思?
有四種返回值,不同值代表的意思如下:
- START_STICKY:如果 service 進程被 kill 掉,保留 service 的狀態爲開始狀態,但不保留遞送的 intent 對象。隨 後系統會嘗試重新創建 service,由於服務狀態爲開始狀態,所以創建服務後一定會調用 onStartCommand(Intent,int,int)方法。如果在此期間沒有任何啓動命令被傳遞到 service,那麼參數 Intent 將爲 null。
- START_NOT_STICKY:“非粘性的”。使用這個返回值時,如果在執行完 onStartCommand 後,服務被異常 kill 掉,系統不會自動重啓該服務。
- START_REDELIVER_INTENT:重傳 Intent。使用這個返回值時,如果在執行完 onStartCommand 後,服務被異 常 kill 掉,系統會自動重啓該服務,並將 Intent 的值傳入。
- START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保證服務被 kill 後一定能重啓。
Service 的 onRebind(Intent)方法在什麼情況下會執行?
在 onUnbind()方法返回 true 的情況下會執行。
3. BroadcastReceiver
3.1 基本知識
概念
BroadcastReceiver直譯爲"廣播接收者”,主要用來接收來自系統和應用中的廣播。在Android系統中,廣播體現在方方面面,例如開機廣播、網絡狀態廣播、電池電量廣播等等。
作用
廣播可以用於異步處理消息,此時作用類似於Handler,比Handler更強大的是廣播可以在整個設備內互通消息,基於這個特性可以用來解決進程間通信的問題。
生命週期
廣播的生命週期從調用開始到onReceive()執行完畢結束,需要注意的是,一般廣播的生命週期都極短,需要在10秒內處理完onReceive()中的所有工作,所以,一般不進行耗時長的工作,如果有耗時長的工作,應當通過Intent傳遞給Service進行處理。
注意,不要在onReceive()中開啓線程進行耗時任務處理,否則,在10s後,該線程會變成空線程,從而導致任務的丟失。同樣的,也不要使用bindService來綁定服務。
啓動
BroadcastReceiver的啓動過程要從註冊說起了:
- 靜態註冊:靜態註冊的BroadcastReceiver在應用啓動時自動創建一個實例,應用銷燬時自動銷燬,完全由系統控制,無需過多關注。
- 動態註冊:BroadcastReceiver通常在Activity中通過registerReceiver()方法動態註冊,此時應在Activity銷燬之前調用unregisterReceiver()方法註銷。
BroadcastReceiver將在收到對應廣播時自動啓動,執行完onReceive()方法後自動結束,生命週期短暫而有效。
3.2 疑難點
3.3 面試常考
廣播的兩種註冊形式?區別在哪?
廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊。
動態註冊廣播接收器特點是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔憂廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器也是打開着的。也就是說哪怕app本身未啓動,該app訂閱的廣播在觸發時也會對它起作用。
如何判斷當前BroadcastReceiver接受到的是有序廣播還是無序廣播?
在BroadcastReceiver類中onReceive()方法中,可以調用boolean b=isOrderedBroadcast();該方法是BroadcastReceiver類中提供的方法,用於判斷我們當前的接收到的廣播是否爲有序廣播。
4. ContentProvider
4.1 基本知識
概念
ContentProvider直譯爲“內容提供者”,主要用於共享本應用的數據給其他應用使用,根據此特性也可將ContentProvider用於進程間通信。提供數據的應用註冊ContentProvider,獲取數據的應用創建ContentResolver獲取對應ContentProvider的數據。
作用
Content Provider使一個應用程序的指定數據集提供給其他應用程序。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。開發人員通常不會使用ContentProvider類的對象,大多數是通過ContentResolver對象實現對ContentProvider的操作。
生命週期
ContentProvider的生命週期主要就是類似數據庫的CRUD,ContentResolver也是類似的提供了相應的方法調用。
啓動
ContentProvider並不通過實例使用,一般通過Context的getContentResolver()方法獲得ContentResolver實例,ContentResolver提供了與ContentProvider一致的方法,可通過URI喚起相應的ContentProvider對提供的數據進行CRUD操作。
4.2 疑難點
4.3 面試常考
ContentProvider瞭解多少?
(1)android平臺提供了ContentProvider使一個應用程序的指定數據集提供給其他應用程序。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。
(2)只有需要在多個應用程序間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式。
(3)ContentProvider實現數據共享。ContentProvider用於保存和獲取數據,並使其對所有應用程序可見。這是不同應用程序間共享數據的唯一方式,因爲android沒有提供所有應用共同訪問的公共存儲區。
(4)開發人員不會直接使用ContentProvider類的對象,大多數是通過ContentResolver對象實現對ContentProvider的操作。
(5)ContentProvider使用URI來唯一標識其數據集,這裏的URI以content://作爲前綴,表示該數據由ContentProvider來管理。