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