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

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 ของเครือข่ายที่ ฟังเหตุการณ์ในเครือข่าย

ความสามารถของเครือข่ายและ 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), หรือทั้งสองอย่างเพื่อตอบสนองต่อการเปลี่ยนแปลงของการเชื่อมต่ออย่างเหมาะสม

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

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

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

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

ยกเลิกการลงทะเบียน Callback เมื่อคุณไม่ได้ใช้งานแล้วโดยการโทร 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);

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

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

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

เพื่อความสะดวก ฟิลด์ ออบเจ็กต์ 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() ระบบจะติดต่อกลับทันที รับสายจาก onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับเครือข่ายมือถือ เนื่องจากมีเพียงเท่านี้ เครือข่ายพร้อมใช้งาน หากมีเครือข่ายอื่น แอป ก็จะได้รับการ Callback สำหรับเครือข่ายอื่นเช่นกัน

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

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

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

  3. หลังจากนั้น อุปกรณ์จะเชื่อมต่อกับเครือข่าย Wi-Fi (ไม่มีการวัดปริมาณอินเทอร์เน็ต) ฟิลด์ การเรียกกลับของเครือข่ายได้รับการโทรหา 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 จะกลายเป็น เครือข่ายเริ่มต้น ดังนั้น Callback เครือข่ายเริ่มต้นจะได้รับการเรียกไปยัง onAvailable(), onNetworkCapabilitiesChanged() และ onLinkPropertiesChanged() สำหรับเครือข่าย Wi-Fi การใช้เครือข่ายมือถือ ในพื้นหลัง และการเรียกกลับของเครือข่ายปกติจะได้รับการเรียกไปยัง onLosing() สำหรับเครือข่ายมือถือ

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