อ่านสถานะเครือข่าย

Android ช่วยให้แอปทราบถึงการเปลี่ยนแปลงแบบไดนามิกในการเชื่อมต่อ ใช้คลาสต่อไปนี้เพื่อติดตามและตอบสนองต่อการเปลี่ยนแปลงการเชื่อมต่อ

  • ConnectivityManager จะแจ้งให้แอปทราบเกี่ยวกับสถานะการเชื่อมต่อในระบบ
  • คลาส Network แสดงถึงเครือข่ายหนึ่งที่อุปกรณ์เชื่อมต่ออยู่ คุณสามารถใช้ออบเจ็กต์ Network เป็นคีย์เพื่อรวบรวมข้อมูลเกี่ยวกับเครือข่ายด้วย ConnectivityManager หรือเพื่อเชื่อมโยงซ็อกเก็ตบนเครือข่ายได้ เมื่อเครือข่ายตัดการเชื่อมต่อ ออบเจ็กต์ Network จะหยุดทำงาน แม้ว่าอุปกรณ์จะเชื่อมต่อกับอุปกรณ์เดิมอีกครั้งในภายหลัง ออบเจ็กต์ Network ใหม่จะแสดงเครือข่ายใหม่
  • ออบเจ็กต์ LinkProperties มีข้อมูลเกี่ยวกับลิงก์สำหรับเครือข่าย เช่น รายการเซิร์ฟเวอร์ DNS, ที่อยู่ IP ในเครื่อง และเส้นทางเครือข่ายที่ติดตั้งสำหรับเครือข่าย
  • ออบเจ็กต์ NetworkCapabilities มีข้อมูลเกี่ยวกับพร็อพเพอร์ตี้ของเครือข่าย เช่น การรับส่งข้อมูล (Wi-Fi, อุปกรณ์เคลื่อนที่, บลูทูธ) และความสามารถของเครือข่าย ตัวอย่างเช่น คุณสามารถค้นหาออบเจ็กต์เพื่อระบุว่าเครือข่ายสามารถส่ง MMS ได้หรือไม่ อยู่หลังแคพทีฟพอร์ทัลหรือไม่ หรือมีการวัดปริมาณหรือไม่

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

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

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

การใช้ NetworkCallback และวิธีอื่นๆ ในการค้นหาสถานะการเชื่อมต่อของอุปกรณ์ไม่จำเป็นต้องใช้สิทธิ์ใดๆ เป็นพิเศษ อย่างไรก็ตาม เครือข่ายบางเครือข่ายขึ้นอยู่กับสิทธิ์ที่เฉพาะเจาะจง ตัวอย่างเช่น อาจมีเครือข่ายที่ถูกจำกัดซึ่งแอปไม่สามารถใช้งานได้ การเชื่อมโยงกับเครือข่ายเบื้องหลังต้องใช้สิทธิ์ CHANGE_NETWORK_STATE และการเรียกใช้บางรายการอาจต้องใช้สิทธิ์เฉพาะจึงจะทำงานได้ โปรดดูรายละเอียดในเอกสารประกอบเฉพาะสำหรับการเรียกแต่ละครั้ง

ดูสถานะปัจจุบัน

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

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java)

Java

ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class);

จากนั้นใช้อินสแตนซ์นี้เพื่อรับการอ้างอิงไปยังเครือข่ายเริ่มต้นปัจจุบันสำหรับแอปของคุณ

Kotlin

val currentNetwork = connectivityManager.getActiveNetwork()

Java

Network currentNetwork = connectivityManager.getActiveNetwork();

เมื่อมีการอ้างอิงถึงเครือข่าย แอปของคุณจะขอข้อมูลเกี่ยวกับเครือข่ายนั้นได้ ดังนี้

Kotlin

val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
val linkProperties = connectivityManager.getLinkProperties(currentNetwork)

Java

NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(currentNetwork);
LinkProperties linkProperties = connectivityManager.getLinkProperties(currentNetwork);

