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 จะส่งและรับข้อความจากบริการการรับส่งข้อความมัลติมีเดียได้ ส่วนเครือข่ายที่ไม่มีความสามารถนี้จะส่งและรับไม่ได้ เครือข่ายที่มีความสามารถ 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)
เมื่อการโทรกลับไม่เกี่ยวข้องแล้ว แอปสามารถลงทะเบียนการเรียกกลับของเครือข่ายหลายรายการพร้อมกันได้
เพื่อความสะดวก ออบเจ็กต์ 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 ที่สัญญาณดี จากนั้นยกเลิกการเชื่อมต่อ ตัวอย่างนี้ยังถือว่าอุปกรณ์เปิดใช้การตั้งค่าเปิดใช้อินเทอร์เน็ตมือถือเสมอด้วย
ลำดับเวลามีดังนี้
เมื่อแอปโทรหา
registerNetworkCallback()
การโทรกลับจะรับสายจากonAvailable()
,onNetworkCapabilitiesChanged()
และonLinkPropertiesChanged()
สำหรับเครือข่ายมือถือทันที เนื่องจากมีเพียงเครือข่ายนั้นที่พร้อมใช้งาน หากมีเครือข่ายอื่น แอปก็จะได้รับการติดต่อกลับสำหรับเครือข่ายอื่นด้วย
รูปที่ 1 สถานะแอปหลังจากเรียกใช้registerNetworkCallback()
จากนั้นแอปจะโทรหา
registerDefaultNetworkCallback()
เครือข่ายเริ่มต้น callbacks เริ่มรับการเรียกonAvailable()
,onNetworkCapabilitiesChanged()
และonLinkPropertiesChanged()
สำหรับเครือข่ายมือถือ เนื่องจากเครือข่ายมือถือเป็นเครือข่ายเริ่มต้น หากมีเครือข่ายอื่นที่ไม่ใช่เครือข่ายเริ่มต้นทำงานอยู่ แอปจะรับสายสำหรับเครือข่ายที่ไม่ใช่เครือข่ายเริ่มต้นไม่ได้
รูปที่ 2 สถานะแอปหลังจากลงทะเบียนเครือข่ายเริ่มต้นต่อมา อุปกรณ์เชื่อมต่อกับเครือข่าย Wi-Fi (ไม่จำกัดปริมาณ) การเรียกกลับของเครือข่ายปกติจะรับสายเรียกเข้า
onAvailable()
,onNetworkCapabilitiesChanged()
และonLinkPropertiesChanged()
สำหรับเครือข่าย Wi-Fi
รูปที่ 3 สถานะแอปหลังจากเชื่อมต่อกับเครือข่าย Wi-Fi ที่ไม่จำกัดปริมาณการใช้งานเมื่อถึงขั้นตอนนี้ เครือข่าย Wi-Fi อาจใช้เวลาสักครู่เพื่อตรวจสอบ ในกรณีนี้
onNetworkCapabilitiesChanged()
จะเรียกใช้การเรียกกลับของเครือข่ายปกติโดยไม่มีความสามารถNET_CAPABILITY_VALIDATED
หลังจากนั้นไม่นาน จะได้รับคอลไปยังonNetworkCapabilitiesChanged()
ซึ่งความสามารถใหม่รวมถึงNET_CAPABILITY_VALIDATED
ในกรณีส่วนใหญ่ การตรวจสอบจะใช้เวลาไม่นานเมื่อเครือข่าย Wi-Fi ตรวจสอบแล้ว ระบบจะเลือกเครือข่าย Wi-Fi แทนเครือข่ายมือถือ เนื่องจากไม่มีการกำหนดปริมาณการใช้ เครือข่าย Wi-Fi จะกลายเป็นเครือข่ายเริ่มต้น ดังนั้นการเรียกกลับของเครือข่ายเริ่มต้นจึงได้รับการเรียกไปที่
onAvailable()
,onNetworkCapabilitiesChanged()
และonLinkPropertiesChanged()
สำหรับเครือข่าย Wi-Fi เครือข่ายมือถือจะทำงานในเบื้องหลัง และการติดต่อกลับของเครือข่ายปกติจะได้รับการโทรไปที่onLosing()
สำหรับเครือข่ายมือถือเนื่องจากตัวอย่างนี้ถือว่าอินเทอร์เน็ตมือถือเปิดอยู่เสมอสำหรับอุปกรณ์นี้ เครือข่ายมือถือจึงไม่มีการตัดการเชื่อมต่อ หากการตั้งค่าปิดอยู่ หลังจากผ่านไประยะหนึ่ง เครือข่ายมือถือจะตัดการเชื่อมต่อ และระบบการโทรกลับของเครือข่ายปกติจะได้รับการโทรไปที่
onLost()
รูปที่ 4 สถานะแอปหลังจากตรวจสอบเครือข่าย Wi-Fi แล้วต่อมา อุปกรณ์ตัดการเชื่อมต่อจาก Wi-Fi อย่างกะทันหันเนื่องจากอยู่นอกระยะสัญญาณ เนื่องจาก Wi-Fi ตัดการเชื่อมต่อ แบ็กคอลเครือข่ายปกติจึงได้รับสายเรียกเข้าจาก
onLost()
สำหรับ Wi-Fi เนื่องจากเครือข่ายมือถือเป็นเครือข่ายเริ่มต้นใหม่ การรับสายกลับของเครือข่ายเริ่มต้นจึงรับสายที่โทรหาonAvailable()
,onNetworkCapabilitiesChanged()
และonLinkPropertiesChanged()
สำหรับเครือข่ายมือถือ
รูปที่ 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
ที่จะเรียกใช้เมื่อมีการเรียกใช้เครือข่าย