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

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

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

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

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 ใช้ หากการใช้งานการเรียกกลับต้องดําเนินการเพิ่มเติม ให้เรียกใช้การเรียกกลับในเธรดผู้ทํางานแยกต่างหากโดยใช้ตัวแปร 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);

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

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

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

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

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

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