מערכת 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 הופכת לרשת ברירת המחדל, ולכן הקריאה החוזרת של רשת ברירת המחדל מקבלת קריאה אל
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
כדי לקבל שיחה כשהרשת מופעלת.