หากต้องการฟังก์ชันการทำงานที่มีประโยชน์มากขึ้น ให้ลงทะเบียน NetworkCallback ดูข้อมูลเพิ่มเติมเกี่ยวกับการลงทะเบียน Callback ของเครือข่ายได้ที่ฟังเหตุการณ์เครือข่าย

NetworkCapabilities และ LinkProperties

ออบเจ็กต์ NetworkCapabilities และ LinkProperties จะให้ข้อมูลเกี่ยวกับแอตทริบิวต์ทั้งหมดที่ระบบทราบเกี่ยวกับเครือข่าย

ออบเจ็กต์ LinkProperties จะทราบเกี่ยวกับเส้นทาง ที่อยู่ลิงก์ ชื่ออินเทอร์เฟซ ข้อมูลพร็อกซี (หากมี) และเซิร์ฟเวอร์ DNS เรียกใช้เมธอดที่เกี่ยวข้องในออบเจ็กต์ LinkProperties เพื่อดึงข้อมูลที่ต้องการ

ออบเจ็กต์ NetworkCapabilities จะรวมข้อมูลเกี่ยวกับการรับส่งข้อมูลในเครือข่ายและความสามารถของเครือข่าย

การรับส่งข้อมูลคือการแยกข้อมูลนามธรรมของสื่อทางกายภาพที่เครือข่ายทำงานอยู่ ตัวอย่างทั่วไปของการรับส่งข้อมูล ได้แก่ อีเทอร์เน็ต, Wi-Fi และมือถือ VPN และ Wi-Fi แบบเพียร์ทูเพียร์ก็ใช้เป็นสื่อรับส่งได้เช่นกัน ใน Android เครือข่ายหนึ่งๆ สามารถมีการรับส่งข้อมูลหลายรายการพร้อมกันได้ ตัวอย่างเช่น VPN ที่ทำงานผ่านทั้งเครือข่าย Wi-Fi และเครือข่ายมือถือ VPN มีการรับส่งข้อมูลผ่าน Wi-Fi, อุปกรณ์เคลื่อนที่ และ VPN หากต้องการดูว่าเครือข่ายมีการรับส่งข้อมูลที่เฉพาะเจาะจงหรือไม่ ให้ใช้เมธอด NetworkCapabilities.hasTransport(int) กับค่าคงที่ NetworkCapabilities.TRANSPORT_* ค่าใดค่าหนึ่ง

ความสามารถจะอธิบายพร็อพเพอร์ตี้ของเครือข่าย ตัวอย่างความสามารถ ได้แก่ MMS, NOT_METERED และ INTERNET เครือข่ายที่มีความสามารถ MMS จะรับส่งข้อความ Multimedia Messaging Service ได้ ส่วนเครือข่ายที่ไม่มีความสามารถนี้จะทำไม่ได้ เครือข่ายที่มีความสามารถ NOT_METERED จะไม่เรียกเก็บเงินค่าอินเทอร์เน็ตจากผู้ใช้ แอปของคุณสามารถตรวจสอบความสามารถที่เหมาะสมได้โดยใช้เมธอด NetworkCapabilities.hasCapability(int) กับค่าคงที่ NetworkCapabilities.NET_CAPABILITY_* ค่าใดค่าหนึ่ง

