Tạo bộ điều hợp đồng bộ hoá

Lưu ý: Bạn nên dùng WorkManager là giải pháp được đề xuất cho hầu hết các trường hợp sử dụng xử lý ở chế độ nền. Vui lòng tham khảo hướng dẫn xử lý nền để tìm hiểu giải pháp nào phù hợp nhất với bạn.

Thành phần bộ điều hợp đồng bộ hoá trong ứng dụng đóng gói mã cho các tác vụ chuyển giữa thiết bị và máy chủ. Dựa trên lịch biểu và các yếu tố kích hoạt bạn cung cấp trong ứng dụng của bạn, khung bộ điều hợp đồng bộ hoá sẽ chạy mã trong thành phần của bộ điều hợp đồng bộ hoá. Để thêm một thành phần của bộ điều hợp đồng bộ hoá vào ứng dụng của mình, bạn cần thêm các phần sau:

Lớp bộ điều hợp đồng bộ hoá.
Một lớp gói mã chuyển dữ liệu của bạn trong một giao diện tương thích với bộ điều hợp đồng bộ hoá khung.
Đang ràng buộc Service.
Một thành phần cho phép khung bộ điều hợp đồng bộ hoá chạy mã trong bộ điều hợp đồng bộ hoá .
Đồng bộ hoá tệp siêu dữ liệu XML của bộ chuyển đổi.
Tệp chứa thông tin về bộ điều hợp đồng bộ hoá của bạn. Khung sẽ đọc tệp này để tìm hiểu cách tải và lên lịch chuyển dữ liệu.
Nội dung khai báo trong tệp kê khai ứng dụng.
XML khai báo dịch vụ ràng buộc và trỏ để đồng bộ hoá siêu dữ liệu dành riêng cho bộ chuyển đổi.

Bài học này sẽ hướng dẫn bạn cách xác định những phần tử này.

Tạo một lớp bộ điều hợp đồng bộ hoá

Trong phần này của bài học, bạn sẽ tìm hiểu cách tạo lớp bộ điều hợp đồng bộ hoá để đóng gói mã chuyển dữ liệu. Việc tạo lớp này bao gồm việc mở rộng lớp cơ sở của bộ điều hợp đồng bộ hoá, xác định hàm khởi tạo cho lớp và triển khai phương thức mà bạn xác định quá trình chuyển dữ liệu công việc.

Mở rộng lớp bộ điều hợp đồng bộ hoá cơ sở

Để tạo thành phần bộ điều hợp đồng bộ hoá, hãy bắt đầu bằng cách mở rộng AbstractThreadedSyncAdapter và viết các hàm khởi tạo. Sử dụng hàm khởi tạo để chạy tác vụ thiết lập mỗi khi thành phần bộ điều hợp đồng bộ hoá được tạo từ đầu, giống như khi bạn sử dụng Activity.onCreate() để thiết lập của bạn. Ví dụ: nếu ứng dụng của bạn sử dụng trình cung cấp nội dung để lưu trữ dữ liệu, hãy dùng các hàm khởi tạo để nhận một thực thể ContentResolver. Vì dạng thứ hai của hàm khởi tạo đã được thêm vào nền tảng Android phiên bản 3.0 để hỗ trợ parallelSyncs , bạn cần tạo 2 dạng hàm khởi tạo để duy trì khả năng tương thích.

Lưu ý: Khung bộ điều hợp đồng bộ hoá được thiết kế để hoạt động với bộ điều hợp đồng bộ hoá là các thành phần là thực thể singleton. Thao tác tạo thực thể cho thành phần bộ điều hợp đồng bộ hoá cũng được đề cập chi tiết hơn trong phần này Liên kết Bộ điều hợp đồng bộ hoá với Khung.

Ví dụ sau đây minh hoạ cách triển khai AbstractThreadedSyncAdaptervà các hàm khởi tạo:

Kotlin

/**
 * Handle the transfer of data between a server and an
 * app, using the Android sync adapter framework.
 */
