เพิ่มประสิทธิภาพปริมาณการใช้อินเทอร์เน็ตของเครือข่าย

การใช้แผนข้อมูลเครือข่ายมือถือตลอดอายุการใช้งานสมาร์ทโฟนนั้นสามารถทำได้ง่ายๆ มีราคาสูงกว่าราคาของอุปกรณ์ ใน Android 7.0 (API ระดับ 24) และ สูงขึ้น ผู้ใช้จึงเปิดใช้การประหยัดอินเทอร์เน็ตได้ในอุปกรณ์ทั้งเครื่องเพื่อ เพิ่มประสิทธิภาพปริมาณการใช้อินเทอร์เน็ตของอุปกรณ์และลดปริมาณการใช้อินเทอร์เน็ต ความสามารถนี้ มีประโยชน์อย่างยิ่งเมื่อโรมมิ่งเมื่อใกล้สิ้นสุดรอบการเรียกเก็บเงิน หรือสำหรับแพ็กเกจอินเทอร์เน็ตแบบชำระเงินล่วงหน้าขนาดเล็ก

เมื่อผู้ใช้เปิดใช้โปรแกรมประหยัดอินเทอร์เน็ตในการตั้งค่าและอุปกรณ์ บนเครือข่ายแบบจำกัดปริมาณ ระบบจะบล็อกการใช้อินเทอร์เน็ตที่ใช้งานอยู่เบื้องหลังและสัญญาณ ให้ใช้อินเทอร์เน็ตน้อยลงในเบื้องหน้าเมื่อเป็นไปได้ ผู้ใช้สามารถ ทำให้บางแอปสามารถใช้ปริมาณอินเทอร์เน็ตที่วัดเมื่ออยู่เบื้องหลัง แม้ว่าการใช้อินเทอร์เน็ต โหมดประหยัดเปิดอยู่

Android 7.0 (API ระดับ 24) ได้ขยาย ConnectivityManager API เพื่อให้แอปมีวิธีเรียกข้อมูลของผู้ใช้ ค่ากำหนดโหมดประหยัดและค่ากำหนดการตรวจสอบ การเปลี่ยนแปลง วิธีนี้ถือเป็นแนวทางปฏิบัติที่ดีสำหรับแอปในการตรวจสอบว่า ผู้ใช้ได้เปิดใช้การประหยัดอินเทอร์เน็ตและพยายามจำกัดการทำงานเบื้องหน้าและ อินเทอร์เน็ตที่ใช้งานอยู่เบื้องหลัง

ตรวจสอบค่ากำหนดการประหยัดอินเทอร์เน็ต

ใน Android 7.0 (API ระดับ 24) ขึ้นไป แอปสามารถใช้ API ของ ConnectivityManager เพื่อกำหนดข้อจำกัดการใช้ข้อมูลที่กำลังจะมีผล getRestrictBackgroundStatus() จะแสดงผลค่าใดค่าหนึ่งต่อไปนี้

RESTRICT_BACKGROUND_STATUS_DISABLED
การประหยัดอินเทอร์เน็ตปิดอยู่
RESTRICT_BACKGROUND_STATUS_ENABLED
ผู้ใช้ได้เปิดใช้การประหยัดอินเทอร์เน็ตสำหรับแอปนี้ แอปควรพยายามจำกัดข้อมูล ในเบื้องหน้าและจัดการกับข้อจำกัดเกี่ยวกับพื้นหลังได้อย่างสวยงาม ปริมาณการใช้อินเทอร์เน็ต
RESTRICT_BACKGROUND_STATUS_WHITELISTED
ผู้ใช้เปิดใช้การประหยัดอินเทอร์เน็ต แต่แอปได้รับอนุญาตให้ข้ามได้ แอปยังคงพยายามจำกัดการใช้ข้อมูลเบื้องหน้าและเบื้องหลัง

จำกัดปริมาณการใช้อินเทอร์เน็ตเมื่ออุปกรณ์เชื่อมต่อกับเครือข่ายแบบจำกัดปริมาณ แม้ว่าการประหยัดอินเทอร์เน็ตจะ หรือแอปจะได้รับอนุญาตให้ข้าม โค้ดตัวอย่างต่อไปนี้ใช้ ConnectivityManager.isActiveNetworkMetered() และConnectivityManager.getRestrictBackgroundStatus()เพื่อกำหนดปริมาณข้อมูลที่ แอปควรใช้

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.
}

หมายเหตุ: ลักษณะการทำงานนี้จะแตกต่างออกไปใน Android TV แทนที่จะเป็น ที่บล็อกการใช้งานในเบื้องหลัง Android TV จะจำกัดการทำงานแค่นั้น เมื่ออยู่ใน สำหรับเบื้องหน้า แอปพลิเคชันจะจำกัดอยู่ที่ 800 Kbps และเมื่อทำงานในเบื้องหลัง จำกัดแอปพลิเคชันไว้ที่ 10 Kbps ใช้ ConnectivityManager.isActiveNetworkMetered()เพื่อดูว่าควรเมื่อใด จำกัดปริมาณการใช้อินเทอร์เน็ตบนทีวี

