ContentProvider的那些小事(純結論)

1、ContentProvider背景

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

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

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

 

2、ContentProvider簡介

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

線程

3、ContentProvider工做於非主線程

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

4、ContentProvider啓動細節

4.一、contentProvider的初始化是在它本身進程的主線程裏面完成,通常發生在有人第一次訪問這個contentProvider或者這個contentProvider進程第一次啓動,好比這個進程有個service,開機啓動,那麼隨着servier啓動的還有contentProvider.
4.二、 contentProvider有個android:multiProcess屬性,用來配置是否在多個進程裏面,有不一樣的實例。若是爲true,那麼它就會在每一個訪問這個contentProvider的進程裏面生成一個對象。這個時候調用contentProvider,就是哪一個線程調用的,contentProvider就運行在那個線程裏面。
若是這個值配置爲false,那麼多個進程之間共享一個contentProvider,經過binder來進行進程之間對象傳遞。若是多個進程同時訪問,會爲每一個訪問請求分配個線程。因此,這些操做,好比查詢,不會運行在contentProvider進程的主線程。
4.三、 contentProvider查詢等操做是否須要等待,須要binder來設置。
4.四、contentProvider查詢的數據傳遞是經過ashmem來完成的。
相關文章
相關標籤/搜索