class SyncAdapter @JvmOverloads constructor(
        context: Context,
        autoInitialize: Boolean,
        /**
         * Using a default argument along with @JvmOverloads
         * generates constructor for both method signatures to maintain compatibility
         * with Android 3.0 and later platform versions
         */
        allowParallelSyncs: Boolean = false,
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        val mContentResolver: ContentResolver = context.contentResolver
) : AbstractThreadedSyncAdapter(context, autoInitialize, allowParallelSyncs) {
    ...
}

Java

/**
 * Handle the transfer of data between a server and an
 * app, using the Android sync adapter framework.
 */
public class SyncAdapter extends AbstractThreadedSyncAdapter {
    ...
    // Global variables
    // Define a variable to contain a content resolver instance
    ContentResolver contentResolver;
    /**
     * Set up the sync adapter
     */
    public SyncAdapter(Context context, boolean autoInitialize) {
        super(context, autoInitialize);
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        contentResolver = context.getContentResolver();
    }
    ...
    /**
     * Set up the sync adapter. This form of the
     * constructor maintains compatibility with Android 3.0
     * and later platform versions
     */
    public SyncAdapter(
            Context context,
            boolean autoInitialize,
            boolean allowParallelSyncs) {
        super(context, autoInitialize, allowParallelSyncs);
        /*
         * If your app uses a content resolver, get an instance of it
         * from the incoming Context
         */
        contentResolver = context.getContentResolver();
        ...
    }

Thêm mã chuyển dữ liệu

Thành phần bộ điều hợp đồng bộ hoá không tự động chuyển dữ liệu. Thay vào đó, đóng gói mã chuyển dữ liệu để khung bộ điều hợp đồng bộ hoá có thể chạy chuyển dữ liệu trong nền mà không cần ứng dụng của bạn can thiệp. Khi khung đã sẵn sàng để đồng bộ hoá dữ liệu của ứng dụng, lệnh gọi triển khai phương thức onPerformSync().

Để tạo điều kiện chuyển dữ liệu từ mã ứng dụng chính sang thành phần bộ điều hợp đồng bộ hoá, lệnh gọi khung bộ điều hợp đồng bộ hoá onPerformSync() bằng các đối số sau:

Tài khoản
Một đối tượng Account được liên kết với sự kiện đã kích hoạt bộ điều hợp đồng bộ hoá. Nếu máy chủ của bạn không sử dụng tài khoản, bạn không cần phải sử dụng trong đối tượng này.
Thông tin bổ sung
Bundle chứa cờ do sự kiện đã kích hoạt quá trình đồng bộ hoá gửi bộ chuyển đổi.
Độ uy tín
Thẩm quyền của trình cung cấp nội dung trong hệ thống. Ứng dụng của bạn phải có quyền truy cập vào nhà cung cấp này. Thông thường, đơn vị quản lý này tương ứng với một trình cung cấp nội dung trong ứng dụng của bạn.
Ứng dụng của nhà cung cấp nội dung
ContentProviderClient cho trình cung cấp nội dung được trỏ đến đối số uỷ quyền. ContentProviderClient là một công cộng gọn nhẹ đến một trình cung cấp nội dung. Nó có chức năng cơ bản giống như ContentResolver. Nếu bạn đang sử dụng một trình cung cấp nội dung để lưu trữ dữ liệu cho ứng dụng của mình, bạn có thể kết nối với nhà cung cấp bằng đối tượng này. Nếu không, bạn có thể bỏ qua nó.
Kết quả đồng bộ hoá
Đối tượng SyncResult mà bạn dùng để gửi thông tin đến quá trình đồng bộ hoá khung bộ chuyển đổi.

Đoạn mã sau đây trình bày cấu trúc tổng thể của onPerformSync():

Kotlin

/*
 * Specify the code you want to run in the sync adapter. The entire
 * sync adapter runs in a background thread, so you don't have to set
 * up your own background processing.
 */
override fun onPerformSync(
        account: Account,
        extras: Bundle,
        authority: String,
        provider: ContentProviderClient,
        syncResult: SyncResult
) {
    /*
     * Put the data transfer code here.
     */
}

Java

/*
 * Specify the code you want to run in the sync adapter. The entire
 * sync adapter runs in a background thread, so you don't have to set
 * up your own background processing.
 */
@Override
public void onPerformSync(
        Account account,
        Bundle extras,
        String authority,
        ContentProviderClient provider,
        SyncResult syncResult) {
    /*
     * Put the data transfer code here.
     */
}

Mặc dù việc triển khai thực tế onPerformSync() dành riêng cho có một số yêu cầu về đồng bộ hoá dữ liệu và giao thức kết nối máy chủ của ứng dụng những việc chung mà bạn nên thực hiện khi triển khai:

Đang kết nối với máy chủ
Mặc dù bạn có thể giả định rằng mạng vẫn sẵn sàng khi quá trình chuyển dữ liệu bắt đầu, khung bộ điều hợp đồng bộ hoá không tự động kết nối với máy chủ.
Tải xuống và tải dữ liệu lên
Bộ điều hợp đồng bộ hoá không tự động hoá bất kỳ tác vụ chuyển dữ liệu nào. Nếu bạn muốn tải xuống từ một máy chủ và lưu trữ dữ liệu đó trong nhà cung cấp nội dung, bạn phải cung cấp mã yêu cầu dữ liệu, tải dữ liệu xuống và chèn dữ liệu đó vào ứng dụng nhà cung cấp. Tương tự, nếu bạn muốn gửi dữ liệu đến máy chủ, bạn phải đọc dữ liệu đó từ tệp, cơ sở dữ liệu hoặc nhà cung cấp và gửi yêu cầu tải lên cần thiết. Bạn cũng phải xử lý các lỗi mạng xảy ra khi đang chạy chuyển dữ liệu.
Xử lý xung đột dữ liệu hoặc xác định mức độ hiện tại của dữ liệu
Bộ điều hợp đồng bộ hoá không tự động xử lý xung đột giữa dữ liệu trên máy chủ và dữ liệu trên thiết bị. Ngoài ra, nó cũng không tự động phát hiện xem dữ liệu trên máy chủ có mới hơn dữ liệu trên thiết bị hoặc ngược lại. Thay vào đó, bạn phải cung cấp các thuật toán của riêng mình cho xử lý tình huống này.
Dọn dẹp.
Luôn đóng kết nối với máy chủ và dọn dẹp các tệp tạm thời và bộ nhớ đệm ở cuối quá trình chuyển dữ liệu của bạn.

Lưu ý: Khung bộ điều hợp đồng bộ hoá sẽ chạy onPerformSync() trên luồng nền nên bạn không phải thiết lập quy trình xử lý nền của riêng mình.

Ngoài các công việc liên quan đến đồng bộ hoá, bạn nên thử kết hợp công việc liên quan đến mạng rồi thêm chúng vào onPerformSync(). Bằng cách tập trung tất cả các tác vụ mạng theo phương thức này, bạn tiết kiệm được mức pin để bắt đầu và dừng giao diện mạng. Để tìm hiểu thêm về cách tăng cường truy cập mạng hiệu quả hơn, hãy xem lớp đào tạo Chuyển dữ liệu mà không làm tiêu hao pin, trong đó mô tả một số phương thức truy cập mạng các tác vụ khác mà bạn có thể đưa vào mã chuyển dữ liệu.

Liên kết bộ điều hợp đồng bộ hoá với khung

Bạn hiện có mã chuyển dữ liệu của bạn được đóng gói trong thành phần bộ điều hợp đồng bộ hoá, nhưng bạn để cung cấp cho khung quyền truy cập vào mã của bạn. Để làm được điều này, bạn cần tạo một quy tắc ràng buộc Service truyền một đối tượng liên kết Android đặc biệt qua bộ điều hợp đồng bộ hoá vào khung. Với đối tượng liên kết này, khung có thể gọi phương thức Phương thức onPerformSync() và chuyển dữ liệu vào đó.

Tạo thực thể cho thành phần bộ điều hợp đồng bộ hoá dưới dạng một singleton trong Phương thức onCreate() của dịch vụ. Bằng cách tạo thực thể thành phần trong onCreate(), bạn trì hoãn cho đến khi dịch vụ bắt đầu, việc này xảy ra khi khung lần đầu cố gắng chạy chuyển dữ liệu. Bạn cần tạo thực thể cho thành phần này theo cách an toàn cho luồng, trong trường hợp quá trình đồng bộ hoá bộ chuyển đổi khung đưa nhiều lượt thực thi của bộ điều hợp đồng bộ hoá vào hàng đợi để phản hồi các điều kiện kích hoạt hoặc lập lịch biểu.

Ví dụ: đoạn mã sau đây cho bạn biết cách tạo một lớp triển khai liên kết Service, tạo thực thể cho thành phần bộ điều hợp đồng bộ hoá và nhận Đối tượng liên kết Android:

Kotlin

package com.example.android.syncadapter
/**
 * Define a Service that returns an [android.os.IBinder] for the
 * sync adapter class, allowing the sync adapter framework to call
 * onPerformSync().
 */
class SyncService : Service() {
    /*
     * Instantiate the sync adapter object.
     */
    override fun onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized(sSyncAdapterLock) {
            sSyncAdapter = sSyncAdapter ?: SyncAdapter(applicationContext, true)
        }
    }

