מערכת Android מאפשרת לאפליקציות ללמוד על שינויים דינמיים בקישוריות. אפשר להשתמש במחלקות הבאות כדי לעקוב אחרי שינויים בקישוריות ולהגיב להם:
-
ConnectivityManager
מעדכן את האפליקציה לגבי מצב הקישוריות במערכת. - המחלקות
Network
מייצגות אחת מהרשתות שהמכשיר מחובר אליהן. אפשר להשתמש בNetwork
object כמפתח לאיסוף מידע על הרשת באמצעותConnectivityManager
או כדי לאגד שקעים ברשת. כשהרשת מתנתקת, אי אפשר יותר להשתמש באובייקטNetwork
. גם אם המכשיר מתחבר מחדש לאותו מכשיר, אובייקטNetwork
חדש מייצג את הרשת החדשה. - אובייקט
LinkProperties
מכיל מידע על הקישור לרשת, כמו רשימת שרתי ה-DNS, כתובות ה-IP המקומיות ונתיבי הרשת שהותקנו ברשת. - אובייקט
NetworkCapabilities
מכיל מידע על מאפיינים של רשת, כמו אמצעי התקשורת (Wi-Fi, רשת סלולרית, Bluetooth) והיכולות של הרשת. לדוגמה, אפשר לשלוח לאובייקט שאילתה כדי לקבוע אם הרשת יכולה לשלוח MMS, אם היא נמצאת מאחורי פורטל שבוי או אם היא מוגבלת.
אפליקציות שרוצות לדעת מה מצב הקישוריות בכל רגע נתון יכולות להפעיל את השיטות ConnectivityManager
כדי לגלות איזה סוג של רשת זמין. השיטות האלה שימושיות לניפוי באגים ולבדיקה מדי פעם של תמונת מצב של הקישוריות שזמינה בכל זמן נתון.
עם זאת, השיטות הסינכרוניות ConnectivityManager
לא מעדכנות את האפליקציה לגבי מה שקורה אחרי קריאה, ולכן אי אפשר לעדכן את ממשק המשתמש. בנוסף, הן לא יכולות להתאים את ההתנהגות של האפליקציה בהתאם לניתוק מהרשת או לשינוי ביכולות הרשת.
הקישוריות יכולה להשתנות בכל שלב, ולרוב האפליקציות נדרשת תצוגה עדכנית של מצב הרשת במכשיר. אפליקציות יכולות לרשום קריאה חוזרת (callback) באמצעות 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
מכיר את המסלולים, כתובות הקישורים, שם הממשק, פרטי ה-proxy (אם יש) ושרתי ה-DNS. מפעילים את ה-method הרלוונטי באובייקט LinkProperties
כדי לאחזר את המידע שדרוש לכם.
אובייקט NetworkCapabilities
מכיל מידע על העברות ברשת ועל היכולות שלהן.
שכבת התעבורה היא הפשטה של אמצעי פיזי שרשת פועלת דרכו. דוגמאות נפוצות לשיטות העברה הן Ethernet, Wi-Fi וסלולר.
רשתות VPN ו-Wi-Fi מקצה לקצה יכולות לשמש גם כפרוטוקולי העברה.
ב-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)
. לשתי השיטות האלה יש מטרות שונות.
לכל אפליקציות 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
. אם ההטמעה של הקריאות החוזרות צריכה לבצע עבודה ארוכה יותר, צריך להפעיל אותן בשרשור עובד נפרד באמצעות הווריאנט 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
מכיל את היכולות הנפוצות שרוב האפליקציות צריכות, כולל:
כשכותבים את האפליקציה, בודקים את הגדרות ברירת המחדל כדי לראות אם הן מתאימות לתרחיש השימוש, ומבטלים אותן אם רוצים שהאפליקציה תקבל התראה לגבי רשתות שאין להן את היכולות האלה. לעומת זאת, כדאי להוסיף יכולות כדי להימנע מקריאה לשינוי קישוריות ברשתות שהאפליקציה לא מבצעת איתן אינטראקציה.
לדוגמה, אם האפליקציה שלכם צריכה לשלוח הודעות MMS, מוסיפים את המחרוזת
NET_CAPABILITY_MMS
ל-NetworkRequest
כדי שלא תקבלו מידע על כל הרשתות שלא יכולות
לשלוח הודעות MMS. Add
TRANSPORT_WIFI_AWARE
אם האפליקציה מתעניינת רק בקישוריות Wi-Fi P2P.
NET_CAPABILITY_INTERNET
ו-NET_CAPABILITY_VALIDATED
יכולים לעזור לכם אם אתם רוצים להעביר נתונים עם שרת באינטרנט.
דוגמה לרצף של שיחות חוזרות
בקטע הזה מתואר רצף הקריאות החוזרות שאפליקציה עשויה לקבל אם היא רושמת קריאה חוזרת שמוגדרת כברירת מחדל וקריאה חוזרת רגילה במכשיר עם קישוריות לנייד. בדוגמה הזו, המכשיר מתחבר לנקודת גישה טובה ל-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 תאומת. במקרה הזה, הקריאות ל-callback הרגיל של הרשת
onNetworkCapabilitiesChanged()
לא כוללות את היכולת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 מתנתק, והקריאה החוזרת הרגילה של הרשת מקבלת שיחה אל
onLost()
ל-Wi-Fi. מכיוון שהרשת הסלולרית היא רשת ברירת המחדל החדשה, פונקציית ה-callback של רשת ברירת המחדל מקבלת שיחות אל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
כדי לקבל שיחה כשהרשת מופעלת.