1. 程式人生 > >寫給Android App開發人員看的Android底層知識(7)

寫給Android App開發人員看的Android底層知識(7)

(十二)ContentProvider

(1)ContentProvider是什麼?

ContentProvider,簡稱CP。

做App開發的同學,尤其是電商類App,對CP並不熟悉,對這個概念的最大程度的瞭解,也僅僅是建立在書本上,它是Android四大元件中的一個。

做系統管理類的App,比如說手機助手這種,有機會頻繁使用CP。

而對於應用類App,資料通常存在伺服器端,其它應用類App也想使用的時候,一般都是從伺服器取資料,所以沒機會使用到CP。

有時候我們會在自己的App中讀取通訊錄或者簡訊的資料,這時候就需要用到CP了。通訊錄或者簡訊的資料,是以CP的形式提供的,我們在App這邊,是使用方。

      對於做應用類App的同學,很少有機會自定義CP供其它App使用。

我們快速回顧一下在App中怎麼使用CP。

1)定義CP的App1:

       在App1中定義一個CP的子類MyContentProvider,並在Manifest中宣告,為此要在MyContentProvider中實現CP的增刪改查四個方法:

2)使用CP的App2:

     在App2訪問App1中定義的CP,為此,要使用到ContentResolver,它也提供了增刪改查4個方法,用於訪問App1中定義的CP:

首先我們看一下ContentResolver的增刪改查這4個方法的底層實現,其實都是和AMS通訊,最終呼叫App1的CP的增刪改查4個方法,後面我們會講到這個流程是怎麼樣的。

      其次,URI是CP的身份證,唯一標識。

      我們在App1中為CP宣告URI,也就是authorities的值為baobao,那麼在App2中想使用它,就在ContentResolver的增刪改查4個方法中指定URI,格式為:

uri = Uri.parse("content://baobao/");

      接下來把兩個App都進入debug模式,就可以從App2除錯進入App1了,比如說,query操作。

     (2)CP的本質

      CP的本質是把資料儲存在SQLite資料庫中。

      各種資料來源,有各種格式,比如簡訊、通訊錄,它們在SQLite中就是不同的資料表,但是對外界的使用者而言,就需要封裝成統一的訪問方式,比如說對於資料集合而言,必須要提供增刪改查四個方法,於是我們在SQLite之上封裝了一層,也就是CP。

     (3)匿名共享記憶體(ASM)

CP讀取資料使用到了匿名共享記憶體,英文簡稱ASM,所以你看上面CP和AMS通訊忙的不亦樂乎,其實下面別有一番風景。

      關於ASM的概念,它其實也是個Binder通訊,我畫個圖哦,你們就明白了:

什麼?還沒看懂?那我再畫一個類的互動關係圖:

這裡的CursorWindow就是匿名共享記憶體。

這個流程,簡單來說是這樣的:

1)Client內部有一個CursorWindow物件,傳送請求的時候,把這個CursorWindow型別的物件傳過去,這個物件暫時為空。

2)Server收到請求,蒐集資料,填充到這個CursorWindow物件。

      3)Client讀取內部的這個CursorWindow物件,獲取到資料。

      由此可見,這個CursorWindow物件,就是匿名共享記憶體,這是同一塊匿名記憶體。   

舉個生活中的例子就是,你定牛奶,在你家門口放個箱子,送牛奶的人每天早上往這個箱子放一袋牛奶,你睡醒了去箱子裡取牛奶。這個牛奶箱就是匿名共享記憶體。

     (4)CP與AMS的通訊流程

      接下來我們看一下CP是怎麼和AMS通訊的。

能堅持看到這裡的人,都不容易。我努力多貼圖,不貼程式碼,即使有程式碼,也是App開發人員能看懂的程式碼。

還是拿App2想訪問App1中定義的CP為例子。我們就看CP的insert方法。

     上面這5行程式碼,包括了啟動CP和執行CP方法兩部分,分水嶺在insert方法,insert方法的實現,前半部分仍然是在啟動CP,當CP啟動後獲取到CP的代理物件,後半部分是通過代理物件,呼叫insert方法。