    /**
     * Return an object that allows the system to invoke
     * the sync adapter.
     *
     */
    override fun onBind(intent: Intent): IBinder {
        /*
         * Get the object that allows external processes
         * to call onPerformSync(). The object is created
         * in the base class code when the SyncAdapter
         * constructors call super()
         *
         * We should never be in a position where this is called before
         * onCreate() so the exception should never be thrown
         */
        return sSyncAdapter?.syncAdapterBinder ?: throw IllegalStateException()
    }

    companion object {
        // Storage for an instance of the sync adapter
        private var sSyncAdapter: SyncAdapter? = null
        // Object to use as a thread-safe lock
        private val sSyncAdapterLock = Any()
    }
}

Java

package com.example.android.syncadapter;
/**
 * Define a Service that returns an <code><a href="/reference/android/os/IBinder.html">IBinder</a></code> for the
 * sync adapter class, allowing the sync adapter framework to call
 * onPerformSync().
 */
public class SyncService extends Service {
    // Storage for an instance of the sync adapter
    private static SyncAdapter sSyncAdapter = null;
    // Object to use as a thread-safe lock
    private static final Object sSyncAdapterLock = new Object();
    /*
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized (sSyncAdapterLock) {
            if (sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
            }
        }
    }
    /**
     * Return an object that allows the system to invoke
     * the sync adapter.
     *
     */
    @Override
    public IBinder onBind(Intent intent) {
        /*
         * Get the object that allows external processes
         * to call onPerformSync(). The object is created
         * in the base class code when the SyncAdapter
         * constructors call super()
         */
        return sSyncAdapter.getSyncAdapterBinder();
    }
}

