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