通過前面的學習,我們知道在Android系統中,Content Provider可以為不同的應用程序訪問相同的數據提供統一的入口。Content Provider一般是運行在獨立的進程中的,每一個Content Provider在系統中只有一個實例存在,其它應用程序首先要找到這個實例,然後才能訪問它的數據。那麼,系統中的Content Provider實例是由誰來負責啟動的呢?本文將回答這個問題。
Content Provider和應用程序組件Activity、Service一樣,需要在AndroidManifest.xml文件中配置之後才能使用。系統在安裝包含Content Provider的應用程序的時候,會把這些Content Provider的描述信息保存起來,其中最重要的就是Content Provider的Authority信息,Android應用程序的安裝過程具體可以參考Android應用程序安裝過程源代碼分析一文。注意,安裝應用程序的時候,並不會把相應的Content Provider載入到內存中來,系統採取的是懶載入的機制,等到第一次要使用這個Content Provider的時候,系統才會把它載入到內存中來,下次再要使用這個Content Provider的時候,就可以直接返回了。
本文以前面一篇文章Android應用程序組件Content Provider應用實例中的例子來詳細分析Content Provider的啟動過程。在Android應用程序組件Content Provider應用實例這篇文章介紹的應用程序Article中,第一次使用ArticlesProvider這個Content Provider的地方是ArticlesAdapter類的getArticleCount函數,因為MainActivity要在ListView中顯示文章信息列表時, 首先要知道ArticlesProvider中的文章信息的數量。從ArticlesAdapter類的getArticleCount函數調用開始,一直到ArticlesProvider類的onCreate函數被調用,就是ArticlesProvider的完整啟動過程,下面我們就先看看這個過程的序列圖,然後再詳細分析每一個步驟:
Step 1. ArticlesAdapter.getArticleCount
這個函數定義在前面一篇文章Android應用程序組件Content Provider應用實例介紹的應用程序Artilce源代碼工程目錄下,在文件為packages/experimental/Article/src/shy/luo/article/ArticlesAdapter.java中:
[java] view plaincopy
- publicclassArticlesAdapter{
- ......
- privateContentResolverresolver=null;
- publicArticlesAdapter(Contextcontext){
- resolver=context.getContentResolver();
- }
- ......
- publicintgetArticleCount(){
- intcount=0;
- try{
- IContentProviderprovider=resolver.acquireProvider(Articles.CONTENT_URI);
- Bundlebundle=provider.call(Articles.METHOD_GET_ITEM_COUNT,null,null);
- count=bundle.getInt(Articles.KEY_ITEM_COUNT,0);
- }catch(RemoteExceptione){
- e.printStackTrace();
- }
- returncount;
- }
- ......
- }
這個函數通過應用程序上下文的ContentResolver介面resolver的acquireProvider函數來獲得與Articles.CONTENT_URI對應的Content Provider對象的IContentProvider介面。常量Articles.CONTENT_URI是在應用程序ArticlesProvider中定義的,它的值為「content://shy.luo.providers.articles/item」,對應的Content Provider就是ArticlesProvider了。
Step 2. ContentResolver.acqireProvider
這個函數定義在frameworks/base/core/java/android/content/ContentResolver.java文件中:
[java] view plaincopy
※好奇驅使我對XSS平台的一次小研究
※滲透某Webshell箱子全過程,
※一類混淆變形的Webshell分析
TAG:程序 | Android | 代碼 | 源代碼 | Android應用 | 代碼分析 | 組件 | 分析 |