整體的流程如下圖所示:

1)App2傳送訊息給AMS,想要訪問App1中的CP。

2)AMS檢查發現,App1中的CP沒啟動過,為此新開一個程序,啟動App1,然後獲取到App1啟動的CP,把CP的代理物件返回給App2。

      3)App2拿到CP的代理物件,也就是IContentProvider,就呼叫它的增刪改查4個方法了,接下來就是使用ASM來傳輸資料或者修改資料了,也就是上面提到的CursorWindow這個類,取得資料或者操作結果即可,作為App的開發人員,不需要知道太多底層的詳細資訊,用不上。

至此,關於CP的介紹就結束了。下一篇文章,我們看一下App的安裝流程,也就PMS。

相關推薦

Android App開發人員Android底層知識1

這個系列的文章一共8篇,我醞釀了很多年,參考了很多資源,查看了很多原始碼,直到今天把它寫出來,也是戰戰兢兢,生怕什麼地方寫錯了,貽笑大方 (一)引言 早在我還是Android菜鳥的時候,有很多技術我都不太明白,也都找不到答案,比如apk是怎麼安裝的,比如資源是怎

Android App開發人員Android底層知識8

(十)PMS及App安裝過程        PMS,全稱PackageManagerService,是用來獲取Apk包的資訊的。        在前面分析四大元件與AMS通訊的時候,我們介紹過,AMS總是會使用PMS載入包的資訊,將其封裝在LoadedApk這個類物件

Android App開發人員Android底層知識7

(十二)ContentProvider (1)ContentProvider是什麼? ContentProvider,簡稱CP。 做App開發的同學,尤其是電商類App,對CP並不熟悉,對這個概念的最大程度的瞭解,也僅僅是建立在書本上,它是Android四大元件中的一個。 做系統管理類的App,比

Android App開發人員Android底層知識5

     (十)Service      Service有兩套流程,一套是啟動流程,另一套是繫結流程。我們做App開發的同學都應該知道。            1)在新程序啟動Service        我們先看Service啟動過程,假設要啟動的Service是在一個新的程序中,分為5個階段:

Android App開發人員Android底層知識4

(八)App內部的頁面跳轉       在介紹完App的啟動流程後,我們發現,其實就是啟動一個App的首頁。       接下來我們看App內部頁面的跳轉。       從ActivityA跳轉到ActivityB,其實可以把ActivityA看作是Launcher,那麼這個跳轉過程,和Ap

Android App開發人員Android底層知識3

       (七)App啟動流程第2篇        書接上文,App啟動一共有七個階段,上篇文章篇幅所限,我們只看了第一階段,接下來講剩餘的六個階段,仍然是拿鬥魚App舉例子。        簡單回顧一下第一階段的流程,就是Launcher向AMS傳送一個跨程序通訊,通過AMN/AMP,告訴A

Android App開發人員Android底層知識2

(五)AMS 如果站在四大元件的角度來看,AMS就是Binder中的Server。       AMS全稱是ActivityManagerService,看字面意思是管理Activity的,但其實四大元件都歸它管。估計是Android底層開發人員先寫了ActivityManagerService用來管理A

Android App開發人員Android底層知識6

(十一)BroadcastReceiver BroadcastReceiver,也就是廣播,簡稱Receiver。      很多App開發人員表示,從來沒用過Receiver。其實吧,對於音樂播放類App,用Service和Receiver還是蠻多的,如果你用過QQ音樂,App退到後臺,音樂照樣播放

初次接觸Android APP開發之安裝Android studio軟體出現的問題以及解決方案錯誤史,一把辛酸淚

     序言     筆者由於心血來潮,想玩玩Android開發。本想著用eclipes開發Android APP。但是發現網上說eclipes不是最好的選擇,所以筆者就放棄了熟悉的eclipes來開發Android APP,改用Android studio。在此之前,筆

