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
AbstractThreadedSyncAdapter
và 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 trongandroid: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ọirequestSync()
để 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ọirequestSync()
. Để 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.