ค่าคงที่ NET_CAPABILITY_* ที่มีประโยชน์มากที่สุด ได้แก่

  • NET_CAPABILITY_INTERNET: ระบุว่ามีการตั้งค่าเครือข่ายให้เข้าถึงอินเทอร์เน็ต ซึ่งเป็นเรื่องของการตั้งค่า ไม่ใช่ความสามารถในการเข้าถึงเซิร์ฟเวอร์สาธารณะจริงๆ ตัวอย่างเช่น คุณสามารถตั้งค่าเครือข่ายให้เข้าถึงอินเทอร์เน็ตได้ แต่ต้องอยู่ภายใต้แคพทีฟพอร์ทัล

    โดยปกติแล้ว เครือข่ายมือถือของผู้ให้บริการจะมีความสามารถ INTERNET ในขณะที่เครือข่าย Wi-Fi แบบ P2P ในพื้นที่มักจะไม่มี ดูการเชื่อมต่อจริงได้ที่ NET_CAPABILITY_VALIDATED

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

  • NET_CAPABILITY_NOT_VPN: ระบุว่าเครือข่ายไม่ใช่เครือข่ายส่วนตัวเสมือน

  • NET_CAPABILITY_VALIDATED: ระบุว่าเครือข่ายให้สิทธิ์เข้าถึงอินเทอร์เน็ตสาธารณะจริงเมื่อมีการตรวจสอบ เครือข่ายที่อยู่เบื้องหลังแคพทีฟพอร์ทัลหรือเครือข่ายที่ไม่มีการแปลงชื่อโดเมนจะไม่มีความสามารถนี้ นี่เป็นข้อมูลที่ใกล้เคียงที่สุดที่ระบบสามารถบอกได้เกี่ยวกับเครือข่ายที่ให้สิทธิ์เข้าถึงจริง แม้ว่าโดยหลักการแล้ว เครือข่ายที่ตรวจสอบแล้วจะยังคงอยู่ภายใต้การกรองตาม IP หรือสูญเสียการเชื่อมต่ออย่างกะทันหันเนื่องจากปัญหาต่างๆ เช่น สัญญาณไม่ดี

  • NET_CAPABILITY_CAPTIVE_PORTAL: ระบุว่าเครือข่ายมีแคพทีฟพอร์ทัลเมื่อตรวจสอบ

ยังมีฟังก์ชันอื่นๆ ที่แอปเฉพาะทางอาจสนใจ ดูข้อมูลเพิ่มเติมได้ที่คำจำกัดความของพารามิเตอร์ใน NetworkCapabilities.hasCapability(int)

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

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

ในทำนองเดียวกัน การรับส่งข้อมูลของเครือข่ายอาจเปลี่ยนแปลงแบบไดนามิก ตัวอย่างเช่น VPN สามารถกำหนดค่าใหม่เพื่อใช้เครือข่ายที่เร็วขึ้นซึ่งเพิ่งปรากฏขึ้น เช่น การเปลี่ยนจากเครือข่ายมือถือเป็น Wi-Fi สำหรับเครือข่ายพื้นฐาน ในกรณีนี้ เครือข่ายจะสูญเสียการรับส่งข้อมูล TRANSPORT_CELLULAR และได้รับการรับส่งข้อมูล TRANSPORT_WIFI ขณะที่ยังคงมีการรับส่งข้อมูล TRANSPORT_VPN อยู่

ฟังเหตุการณ์ในเครือข่าย

หากต้องการดูข้อมูลเกี่ยวกับเหตุการณ์ในเครือข่าย ให้ใช้คลาส NetworkCallback ร่วมกับ ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback) และ ConnectivityManager.registerNetworkCallback(NetworkCallback) ทั้ง 2 วิธีนี้มีจุดประสงค์ที่แตกต่างกัน

แอป Android ทั้งหมดมีเครือข่ายเริ่มต้นซึ่งกำหนดโดยระบบ โดยปกติแล้ว ระบบจะเลือกเครือข่ายที่ไม่มีการวัดปริมาณอินเทอร์เน็ตมากกว่าเครือข่ายที่มีการวัดปริมาณอินเทอร์เน็ต และเลือกเครือข่ายที่เร็วกว่าเครือข่ายที่ช้ากว่า

เมื่อแอปส่งคำขอเครือข่าย เช่น ด้วย HttpsURLConnection ระบบจะตอบสนองคำขอนี้โดยใช้เครือข่ายเริ่มต้น แอปสามารถส่งการเข้าชม ในเครือข่ายอื่นๆ ได้ด้วย ดูข้อมูลเพิ่มเติมได้ในส่วนเกี่ยวกับเครือข่ายเพิ่มเติม

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