Lưu ý: Để xem ví dụ chi tiết hơn về dịch vụ ràng buộc dành cho bộ điều hợp đồng bộ hoá, hãy xem ứng dụng mẫu.

Thêm tài khoản theo yêu cầu của khung

Khung bộ điều hợp đồng bộ hoá yêu cầu mỗi bộ điều hợp đồng bộ hoá phải có một loại tài khoản. Bạn đã khai báo giá trị loại tài khoản trong phần Thêm tệp siêu dữ liệu Authenticator. Bây giờ, bạn phải thiết lập loại tài khoản này trong Hệ thống Android. Để thiết lập loại tài khoản, hãy thêm một tài khoản giữ chỗ sử dụng loại tài khoản đó bằng cách gọi addAccountExplicitly().

Nơi tốt nhất để gọi phương thức này là trong Phương thức onCreate() của ứng dụng hoạt động mở. Đoạn mã sau đây cho bạn biết cách thực hiện việc này:

Kotlin

...
// Constants
// The authority for the sync adapter's content provider
const val AUTHORITY = "com.example.android.datasync.provider"
// An account type, in the form of a domain name
const val ACCOUNT_TYPE = "example.com"
// The account name
const val ACCOUNT = "placeholderaccount"
...
class MainActivity : FragmentActivity() {

