• <blockquote id="0wwma"></blockquote>
  • <blockquote id="0wwma"></blockquote>
    <samp id="0wwma"><s id="0wwma"></s></samp>
    <input id="0wwma"></input>
  • <samp id="0wwma"><input id="0wwma"></input></samp>
  • 蒲公英聯盟提供ghost win10,ghost win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

    當前位置:主頁 > 教程 > 服務器類 >

    Android組件content provider如何使用

    來源:蒲公英系統┆發布時間:2018-10-31 09:03┆點擊:

    Android四大組件之一 content provider,它主要的作用是:實現各個應用程序之間的(跨應用)數據共享。

    在這里涉及到進程通信問題,自然在Android中使用的是binder來進行,但是由于content provider提供的數據量一般都比較大不能夠直接進行傳遞。

    所以這里采用的是一種叫做 匿名共享內存的方式進行數據傳遞,在不同的進程中只需要傳遞一個文件描述符就可以。

    通過下圖對content provider有個比較直觀的了解:

    Android組件content provider如何使用 三聯

    ContentProvider提供了在應用程序之前共享數據的一種機制。
    1)存儲和獲取數據提供了統一的接口。
    2)對數據進行封裝,不用關心數據存儲的細節。
    3)Android為常見的一些數據提供了默認的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。

    二、content provider的定義

    如果需要使用content provider首先需要在AndroidManifest中進行申明

    <provider android:authorities="list" //該provider的唯一ID android:directBootAware=["true" | "false"] android:enabled=["true" | "false"] // 能否被系統實例化 android:exported=["true" | "false"] //該provider能否被其他應用使用 android:grantUriPermissions=["true" | "false"] android:icon="drawable resource" android:initOrder="integer" android:label="string resource" android:multiprocess=["true" | "false"] android:name="string" android:permission="string" android:process="string" android:readPermission="string" //讀權限 android:syncable=["true" | "false"] android:writePermission="string" > //寫權限 . . . </provider>

    注意在provider的屬性中最重要的是 authorities,它是唯一能夠標識一個provider,contentprovider通過URI中的地址來查找到對應的provider,其中該URI就包含了需要尋找的provider中的authorities屬性值。
    定義好的provider最后被打包編譯進入到PackageManagerService中。

    在Java代碼中定義一個provider時需要繼承其父類ContentProvider,并實現增刪查改方法。

    public class XXXXProvider extends ContentProvider { @Override public boolean onCreate() { // TODO Auto-generated method stub return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub return null; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }

    三、contentprovider的使用

    在activity中如果想通過provider來實現增刪查改,首先需要獲取contentprovider,大致過程為在context中獲取contentResolver,然后通過contentResolver去ActivityManagerService中查詢對應的provider,如果沒有則進入PackageManagerService中查找:

    1)首先每個context類都會內部包含了一個ContentResolver的子對象ApplicationContentResolver。
    2)通過調用ApplicationContentResolver的主要方法query來獲取CP的數據庫數據。
    3)調用的過程首先會調用ContentResolver的核心方法acquireProvider()。而acquireProvider()方法是一個抽象方法,其實現是交由子類實現。
    4)通過子類的acquireProvider()方法實現了解到主要的實現是交由ActivityThread類來完成。
    5)ActivityThread類會做出一個判斷,如果本地保存一個需要獲取的CP對象實例,就會直接返回這個對象實例,如果沒有保存,則會訪問AMS對象去查找獲取一個對象的CP對象實例,當找到這個對象實例后會保存到本地以便日后快速獲取。
    6)如果在AMS里面沒有找到,就會繼續深入到PMS里去從全部的provider中查找。
    7)獲取到CP對象實例后會通過層層返回,最后再調用該CP對象的query方法獲取相應的數據。

    首先在應用的的manifest中需要進行讀寫權限申明,這個申明的定義跟之前provider定義中讀寫所需權限屬性值是一樣的:

    <use-permission android:name="android.permission.READ_SMS"/> <use-permission android:name="android.permission.WRITE_SMS"/>

    在activity中獲取ContentResolver調用其中的操作方法時,需要傳入相對應的參數:

    contentResolver.query(Uri uri, String[] projection,String selection, String[] selectionArgs,String orderBy);

    uri:傳入對應uri是為了查找到對應的provider,跟provider在manifest中定義的authorities值是一樣

    projection:選擇需要返回的對象屬性值,有時候不需要將對象的值全部返回。

    selection/selectionArgs: 查詢條件

    orderBy: 返回的對象排序方式

    類似其他的delete、insert和update操作。最主要的是傳入正確的Uri才能找到對應的provider。

    尚未注冊暢言帳號,請到后臺注冊
    人与动人物xxxx毛片
  • <blockquote id="0wwma"></blockquote>
  • <blockquote id="0wwma"></blockquote>
    <samp id="0wwma"><s id="0wwma"></s></samp>
    <input id="0wwma"></input>
  • <samp id="0wwma"><input id="0wwma"></input></samp>