Tối ưu hoá việc sử dụng dữ liệu mạng

Trong suốt vòng đời của một chiếc điện thoại thông minh, chi phí của gói dữ liệu di động có thể dễ dàng vượt quá chi phí mua chính thiết bị. Trên Android 7.0 (API cấp 24) trở lên, người dùng có thể bật Trình tiết kiệm dữ liệu trên toàn thiết bị để tối ưu hoá mức sử dụng dữ liệu của thiết bị và sử dụng ít dữ liệu hơn. Khả năng này đặc biệt hữu ích khi chuyển vùng, khi ở gần cuối chu kỳ thanh toán hoặc cho một gói dữ liệu trả trước nhỏ.

Khi người dùng bật Trình tiết kiệm dữ liệu trong phần Cài đặt và thiết bị đang dùng mạng có đo lượng dữ liệu, hệ thống sẽ chặn hoạt động sử dụng dữ liệu nền và báo hiệu cho ứng dụng sử dụng ít dữ liệu hơn ở nền trước bất cứ khi nào có thể. Người dùng có thể cho phép các ứng dụng cụ thể sử dụng dữ liệu có đo lượng dữ liệu nền ngay cả khi bạn đã bật Trình tiết kiệm dữ liệu.

Android 7.0 (API cấp 24) mở rộng API ConnectivityManager để cung cấp cho các ứng dụng cách truy xuất lựa chọn ưu tiên về Trình tiết kiệm dữ liệu của người dùngtheo dõi các thay đổi về lựa chọn ưu tiên. Các ứng dụng nên kiểm tra xem người dùng đã bật Trình tiết kiệm dữ liệu hay chưa, đồng thời cố gắng giới hạn mức sử dụng dữ liệu nền và nền trước.

Kiểm tra lựa chọn ưu tiên về trình tiết kiệm dữ liệu

Trên Android 7.0 (API cấp 24) trở lên, các ứng dụng có thể dùng API ConnectivityManager để xác định những quy định hạn chế đối với mức sử dụng dữ liệu đang được áp dụng. Phương thức getRestrictBackgroundStatus() trả về một trong các giá trị sau:

RESTRICT_BACKGROUND_STATUS_DISABLED
Trình tiết kiệm dữ liệu đã tắt.
RESTRICT_BACKGROUND_STATUS_ENABLED
Người dùng đã bật Trình tiết kiệm dữ liệu cho ứng dụng này. Các ứng dụng nên cố gắng hạn chế mức sử dụng dữ liệu ở nền trước và xử lý linh hoạt các hạn chế đối với việc sử dụng dữ liệu nền.
RESTRICT_BACKGROUND_STATUS_WHITELISTED
Người dùng đã bật Trình tiết kiệm dữ liệu nhưng ứng dụng này được phép bỏ qua. Các ứng dụng vẫn cần cố gắng giới hạn mức sử dụng dữ liệu nền và nền trước.

Giới hạn mức sử dụng dữ liệu bất cứ khi nào thiết bị được kết nối với mạng có đo lượng dữ liệu, ngay cả khi Trình tiết kiệm dữ liệu đang tắt hoặc ứng dụng được phép bỏ qua. Mã mẫu sau đây sử dụng ConnectivityManager.isActiveNetworkMetered()ConnectivityManager.getRestrictBackgroundStatus() để xác định lượng dữ liệu mà ứng dụng sẽ sử dụng:

Kotlin

(getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager).apply {
    // Checks if the device is on a metered network
    if (isActiveNetworkMetered) {
        // Checks user’s Data Saver settings.
        when (restrictBackgroundStatus) {
            RESTRICT_BACKGROUND_STATUS_ENABLED -> {
                // Background data usage is blocked for this app. Wherever possible,
                // the app should also use less data in the foreground.
            }
            RESTRICT_BACKGROUND_STATUS_WHITELISTED -> {
                // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
                // the app should use less data in the foreground and background.
            }
            RESTRICT_BACKGROUND_STATUS_DISABLED -> {
                // Data Saver is disabled. Since the device is connected to a
                // metered network, the app should use less data wherever possible.
            }
        }
    } else {
        // The device is not on a metered network.
        // Use data as required to perform syncs, downloads, and updates.
    }
}

Java

ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
  // Checks user’s Data Saver settings.
  switch (connMgr.getRestrictBackgroundStatus()) {
    case RESTRICT_BACKGROUND_STATUS_ENABLED:
    // Background data usage is blocked for this app. Wherever possible,
    // the app should also use less data in the foreground.

    case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
    // The app is allowed to bypass Data Saver. Nevertheless, wherever possible,
    // the app should use less data in the foreground and background.

    case RESTRICT_BACKGROUND_STATUS_DISABLED:
    // Data Saver is disabled. Since the device is connected to a
    // metered network, the app should use less data wherever possible.
  }
} else {
  // The device is not on a metered network.
  // Use data as required to perform syncs, downloads, and updates.
}

