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