เมื่อเครือข่ายใหม่กลายเป็นเครือข่ายเริ่มต้น การเชื่อมต่อใหม่ที่แอปเปิดจะใช้เครือข่ายนี้ หลังจากนั้น ระบบจะบังคับให้สิ้นสุดการเชื่อมต่อที่เหลือทั้งหมดในเครือข่ายเริ่มต้นก่อนหน้า หากแอปจำเป็นต้องทราบเมื่อเครือข่ายเริ่มต้นมีการเปลี่ยนแปลง แอปจะลงทะเบียน Callback ของเครือข่ายเริ่มต้นดังนี้

Kotlin

connectivityManager.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network : Network) {
        Log.e(TAG, "The default network is now: " + network)
    }

    override fun onLost(network : Network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network)
    }

    override fun onCapabilitiesChanged(network : Network, networkCapabilities : NetworkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities)
    }

    override fun onLinkPropertiesChanged(network : Network, linkProperties : LinkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties)
    }
})

Java

connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        Log.e(TAG, "The default network is now: " + network);
    }

    @Override
    public void onLost(Network network) {
        Log.e(TAG, "The application no longer has a default network. The last default network was " + network);
    }

    @Override
    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
        Log.e(TAG, "The default network changed capabilities: " + networkCapabilities);
    }

    @Override
    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
        Log.e(TAG, "The default network changed link properties: " + linkProperties);
    }
});

เมื่อเครือข่ายใหม่กลายเป็นเครือข่ายเริ่มต้น แอปจะได้รับการเรียกไปยัง onAvailable(Network) สำหรับเครือข่ายใหม่ ใช้ onCapabilitiesChanged(Network,NetworkCapabilities), onLinkPropertiesChanged(Network,LinkProperties) หรือทั้ง 2 อย่างเพื่อตอบสนองต่อการเปลี่ยนแปลงในการเชื่อมต่ออย่างเหมาะสม

สำหรับ Callback ที่ลงทะเบียนด้วย registerDefaultNetworkCallback(), onLost() หมายความว่าเครือข่ายสูญเสียสถานะการเป็นเครือข่ายเริ่มต้น เนื่องจากอาจมีการยกเลิกการเชื่อมต่อ

แม้ว่าคุณจะดูข้อมูลเกี่ยวกับการรับส่งข้อมูลที่เครือข่ายเริ่มต้นใช้อยู่ได้โดยการค้นหา NetworkCapabilities.hasTransport(int) แต่วิธีนี้เป็นพร็อกซีที่ไม่ดีสำหรับแบนด์วิดท์หรือการวัดปริมาณการใช้เครือข่าย แอปของคุณไม่สามารถถือว่า Wi-Fi ไม่มีการวัดปริมาณอินเทอร์เน็ตเสมอไป และให้แบนด์วิดท์ที่ดีกว่ามือถือเสมอ

แต่ให้ใช้ NetworkCapabilities.getLinkDownstreamBandwidthKbps() เพื่อวัดแบนด์วิดท์ และ NetworkCapabilites.hasCapability(int) พร้อมอาร์กิวเมนต์ NET_CAPABILITY_NOT_METERED เพื่อระบุการวัดปริมาณการใช้ข้อมูล ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับ NetworkCapabilities และ LinkProperties

โดยค่าเริ่มต้น ระบบจะเรียกใช้เมธอด Callback ในเทรดการเชื่อมต่อของแอป ซึ่งเป็นเทรดแยกต่างหากที่ ConnectivityManager ใช้ หากการติดตั้งใช้งาน Callback ต้องใช้เวลานานขึ้น ให้เรียกใช้ Callback ในเทรดผู้ปฏิบัติงานแยกต่างหากโดยใช้ตัวแปร ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler)

