Android 創(chuàng)建 Stub Content Provider

2018-08-02 17:43 更新

編寫:jdneo - 原文:http://developer.android.com/training/sync-adapters/creating-stub-provider.html

Sync Adapter 框架是設(shè)計成用來和設(shè)備數(shù)據(jù)一起工作的,而這些設(shè)備數(shù)據(jù)應(yīng)該被靈活且安全的 Content Provider 框架管理。因此,Sync Adapter 框架會期望應(yīng)用已經(jīng)為它的本地數(shù)據(jù)定義了 Content Provider。如果 Sync Adapter 框架嘗試去運(yùn)行我們的 Sync Adapter,而我們的應(yīng)用沒有一個 Content Provider 的話,那么 Sync Adapter 將會崩潰。

如果我們正在開發(fā)一個新的應(yīng)用,它將數(shù)據(jù)從服務(wù)器傳輸?shù)揭慌_設(shè)備上,那么我們務(wù)必考慮將本地數(shù)據(jù)存儲于 Content Provider 中。除了它對于 Sync Adapter 的重要性之外,Content Provider 還可以提供許多安全上的好處,更何況它是專門為了在 Android 設(shè)備上處理數(shù)據(jù)存儲而設(shè)計的。要學(xué)習(xí)如何創(chuàng)建一個 Content Provider,可以閱讀:Creating a Content Provider。

然而,如果我們已經(jīng)通過別的形式來存儲本地數(shù)據(jù),我們?nèi)匀豢梢允褂?Sync Adapter 來處理數(shù)據(jù)傳輸。為了滿足 Sync Adapter 框架對于 Content Provider 的要求,我們可以在應(yīng)用中添加一個 Stub Content Provider。一個 Stub Content Provider 實現(xiàn)了 Content Provider 類,但是所有的方法都返回 null 或者 0。如果我們添加了一個 Stub Content Provider,那么無論數(shù)據(jù)存儲機(jī)制是什么,我們都可以使用 Sync Adapter 來傳輸數(shù)據(jù)。

如果在我們的應(yīng)用中已經(jīng)有了一個 Content Provider,那么我們就不需要創(chuàng)建 Stub Content Provider 了。在這種情況下,我們可以略過這節(jié)課程,直接進(jìn)入:創(chuàng)建 Sync Adapter。如果你還沒有創(chuàng)建 Content Provider,這節(jié)課將向你展示如何通過添加一個 Stub Content Provider,將你的 Sync Adapter 添加到框架中。

添加一個 Stub Content Provider

要為我們的應(yīng)用創(chuàng)建一個 Stub Content Provider,首先繼承 ContentProvider 類,并且在所有需要重寫的方法中,我們一律不進(jìn)行任何處理而是直接返回。下面的代碼片段展示了我們應(yīng)該如何創(chuàng)建一個 Stub Content Provider:

/*
 * Define an implementation of ContentProvider that stubs out
 * all methods
 */
public class StubProvider extends ContentProvider {
    /*
     * Always return true, indicating that the
     * provider loaded correctly.
     */
    @Override
    public boolean onCreate() {
        return true;
    }
    /*
     * Return an empty String for MIME type
     */
    @Override
    public String getType() {
        return new String();
    }
    /*
     * query() always returns no results
     *
     */
    @Override
    public Cursor query(
            Uri uri,
            String[] projection,
            String selection,
            String[] selectionArgs,
            String sortOrder) {
        return null;
    }
    /*
     * insert() always returns null (no URI)
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    /*
     * delete() always returns "no rows affected" (0)
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
    /*
     * update() always returns "no rows affected" (0)
     */
    public int update(
            Uri uri,
            ContentValues values,
            String selection,
            String[] selectionArgs) {
        return 0;
    }
}

在 Manifest 清單文件中聲明 Provider

Sync Adapter 框架會通過查看應(yīng)用的 manifest 文件中是否聲明了 provider,來驗證我們的應(yīng)用是否使用了 Content Provider。為了在 manifest 清單文件中聲明我們的 Stub Content Provider,添加一個 <provider>標(biāo)簽,并讓它擁有下列屬性字段:

android:name="com.example.android.datasync.provider.StubProvider"

指定實現(xiàn) Stub Content Provider 類的完整包名。

android:authorities="com.example.android.datasync.provider"

指定 Stub Content Provider 的 URI Authority。用應(yīng)用的包名加上字符串 ".provider" 作為該屬性字段的值。雖然我們在這里向系統(tǒng)聲明了 Stub Content Provider,但是不會嘗試訪問 Provider 本身。

android:exported="false"

確定其它應(yīng)用是否可以訪問 Content Provider。對于 Stub Content Provider 而言,由于沒有讓其它應(yīng)用訪問該 Provider 的必要,所以我們將該值設(shè)置為 false。該值并不會影響 Sync Adapter 框架和 Content Provider 之間的交互。

android:syncable="true"

該標(biāo)識指明 Provider 是可同步的。如果將這個值設(shè)置為 true,那么將不需要在代碼中調(diào)用 setIsSyncable()。這一標(biāo)識將會允許 Sync Adapter 框架和 Content Provider 進(jìn)行數(shù)據(jù)傳輸,但是僅僅在我們顯式地執(zhí)行相關(guān)調(diào)用時,這一傳輸時才會進(jìn)行。

下面的代碼片段展示了我們應(yīng)該如何將 <provider> 標(biāo)簽添加到應(yīng)用的 manifest 清單文件中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.network.sync.BasicSyncAdapter"
    android:versionCode="1"
    android:versionName="1.0" >
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    ...
    <provider
        android:name="com.example.android.datasync.provider.StubProvider"
        android:authorities="com.example.android.datasync.provider"
        android:exported="false"
        android:syncable="true"/>
    ...
    </application>
</manifest>

現(xiàn)在我們已經(jīng)創(chuàng)建了所有 Sync Adapter 框架所需要的依賴項,接下來我們可以創(chuàng)建封裝數(shù)據(jù)傳輸代碼的組件了。該組件就叫做 Sync Adapter。在下節(jié)課中,我們將會展示如何將這一組件添加到應(yīng)用中。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號