    // Instance fields
    private lateinit var mAccount: Account
    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
       ...
        // Create the placeholder account
        mAccount = createSyncAccount()
       ...
    }
    ...
    /**
     * Create a new placeholder account for the sync adapter
     */
    private fun createSyncAccount(): Account {
        val accountManager = getSystemService(Context.ACCOUNT_SERVICE) as AccountManager
        return Account(ACCOUNT, ACCOUNT_TYPE).also { newAccount ->
            /*
             * Add the account and account type, no password or user data
             * If successful, return the Account object, otherwise report an error.
             */
            if (accountManager.addAccountExplicitly(newAccount, null, null)) {
                /*
                 * If you don't set android:syncable="true" in
                 * in your <provider> element in the manifest,
                 * then call context.setIsSyncable(account, AUTHORITY, 1)
                 * here.
                 */
            } else {
                /*
                 * The account exists or some other error occurred. Log this, report it,
                 * or handle it internally.
                 */
            }
        }
    }
    ...
}

Java

public class MainActivity extends FragmentActivity {
    ...
    ...
    // Constants
    // The authority for the sync adapter's content provider
    public static final String AUTHORITY = "com.example.android.datasync.provider";
    // An account type, in the form of a domain name
    public static final String ACCOUNT_TYPE = "example.com";
    // The account name
    public static final String ACCOUNT = "placeholderaccount";
    // Instance fields
    Account mAccount;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // Create the placeholder account
        mAccount = CreateSyncAccount(this);
        ...
    }
    ...
    /**
     * Create a new placeholder account for the sync adapter
     *
     * @param context The application context
     */
    public static Account CreateSyncAccount(Context context) {
        // Create the account type and default account
        Account newAccount = new Account(
                ACCOUNT, ACCOUNT_TYPE);
        // Get an instance of the Android account manager
        AccountManager accountManager =
                (AccountManager) context.getSystemService(
                        ACCOUNT_SERVICE);
        /*
         * Add the account and account type, no password or user data
         * If successful, return the Account object, otherwise report an error.
         */
        if (accountManager.addAccountExplicitly(newAccount, null, null)) {
            /*
             * If you don't set android:syncable="true" in
             * in your <provider> element in the manifest,
             * then call context.setIsSyncable(account, AUTHORITY, 1)
             * here.
             */
        } else {
            /*
             * The account exists or some other error occurred. Log this, report it,
             * or handle it internally.
             */
        }
    }
    ...
}

Thêm tệp siêu dữ liệu của bộ điều hợp đồng bộ hoá

Để cắm thành phần của bộ điều hợp đồng bộ hoá vào khung này, bạn cần cung cấp khung bằng siêu dữ liệu mô tả thành phần và cung cấp thêm cờ. Siêu dữ liệu sẽ chỉ định loại tài khoản bạn đã tạo cho bộ điều hợp đồng bộ hoá, khai báo thẩm quyền của trình cung cấp nội dung liên kết với ứng dụng của bạn, kiểm soát một phần giao diện người dùng hệ thống liên quan đến bộ điều hợp đồng bộ hoá, và khai báo các cờ liên quan đến việc đồng bộ hoá khác. Khai báo siêu dữ liệu này trong một tệp XML đặc biệt được lưu trữ trong thư mục /res/xml/ trong dự án ứng dụng. Bạn có thể đặt bất kỳ tên nào cho tệp, mặc dù thư viện này thường được gọi là syncadapter.xml.

Tệp XML này chứa một phần tử XML <sync-adapter> có các thuộc tính sau:

