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

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

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

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

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

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

การใช้ 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 ดูข้อมูลเพิ่มเติมเกี่ยวกับการลงทะเบียนการเรียกกลับของเครือข่ายได้ที่ ฟังเหตุการณ์ในเครือข่าย

NetworkCapabilities และ LinkProperties

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

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

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

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

ความสามารถอธิบายคุณสมบัติของเครือข่าย ความสามารถตัวอย่าง ได้แก่ MMS, NOT_METERED และ INTERNET เครือข่ายที่มีความสามารถ MMS จะส่ง และรับข้อความบริการส่งข้อความมัลติมีเดียได้ ส่วนเครือข่ายที่ไม่มีความสามารถนี้ จะทำไม่ได้ เครือข่ายที่มีความสามารถ 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 และได้รับการรับส่ง TRANSPORT_WIFI transport ขณะที่ยังคงการรับส่ง TRANSPORT_VPN transport ไว้

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

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

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

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

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

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

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 อย่างเพื่อตอบสนองต่อการเปลี่ยนแปลงการเชื่อมต่ออย่างเหมาะสม

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

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

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

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

ยกเลิกการลงทะเบียนการโทรกลับเมื่อไม่ต้องการใช้แล้วโดยโทรไปที่ ConnectivityManager.unregisterNetworkCallback(NetworkCallback) onPause() ของกิจกรรมหลักเป็นที่ที่เหมาะในการดำเนินการนี้ โดยเฉพาะอย่างยิ่งหากคุณลงทะเบียนการเรียกกลับใน 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);

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

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

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

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

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

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

ลำดับการเรียกกลับตัวอย่าง

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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