קריאת מצב הרשת

מערכת Android מאפשרת לאפליקציות ללמוד על שינויים דינמיים בקישוריות. אפשר להשתמש במחלקות הבאות כדי לעקוב אחרי שינויים בקישוריות ולהגיב להם:

  • ConnectivityManager מציין לאפליקציה את מצב הקישוריות במערכת.
  • המחלקות Network מייצגות את אחת הרשתות שהמכשיר מחובר אליהן. אפשר להשתמש באובייקט Network כמפתח לאיסוף מידע על הרשת באמצעות 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 מכיל מידע על העברות ברשת ועל היכולות שלהן.

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

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

דוגמה לרצף של שיחות חוזרות

בקטע הזה מתואר רצף הקריאות החוזרות שאפליקציה עשויה לקבל אם היא רושמת גם קריאה חוזרת שמוגדרת כברירת מחדל וגם קריאה חוזרת רגילה במכשיר שיש לו קישוריות לנייד. בדוגמה הזו, המכשיר מתחבר לנקודת גישה טובה ל-Wi-Fi ואז מתנתק ממנה. בדוגמה הזו מניחים גם שההגדרה חבילת הגלישה פעילה תמיד מופעלת במכשיר.

ציר הזמן הוא כזה:

  1. כשהאפליקציה מתקשרת אל registerNetworkCallback(), הפונקציה לשיחה חוזרת מקבלת מיד שיחות מ-onAvailable(), מ-onNetworkCapabilitiesChanged() ומ-onLinkPropertiesChanged() עבור הרשת הסלולרית, כי רק הרשת הזו זמינה. אם יש רשת אחרת זמינה, האפליקציה מקבלת גם קריאות חוזרות לרשת האחרת.

    תרשים מצבים שמציג את האירוע register network callback ואת הקריאות החוזרות (callbacks) שהופעלו על ידי האירוע
    איור 1. מצב האפליקציה אחרי השיחה אל registerNetworkCallback().

  2. לאחר מכן, האפליקציה מתקשרת אל registerDefaultNetworkCallback(). ברירת המחדל של הרשת מתחילה לקבל שיחות אל onAvailable(), onNetworkCapabilitiesChanged() ו-onLinkPropertiesChanged() עבור הרשת הסלולרית, כי הרשת הסלולרית היא ברירת המחדל. אם רשת אחרת, שלא מוגדרת כברירת מחדל, פעילה, האפליקציה לא יכולה לקבל שיחות ברשת שלא מוגדרת כברירת מחדל.

    תרשים מצבים שבו מוצג אירוע של קריאה חוזרת (callback) לרישום רשת ברירת המחדל והקריאות החוזרות שהופעלו על ידי האירוע
    איור 2. מצב האפליקציה אחרי רישום רשת ברירת מחדל.

  3. בהמשך, המכשיר מתחבר לרשת Wi-Fi (ללא הגבלת נפח). הקריאה החוזרת הרגילה ברשת מקבלת שיחות אל onAvailable(), onNetworkCapabilitiesChanged() ו-onLinkPropertiesChanged() ברשת ה-Wi-Fi.

    תרשים מצבים שמציג את הקריאות החוזרות (callback) שמופעלות כשהאפליקציה מתחברת לרשת חדשה
    איור 3. מצב האפליקציה אחרי התחברות לרשת Wi-Fi ללא הגבלת נפח.

  4. בשלב הזה, יכול להיות שייקח זמן עד שרשת ה-Wi-Fi תאומת. במקרה הזה, הקריאות onNetworkCapabilitiesChanged() להחזרת קריאה רגילה לרשת לא כוללות את היכולת NET_CAPABILITY_VALIDATED. אחרי זמן קצר, הוא מקבל שיחה אל onNetworkCapabilitiesChanged(), שבה היכולות החדשות כוללות NET_CAPABILITY_VALIDATED. ברוב המקרים, האימות מתבצע במהירות רבה.

    כשרשת ה-Wi-Fi מאומתת, המערכת מעדיפה אותה על פני הרשת הסלולרית, בעיקר כי היא לא מוגבלת. רשת ה-Wi-Fi הופכת לרשת ברירת המחדל, ולכן קריאה חוזרת (callback) של רשת ברירת המחדל מקבלת קריאה אל onAvailable(), onNetworkCapabilitiesChanged() ו-onLinkPropertiesChanged() עבור רשת ה-Wi-Fi. הרשת הסלולרית עוברת לרקע, והקריאה החוזרת הרגילה של הרשת מקבלת שיחה אל onLosing() עבור הרשת הסלולרית.

    בדוגמה הזו מניחים שחבילת הגלישה תמיד מופעלת במכשיר, ולכן הרשת הסלולרית אף פעם לא מתנתקת. אם ההגדרה מושבתת, אחרי זמן מה הרשת הסלולרית מתנתקת, והרשת הרגילה מקבלת שיחה חוזרת אל onLost().

    תרשים מצבים שמציג את הקריאות החוזרות שמופעלות כשחיבור לרשת Wi-Fi מאומת
    איור 4. מצב האפליקציה אחרי אימות רשת ה-Wi-Fi.

  5. בשלב מאוחר יותר, המכשיר מתנתק פתאום מה-Wi-Fi כי הוא יצא מטווח הקליטה. הניתוק מ-Wi-Fi גורם לכך שהקריאה החוזרת הרגילה של הרשת מקבלת קריאה ל-onLost() עבור Wi-Fi. מכיוון שהרשת הסלולרית היא רשת ברירת המחדל החדשה, פונקציית הקריאה החוזרת של רשת ברירת המחדל מקבלת שיחות אל onAvailable(), onNetworkCapabilitiesChanged() ו-onLinkPropertiesChanged() ברשת הסלולרית.

    דיאגרמת מצבים שמציגה את הקריאות החוזרות שמופעלות כשחיבור לרשת Wi-Fi מתנתק
    איור 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 כדי לקבל שיחה כשהרשת מופעלת.