ยกเลิกการลงทะเบียน Callback เมื่อคุณไม่ต้องการใช้งานอีกต่อไปโดยเรียกใช้ ConnectivityManager.unregisterNetworkCallback(NetworkCallback) onPause() ของกิจกรรมหลักเป็นตำแหน่งที่เหมาะสำหรับการดำเนินการนี้ โดยเฉพาะอย่างยิ่งหากคุณลงทะเบียน Callback ใน onResume()

เครือข่ายเพิ่มเติม (กรณีการใช้งานขั้นสูง)

แม้ว่าเครือข่ายเริ่มต้นจะเป็นเครือข่ายเดียวที่เกี่ยวข้องสำหรับแอปส่วนใหญ่ แต่แอปบางแอปอาจสนใจเครือข่ายอื่นๆ ที่พร้อมใช้งาน หากต้องการทราบข้อมูลเกี่ยวกับแอปเหล่านี้ ให้สร้าง NetworkRequest ที่ตรงกับความต้องการของลูกค้า แล้วโทรหา ConnectivityManager.registerNetworkCallback(NetworkRequest, NetworkCallback)

กระบวนการนี้คล้ายกับการฟัง เครือข่ายเริ่มต้น อย่างไรก็ตาม แม้ว่าอาจมีเครือข่ายเริ่มต้นเพียงเครือข่ายเดียวที่ใช้กับแอป ณ เวลาใดเวลาหนึ่ง แต่เวอร์ชันนี้จะช่วยให้แอปของคุณเห็นเครือข่ายที่พร้อมใช้งานทั้งหมดพร้อมกัน ดังนั้นการเรียกใช้ onLost(Network) หมายความว่าเครือข่ายถูกตัดการเชื่อมต่ออย่างถาวร ไม่ใช่ว่าไม่ใช่เครือข่ายเริ่มต้นอีกต่อไป

แอปจะสร้าง NetworkRequest เพื่อแจ้งให้ ConnectivityManager ทราบว่าต้องการฟังเครือข่ายประเภทใด ตัวอย่างต่อไปนี้แสดงวิธีสร้าง NetworkRequest สำหรับแอปที่สนใจเฉพาะการเชื่อมต่ออินเทอร์เน็ตที่ไม่มีการวัดปริมาณอินเทอร์เน็ต

Kotlin

val request = NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build()

connectivityManager.registerNetworkCallback(request, myNetworkCallback)

Java

NetworkRequest request = new NetworkRequest.Builder()
  .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
  .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .build();

connectivityManager.registerNetworkCallback(request, myNetworkCallback);

ซึ่งหมายความว่าแอปของคุณจะรับทราบเกี่ยวกับการเปลี่ยนแปลงทั้งหมดที่เกี่ยวข้องกับเครือข่ายที่ไม่มีการวัดปริมาณอินเทอร์เน็ตในระบบ

สําหรับ Callback ของเครือข่ายเริ่มต้น จะมีเวอร์ชันของ registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) ที่ยอมรับ Handler เพื่อไม่ให้โหลดเทรด Connectivity ของแอป

โทรหา ConnectivityManager.unregisterNetworkCallback(NetworkCallback) เมื่อการโทรกลับไม่เกี่ยวข้องอีกต่อไป แอปสามารถลงทะเบียนการเรียกกลับของเครือข่ายหลายรายการพร้อมกันได้

เพื่อความสะดวก ออบเจ็กต์ NetworkRequest จะมีความสามารถทั่วไปที่แอปส่วนใหญ่ต้องการ ซึ่งรวมถึงสิ่งต่อไปนี้

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

ตัวอย่างเช่น หากแอปของคุณต้องการส่งข้อความ MMS ให้เพิ่ม NET_CAPABILITY_MMS ลงใน NetworkRequest เพื่อหลีกเลี่ยงการรับแจ้งเกี่ยวกับเครือข่ายทั้งหมดที่ไม่สามารถส่งข้อความ MMS ได้ เพิ่ม TRANSPORT_WIFI_AWARE หากแอปของคุณสนใจเฉพาะการเชื่อมต่อ Wi-Fi แบบ P2P NET_CAPABILITY_INTERNET และ NET_CAPABILITY_VALIDATED จะมีประโยชน์หากคุณสนใจความสามารถในการโอนข้อมูลกับเซิร์ฟเวอร์บนอินเทอร์เน็ต