Android應用開發:網絡工具——Volley

respond sid 開發 多少 called creat miss 相等 eal 引言 在Android應用開發:網絡工具——Volley(一)中結合Cloudant服務介紹了Volley的一般使用方法,當中包括了兩種請求類型StringRequest和JsonOb

Android應用開發:網絡工具——Volley

要求 com 庫文件 urn welcom 順序 之前 air tin 引言 網絡一直是我個人的盲點,前一陣子抽空學習了一下Volley網絡工具的用法,也透過源代碼進行了進一步的學習,有一些心得想分享出來。在Android開發中,成熟的網絡工具不少,And

Android安全/開發基礎--8--Java本地介面JNI

8-1、JNI概述 JNI的本意是Java Native Interface(Java本地介面),是為了方便Java和C/C++等原生代碼所封裝的一層介面,使用JNI技術可以對Java層遮蔽不同作業系統平臺之間的差異,從而實現Java本身的平臺無關特性。JNI和

Android應用開發以及設計思想深度剖析1

本文內容,主題是透過應用程式來分析Android系統的設計原理與構架。我們先會簡單介紹一下Android裡的應用程式程式設計,然後以這些應用程 序在執行環境上的需求來分析出,為什麼我們的Android系統需要今天這樣的設計方案,這樣的設計會有怎樣的意義, Android究竟

一個android專案開發遇到的各種小問題

1、map格式字串如何解析? 藉助json,先將字串轉化為json格式,再取值 JSONObject object = new JSONObject(posMap); clientIden = object.getString("iden"); ---------

Android繪圖之Canvas狀態儲存和恢復7

1 Canvas 狀態儲存和恢復 前面講canvas概念理解時 已經講解了save和savelayer,saveLayerAlpha函式,這裡進行canvas狀態儲存和恢復的詳細講解。 Canvas 呼叫了translate,scale,rotate,skew,concat or

【安卓-自定義佈局】安卓App開發思路 一步一個腳印實現內嵌在app中的webview 騰訊開源X5 高效安全

實現內嵌在app中的webview 採用騰訊開源X5 高效安全 webview在app的使用中,十分頻繁,原生的webview載入速度相對來說很慢,而且很費流量。騰訊開源了x5的webview

【安卓-自定義佈局】安卓App開發思路 一步一個腳印實現自定義滾動的新聞條目上下滾動-仿蘑菇街

實現自定義滾動的新聞條目上下滾動-仿蘑菇街       這種上下滾動的自定義佈局,就像是公告那種上下的翻滾,一般為文字的滾動,很明顯,就是自定義佈局,一般是線性佈局。這裡提到的安卓原生的控制元件自然是

豹哥嵌入式講堂:ARM Cortex-M開發之文件詳解7- 反匯編文件(.s/.lst/.dump)

work cfi text1 翻譯 memory 進制數 補充 就是 datatable   大家好,我是豹哥,獵豹的豹,犀利哥的哥。今天豹哥給大家講的是嵌入式開發裏的反匯編文件(.s, .lst, .dump)。   豹哥在第四、五、六節課分別介紹了編譯器/鏈接器生成的

遊戲開發中必備的數學知識——矩陣的基本變換

基本變換 使用Direct3D程式設計的時候,我們使用4×4的矩陣表示一個變換。其思路如下: 設定一個4×4的矩陣中元素的值,使其表示某一個具體變換,然後我們將某一點的座標或者某向量的分量放入一個1×4的行向量v中,乘積vX就是成為了一個新的經過變換的向量v。 此時,我們之所以使用4×4

Java虛擬機器7---直譯器和JIT編譯器

Java是被定為為解釋性語言,JIT編譯器並不是強制需要的,也並非所有的虛擬機器都是用直譯器+編譯器的並存架構。但主流的商用虛擬機器如Hotspot、J9等都採用這種並存的架構。 直譯器和編譯器比較 直譯器優點:省去編譯時間,啟動速度快 編譯器優點:對程式