android:contentAuthority
Đơn vị quản lý URI cho trình cung cấp nội dung của bạn. Nếu bạn đã tạo một nhà cung cấp nội dung tạm thời cho ứng dụng của bạn trong bài học trước Tạo trình cung cấp nội dung tạm thời, hãy sử dụng giá trị mà bạn chỉ định cho thẻ phân bổ android:authorities trong phần tử <provider> mà bạn đã thêm vào tệp kê khai ứng dụng. Thuộc tính này là được mô tả chi tiết hơn trong phần này Khai báo Nhà cung cấp trong tệp kê khai.
Nếu bạn đang chuyển dữ liệu từ một nhà cung cấp nội dung sang một máy chủ bằng bộ điều hợp đồng bộ hoá, thao tác này phải giống với đơn vị quản lý URI nội dung mà bạn đang sử dụng cho dữ liệu đó. Giá trị này cũng là một trong các cơ quan quản lý mà bạn chỉ định trong android:authorities của phần tử <provider> khai báo trình cung cấp trong tệp kê khai ứng dụng.
android:accountType
Loại tài khoản theo yêu cầu của khung bộ điều hợp đồng bộ hoá. Giá trị phải giống nhau làm giá trị loại tài khoản mà bạn cung cấp khi tạo tệp siêu dữ liệu về trình xác thực, như được mô tả trong phần Thêm tệp siêu dữ liệu Authenticator. Đây cũng là giá trị bạn đã chỉ định cho hằng số ACCOUNT_TYPE trong đoạn mã ở phần này Thêm tài khoản mà khung yêu cầu.
Thuộc tính cài đặt
android:userVisible
Đặt chế độ hiển thị cho loại tài khoản của bộ điều hợp đồng bộ hoá. Theo mặc định, biểu tượng tài khoản và nhãn liên kết với loại tài khoản hiển thị trong Phần Accounts (Tài khoản) trong ứng dụng Settings (Cài đặt) của hệ thống, vì vậy bạn nên đồng bộ hoá bộ chuyển đổi bị ẩn trừ phi bạn có loại tài khoản hoặc miền dễ dàng liên kết với ứng dụng của bạn. Nếu ẩn loại tài khoản của mình, bạn vẫn có thể cho phép người dùng kiểm soát bộ điều hợp đồng bộ hoá bằng giao diện người dùng ở một trong các hoạt động của ứng dụng.
android:supportsUploading
Cho phép bạn tải dữ liệu lên đám mây. Đặt giá trị này thành false nếu chỉ ứng dụng của bạn tải dữ liệu xuống.
android:allowParallelSyncs
Cho phép nhiều phiên bản của thành phần bộ điều hợp đồng bộ hoá chạy cùng lúc. Dùng lựa chọn này nếu ứng dụng của bạn hỗ trợ nhiều tài khoản người dùng và bạn muốn cho phép nhiều tài khoản người dùng người dùng để chuyển dữ liệu song song. Cờ này không có hiệu lực nếu bạn không bao giờ chạy nhiều lần chuyển dữ liệu.
android:isAlwaysSyncable
Cho khung bộ điều hợp đồng bộ hoá biết rằng bộ điều hợp đồng bộ hoá có thể chạy bộ điều hợp đồng bộ hoá của bạn bất cứ lúc nào mà bạn đã chỉ định. Nếu bạn muốn kiểm soát thời điểm đồng bộ hoá theo phương thức lập trình bộ chuyển đổi có thể chạy, đặt cờ này thành false, sau đó gọi requestSync() để chạy bộ điều hợp đồng bộ hoá. Để tìm hiểu thêm về cách chạy bộ điều hợp đồng bộ hoá, hãy xem bài học Chạy Bộ điều hợp đồng bộ hoá

Ví dụ sau đây minh hoạ XML cho bộ điều hợp đồng bộ hoá sử dụng một tài khoản giữ chỗ và chỉ tải xuống.

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:contentAuthority="com.example.android.datasync.provider"
        android:accountType="com.android.example.datasync"
        android:userVisible="false"
        android:supportsUploading="false"
        android:allowParallelSyncs="false"
        android:isAlwaysSyncable="true"/>

Khai báo bộ điều hợp đồng bộ hoá trong tệp kê khai

Sau khi thêm thành phần bộ điều hợp đồng bộ hoá vào ứng dụng, bạn phải yêu cầu quyền liên quan đến việc sử dụng thành phần này và bạn phải khai báo giới hạn Service mà bạn đã thêm.

Vì thành phần bộ điều hợp đồng bộ hoá chạy mã chuyển dữ liệu giữa mạng và , bạn cần yêu cầu quyền truy cập Internet. Ngoài ra, ứng dụng của bạn cần để yêu cầu quyền đọc và ghi cài đặt bộ điều hợp đồng bộ hoá để bạn có thể kiểm soát quá trình đồng bộ hoá bộ chuyển đổi theo cách lập trình từ các thành phần khác trong ứng dụng. Bạn cũng cần yêu cầu quyền đặc biệt cho phép ứng dụng của bạn sử dụng thành phần trình xác thực mà bạn đã tạo trong bài học Tạo trình xác thực mã giả lập.