ขอสิทธิ์การจำกัดข้อมูล

หากแอปจำเป็นต้องใช้อินเทอร์เน็ตในเบื้องหลัง แอปก็ขอข้อมูลได้ สิทธิ์การจำกัดโดยการส่ง Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS Intent ที่มี URI ของชื่อแพ็กเกจของแอป ตัวอย่างเช่น package:MY_APP_ID

การส่ง Intent และ URI จะเป็นการเปิดแอปการตั้งค่า และ แสดงการตั้งค่าปริมาณการใช้อินเทอร์เน็ตสำหรับแอปของคุณ จากนั้นผู้ใช้ก็จะตัดสินใจได้ว่า เพื่อเปิดใช้ข้อมูลแบ็กกราวด์สำหรับแอปของคุณ ก่อนที่คุณจะส่ง Intent แนวทางปฏิบัติที่ดีคือ ถามผู้ใช้ก่อนว่าต้องการเปิดตัว แอปการตั้งค่าเพื่อจุดประสงค์ในการเปิดใช้ข้อมูลแบ็กกราวด์

ตรวจสอบการเปลี่ยนแปลงของค่ากำหนดการประหยัดอินเทอร์เน็ต

แอปจะตรวจสอบการเปลี่ยนแปลงค่ากำหนดการประหยัดอินเทอร์เน็ตได้โดยการสร้าง BroadcastReceiver ถึง ฟัง ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED และแบบไดนามิก การลงทะเบียนตัวรับกับ Context.registerReceiver() เมื่อได้รับการออกอากาศนี้ แอปควรตรวจสอบว่าโปรแกรมประหยัดอินเทอร์เน็ตใหม่ ค่ากำหนดมีผลต่อสิทธิ์โดยการเรียกใช้ ConnectivityManager.getRestrictBackgroundStatus()

หมายเหตุ: ระบบจะส่งการประกาศนี้ไปยังแอปที่ลงทะเบียนแบบไดนามิกสำหรับ ด้วย Context.registerReceiver() แอปที่ลงทะเบียนเพื่อรับการแพร่สัญญาณนี้ในไฟล์ Manifest จะไม่ได้รับการแจ้งเตือนดังกล่าว

ทดสอบด้วยคำสั่งของ Android Debug Bridge

Android Debug Bridge (ADB) ระบุคำสั่ง 2-3 รายการที่คุณใช้ทดสอบแอปในโปรแกรมประหยัดอินเทอร์เน็ตได้ คุณสามารถตรวจสอบและกำหนดค่าเครือข่าย หรือตั้งค่าเครือข่ายไร้สายเป็นแบบจำกัดปริมาณ เพื่อทดสอบแอปของคุณโดยไม่มีการวัดปริมาณอินเทอร์เน็ต เครือข่าย

$ adb shell dumpsys netpolicy
สร้างรายงานที่รวมเครือข่ายพื้นหลังทั่วโลกในปัจจุบัน การตั้งค่าการจำกัด, UID แพ็กเกจที่ได้รับอนุญาตให้ข้ามโปรแกรมประหยัดอินเทอร์เน็ตในปัจจุบัน และ สิทธิ์เครือข่ายของแพ็กเกจอื่นๆ ที่รู้จัก
$ adb shell cmd netpolicy
แสดงรายการคำสั่ง Network Policy Manager (netpolicy) ทั้งหมด
$ adb shell cmd netpolicy set restrict-background <boolean>
เปิดหรือปิดใช้โหมดประหยัดอินเทอร์เน็ตเมื่อส่ง true หรือ false ตามลำดับ
$ adb shell cmd netpolicy add restrict-background-whitelist <UID>
เพิ่ม UID แพ็กเกจที่ระบุลงในรายการที่อนุญาต (whitelist) เพื่ออนุญาตในเบื้องหลัง ปริมาณการใช้อินเทอร์เน็ตแบบจำกัดปริมาณ
$ adb shell cmd netpolicy remove restrict-background-whitelist <UID>
นำ UID แพ็กเกจที่ระบุออกจากรายการที่อนุญาต (whitelist) เพื่อบล็อก ปริมาณการใช้อินเทอร์เน็ตที่มีการวัดปริมาณเบื้องหลังขณะเปิดใช้การประหยัดอินเทอร์เน็ต
$ adb shell cmd netpolicy list wifi-networks
แสดงเครือข่าย Wi-Fi ทั้งหมด โดยแสดงว่าเครือข่ายนั้นมีการวัดปริมาณอินเทอร์เน็ตหรือไม่
$ adb shell cmd netpolicy set metered-network <WIFI_SSID> true
ตั้งค่า Wi-Fi โดยมี SSID ที่ระบุเป็น "มีการวัดปริมาณอินเทอร์เน็ต" ซึ่งจะช่วยให้คุณจำลอง เครือข่ายแบบจำกัดปริมาณบนเครือข่ายที่ไม่จำกัดปริมาณอินเทอร์เน็ต