Lưu ý: Hành vi này sẽ khác trên Android TV. Thay vì chặn hoạt động sử dụng trong nền, Android TV chỉ điều tiết mức sử dụng. Khi ở nền trước, các ứng dụng được giới hạn ở mức 800 Kb/giây và khi ở chế độ nền, ứng dụng chỉ giới hạn ở 10 Kb/giây. Sử dụng ConnectivityManager.isActiveNetworkMetered() để phát hiện thời điểm cần giới hạn mức sử dụng dữ liệu trên TV.

Yêu cầu quyền hạn chế dữ liệu

Nếu cần sử dụng dữ liệu trong nền, ứng dụng của bạn có thể yêu cầu các quyền hạn chế dữ liệu bằng cách gửi ý định Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS có chứa URI của tên gói ứng dụng của bạn, ví dụ: package:MY_APP_ID.

Việc gửi ý định và URI sẽ mở ứng dụng Cài đặt và hiển thị các chế độ cài đặt sử dụng dữ liệu cho ứng dụng của bạn. Sau đó, người dùng có thể quyết định xem có bật dữ liệu nền cho ứng dụng của bạn hay không. Trước khi gửi ý định này, bạn nên hỏi người dùng xem họ có muốn chạy ứng dụng Cài đặt với mục đích bật mức sử dụng dữ liệu nền hay không.

Theo dõi các thay đổi đối với lựa chọn ưu tiên về trình tiết kiệm dữ liệu

Các ứng dụng có thể theo dõi thay đổi đối với lựa chọn ưu tiên về Trình tiết kiệm dữ liệu bằng cách tạo BroadcastReceiver để nghe (listen) ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED và tự động đăng ký trình nhận với Context.registerReceiver(). Khi một ứng dụng nhận được thông báo này, ứng dụng sẽ kiểm tra xem các lựa chọn ưu tiên mới về Trình tiết kiệm dữ liệu có ảnh hưởng đến các quyền của ứng dụng đó hay không bằng cách gọi ConnectivityManager.getRestrictBackgroundStatus().

Lưu ý: Hệ thống chỉ gửi thông báo này đến những ứng dụng đăng ký nhận thông báo theo phương thức động bằng Context.registerReceiver(). Các ứng dụng đăng ký nhận thông báo này trong tệp kê khai sẽ không nhận được thông báo.

Kiểm thử bằng lệnh trên Cầu gỡ lỗi Android

Cầu gỡ lỗi Android (ADB) cung cấp một số lệnh mà bạn có thể sử dụng để kiểm thử ứng dụng của mình trong điều kiện của Trình tiết kiệm dữ liệu. Bạn có thể kiểm tra và định cấu hình các quyền truy cập mạng hoặc đặt mạng không dây là có đo lượng dữ liệu để kiểm thử ứng dụng của bạn trên các mạng không đo lượng dữ liệu.

$ adb shell dumpsys netpolicy
Tạo báo cáo bao gồm chế độ cài đặt hạn chế mạng nền toàn cục hiện tại, UID gói hiện đang được phép bỏ qua Trình tiết kiệm dữ liệu và quyền truy cập mạng của các gói khác đã biết.
$ adb shell cmd netpolicy
Hiển thị danh sách đầy đủ các lệnh của Trình quản lý chính sách mạng (netpolicy).
$ adb shell cmd netpolicy set restrict-background <boolean>
Bật hoặc tắt chế độ Trình tiết kiệm dữ liệu khi truyền true hoặc false tương ứng.
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
Thêm UID gói đã chỉ định vào danh sách cho phép (whitelist) để cho phép sử dụng dữ liệu có đo lượng dữ liệu nền.
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
Xoá UID gói đã chỉ định khỏi danh sách cho phép whitelist để chặn hoạt động sử dụng dữ liệu có đo lượng dữ liệu nền khi bật Trình tiết kiệm dữ liệu.
$ adb shell cmd netpolicy list wifi-networks
Liệt kê tất cả các mạng Wi-Fi, cho biết các mạng đó có đo lượng dữ liệu hay không.
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
Đặt wifi có SSID được chỉ định là có đo lượng dữ liệu, cho phép bạn mô phỏng mạng có đo lượng dữ liệu trên mạng không đo lượng dữ liệu.