ContentProvider的那些小事(純結論)


一、ContentProvider背景

Android系統是基於Linux系統內核來進行開發的,在Linux中,文件具有一系列的屬性,其中最重要的莫過於文件權限了。關於文件權限,其實就是文件的讀寫,執行操作的權限。它可以指定不同的用戶,不用的用戶組對同一文件的操作權限。Android繼承了Linux的文件管理方式,一般每個應用程序都是獨立的進程,也就是不同的用戶。它會為每個應用程序分配獨立的用戶ID和用戶組ID.而由這個應用程序創建出來的文件則賦予了相應用戶的讀寫權限,其他用戶,也就是其他應用程序無權讀寫。

但是,依然有共享數據的需求存在,比如A要讀取通訊錄或者要讀取B應用的數據,那必須有一套比較友好的機制來實現這個進程間數據共享的問題。

而ContentProvider就是Android系統下,專門用以處理這個需求的。

 

二、ContentProvider簡介

ContentProvider是Android四大組件之一,可以提供數據給應用程序。ContentProvider可以提供數據在進程之間共享。
上面這些話基本上都是ContentProvider的文檔說明,不過今天我們討論的不是這些,我們要討論的是ContentProvider的初始化過程。ContentProvider采用的是懶漢式初始化過程,只有在使用的時候才會去初始化。

三、ContentProvider工作於非主線程

ContentResolver與ContentProvider類隱藏了實現細節,但是ContentProvider所提供的query(),insert(),delete(),update()都是在ContentProvider進程的線程池中被調用執行的,而不是進程的主線程中。因為那些方法可能同時被多個線程所調用,所以他們的數據同步問題,要在實現邏輯中實現好。
ContentProvider實現了進程間通信也是基於Binder機制的,所以會回到Binder的線程處理問題。並不是每個ContentProvider都會有一個線程池,而一個進程會共有一個線程池,其實就是Binder線程池。
 

四、ContentProvider啟動細節

4.1、contentProvider的初始化是在它自己進程的主線程里面完成,一般發生在有人第一次訪問這個contentProvider或者這個contentProvider進程第一次啟動,比如這個進程有個service,開機啟動,那么隨着servier啟動的還有contentProvider.
4.2、 contentProvider有個android:multiProcess屬性,用來配置是否在多個進程里面,有不同的實例。如果為true,那么它就會在每個訪問這個contentProvider的進程里面生成一個對象。這個時候調用contentProvider,就是哪個線程調用的,contentProvider就運行在那個線程里面。
如果這個值配置為false,那么多個進程之間共享一個contentProvider,通過binder來進行進程之間對象傳遞。如果多個進程同時訪問,會為每個訪問請求分配個線程。所以,這些操作,比如查詢,不會運行在contentProvider進程的主線程。
4.3、 contentProvider查詢等操作是否需要等待,需要binder來設置。
4.4、contentProvider查詢的數據傳遞是通過ashmem來完成的。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM