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