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

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

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

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

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

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

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