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

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

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

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

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

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

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

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

with(getSystemService(ConnectivityManager::class.java)) {
    // 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.
    }
}

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

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

หากแอปของคุณจำเป็นต้องใช้ข้อมูลในเบื้องหลัง แอปสามารถขอสิทธิ์ที่จำกัดข้อมูลได้โดยส่ง Intent Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS ที่มี 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) มีคำสั่งบางอย่างที่คุณใช้ทดสอบแอปในสภาวะการประหยัดอินเทอร์เน็ตได้ คุณสามารถตรวจสอบและกำหนดค่าสิทธิ์เครือข่าย หรือตั้งค่าเครือข่ายไร้สายเป็นแบบวัดปริมาณเพื่อทดสอบแอปในเครือข่ายที่ไม่มีการวัดปริมาณอินเทอร์เน็ต

$ 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 ที่ระบุเป็นแบบวัดปริมาณอินเทอร์เน็ต ซึ่งช่วยให้คุณจำลองเครือข่ายแบบวัดปริมาณอินเทอร์เน็ตในเครือข่ายแบบไม่มีการวัดปริมาณอินเทอร์เน็ตได้