ลำดับ Callback ตัวอย่าง

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

โดยมีลำดับเวลาดังนี้

  1. เมื่อแอปเรียกใช้ registerNetworkCallback() Callback จะได้รับการเรียกใช้จาก onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() ทันทีสำหรับเครือข่ายมือถือ เนื่องจากมีเพียงเครือข่ายนั้นเท่านั้นที่พร้อมใช้งาน หากมีเครือข่ายอื่นที่พร้อมใช้งาน แอปจะได้รับ Callback สำหรับเครือข่ายอื่นด้วย

    แผนภาพสถานะที่แสดงเหตุการณ์ Callback ของเครือข่ายการลงทะเบียนและ Callback ที่ทริกเกอร์โดยเหตุการณ์
    รูปที่ 1 สถานะแอปหลังจากเรียกใช้ registerNetworkCallback()

  2. จากนั้นแอปจะโทรหา registerDefaultNetworkCallback() Callback ของเครือข่ายเริ่มต้นจะเริ่มรับการเรียกใช้ onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับเครือข่ายมือถือ เนื่องจากเครือข่ายมือถือเป็นเครือข่ายเริ่มต้น หากเครือข่ายอื่นที่ไม่ใช่เครือข่ายเริ่มต้นทำงานอยู่ แอปจะไม่สามารถรับสายสำหรับเครือข่ายที่ไม่ใช่เครือข่ายเริ่มต้นได้

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

  3. หลังจากนั้น อุปกรณ์จะเชื่อมต่อกับเครือข่าย Wi-Fi (แบบไม่มีการวัดปริมาณอินเทอร์เน็ต) Callback ของเครือข่ายปกติจะรับการเรียกไปยัง onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับเครือข่าย Wi-Fi

    แผนภาพสถานะที่แสดง Callback ที่ทริกเกอร์เมื่อแอปเชื่อมต่อกับเครือข่ายใหม่
    รูปที่ 3 สถานะแอปหลังจากเชื่อมต่อกับเครือข่าย Wi-Fi ที่ไม่มีการวัดปริมาณอินเทอร์เน็ต

  4. ในขั้นตอนนี้ อาจใช้เวลาสักครู่ในการตรวจสอบเครือข่าย Wi-Fi ในกรณีนี้ การเรียกใช้ onNetworkCapabilitiesChanged() สำหรับ Callback ของเครือข่ายปกติจะไม่มีความสามารถ NET_CAPABILITY_VALIDATED หลังจากนั้นไม่นาน ระบบจะได้รับสายจาก onNetworkCapabilitiesChanged() ซึ่งความสามารถใหม่ๆ ได้แก่ NET_CAPABILITY_VALIDATED ในกรณีส่วนใหญ่ การตรวจสอบจะรวดเร็วมาก

    เมื่อเครือข่าย Wi-Fi ตรวจสอบความถูกต้องแล้ว ระบบจะเลือกใช้เครือข่าย Wi-Fi มากกว่าเครือข่ายมือถือ โดยหลักๆ แล้วเป็นเพราะไม่มีการวัดปริมาณอินเทอร์เน็ต เครือข่าย Wi-Fi จะกลายเป็นเครือข่ายเริ่มต้น ดังนั้น Callback ของเครือข่ายเริ่มต้นจะได้รับการเรียกไปยัง onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับเครือข่าย Wi-Fi เครือข่ายมือถือจะไปทำงานในเบื้องหลัง และ Callback ของเครือข่ายปกติจะได้รับการเรียกใช้ onLosing() สำหรับเครือข่ายมือถือ

    เนื่องจากตัวอย่างนี้ถือว่าอินเทอร์เน็ตมือถือเปิดอยู่เสมอสำหรับอุปกรณ์นี้ เครือข่ายมือถือจึงไม่เคยยกเลิกการเชื่อมต่อ หากปิดการตั้งค่านี้ หลังจากนั้นสักพักเครือข่ายมือถือจะยกเลิกการเชื่อมต่อ และ Callback ของเครือข่ายปกติจะได้รับการเรียกไปยัง onLost()

    แผนภาพสถานะแสดง Callback ที่ทริกเกอร์เมื่อการเชื่อมต่อเครือข่าย Wi-Fi ตรวจสอบความถูกต้อง
    รูปที่ 4 สถานะแอปหลังจากตรวจสอบเครือข่าย Wi-Fi แล้ว

  5. หลังจากนั้น อุปกรณ์จะตัดการเชื่อมต่อจาก Wi-Fi อย่างกะทันหันเนื่องจากอยู่นอกระยะสัญญาณ เนื่องจาก Wi-Fi ตัดการเชื่อมต่อ Callback ของเครือข่ายปกติจึงได้รับสายเรียกเข้าที่ onLost() สำหรับ Wi-Fi เนื่องจากเครือข่ายมือถือเป็นเครือข่ายเริ่มต้นใหม่ Callback ของเครือข่ายเริ่มต้นจะรับการเรียกไปยัง onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับ เครือข่ายมือถือ

    แผนภาพสถานะที่แสดง Callback ที่ทริกเกอร์เมื่อการเชื่อมต่อเครือข่าย Wi-Fi ขาดหายไป
    รูปที่ 5 สถานะแอปหลังจากยกเลิกการเชื่อมต่อจากเครือข่าย Wi-Fi