Để yêu cầu cấp các quyền này, hãy thêm nội dung sau vào tệp kê khai ứng dụng dưới dạng các phần tử con của <manifest>:

android.permission.INTERNET
Cho phép mã bộ điều hợp đồng bộ hoá truy cập Internet để có thể tải xuống hoặc tải dữ liệu lên từ thiết bị đến máy chủ. Bạn không cần thêm lại quyền này nếu bạn trước đó bạn yêu cầu.
android.permission.READ_SYNC_SETTINGS
Cho phép ứng dụng của bạn đọc cài đặt bộ điều hợp đồng bộ hóa hiện tại. Ví dụ: bạn cần mã này để gọi getIsSyncable().
android.permission.WRITE_SYNC_SETTINGS
Cho phép ứng dụng của bạn kiểm soát các chế độ cài đặt bộ điều hợp đồng bộ hoá. Bạn cần có quyền này để thiết lập quy trình chạy bộ điều hợp đồng bộ hoá định kỳ bằng addPeriodicSync(). Bạn không cần quyền này để gọi requestSync(). Để tìm hiểu thêm về chạy bộ điều hợp đồng bộ hoá, xem Chạy bộ điều hợp đồng bộ hoá.

Đoạn mã sau đây cho biết cách thêm quyền:

<manifest>
...
    <uses-permission
            android:name="android.permission.INTERNET"/>
    <uses-permission
            android:name="android.permission.READ_SYNC_SETTINGS"/>
    <uses-permission
            android:name="android.permission.WRITE_SYNC_SETTINGS"/>
    <uses-permission
            android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
...
</manifest>

Cuối cùng, để khai báo giới hạn Service mà khung sử dụng để tương tác với bộ điều hợp đồng bộ hoá, hãy thêm XML sau đây vào tệp kê khai ứng dụng dưới dạng phần tử con trong số <application>:

        <service
                android:name="com.example.android.datasync.SyncService"
                android:exported="false"
                android:process=":sync">
            <intent-filter>
                <action android:name="android.content.SyncAdapter"/>
            </intent-filter>
            <meta-data android:name="android.content.SyncAdapter"
                    android:resource="@xml/syncadapter" />
        </service>

Chiến lược phát hành đĩa đơn <intent-filter> thiết lập một bộ lọc được kích hoạt bởi thao tác theo ý định android.content.SyncAdapter, do hệ thống gửi để chạy bộ điều hợp đồng bộ hoá. Khi bộ lọc được kích hoạt, hệ thống sẽ bắt đầu dịch vụ ràng buộc mà bạn đã tạo, trong ví dụ này là SyncService. Thuộc tính android:exported="false" chỉ cho phép ứng dụng của bạn và hệ thống truy cập vào Service Thuộc tính android:process=":sync" yêu cầu hệ thống chạy Service trong quy trình dùng chung toàn cầu có tên sync. Nếu bạn có nhiều bộ điều hợp đồng bộ hoá trong ứng dụng, chúng có thể dùng chung quy trình này. giúp giảm chi phí.

Chiến lược phát hành đĩa đơn <meta-data> cung cấp tên của tệp XML siêu dữ liệu của bộ điều hợp đồng bộ hoá mà bạn đã tạo trước đây. Chiến lược phát hành đĩa đơn android:name cho biết siêu dữ liệu này dành cho khung bộ điều hợp đồng bộ hoá. Chiến lược phát hành đĩa đơn android:resource chỉ định tên của tệp siêu dữ liệu.

Bây giờ, bạn có tất cả thành phần cho bộ điều hợp đồng bộ hoá. Bài học tiếp theo sẽ hướng dẫn bạn cách yêu cầu khung bộ điều hợp đồng bộ hoá chạy bộ điều hợp đồng bộ hoá, để phản hồi một sự kiện hoặc trên lịch trình đều đặn.