หากการตั้งค่าอินเทอร์เน็ตมือถือเปิดอยู่เสมอปิดอยู่ เมื่อ Wi-Fi ตัดการเชื่อมต่อ อุปกรณ์จะพยายามเชื่อมต่อกับเครือข่ายมือถืออีกครั้ง ภาพจะคล้ายกัน แต่จะมีความล่าช้าเพิ่มเติมสั้นๆ สำหรับการโทร onAvailable() และ Callback ของเครือข่ายปกติจะรับสายไปยัง onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() ด้วยเนื่องจากอุปกรณ์เคลื่อนที่พร้อมใช้งาน

ข้อจำกัดในการใช้เครือข่ายเพื่อโอนข้อมูล

การดูเครือข่ายด้วย Callback ของเครือข่ายได้ไม่ได้หมายความว่าแอปจะใช้เครือข่ายเพื่อโอนข้อมูลได้ บางเครือข่ายไม่ได้ให้บริการเชื่อมต่ออินเทอร์เน็ต และบางเครือข่ายอาจจำกัดไว้สำหรับแอปที่ได้รับสิทธิ์เท่านั้น หากต้องการตรวจสอบการเชื่อมต่ออินเทอร์เน็ต โปรดดู NET_CAPABILITY_INTERNET และ NET_CAPABILITY_VALIDATED

การใช้เครือข่ายที่ทำงานอยู่เบื้องหลังยังขึ้นอยู่กับการตรวจสอบสิทธิ์ด้วย หากแอปต้องการใช้เครือข่ายในเบื้องหลัง แอปจะต้องมีสิทธิ์ CHANGE_NETWORK_STATE

แอปที่มีสิทธิ์นี้จะอนุญาตให้ระบบพยายามเปิดเครือข่ายที่ไม่ได้เปิดอยู่ เช่น เครือข่ายมือถือเมื่ออุปกรณ์เชื่อมต่อกับเครือข่าย Wi-Fi แอปดังกล่าวจะเรียกใช้ ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) ด้วย NetworkCallback เพื่อให้เรียกใช้เมื่อมีการเปิดเครือข่าย