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

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

  • ConnectivityManager מספר לאפליקציה את מצב הקישוריות במערכת.
  • הכיתה Network מייצגת אחת מהרשתות שהמכשיר מחובר אליהן. אפשר להשתמש באובייקט Network כמפתח כדי לאסוף מידע על הרשת עם ConnectivityManager או כדי לקשר שקעים ברשת. כשהחיבור לרשת מתנתק, אי אפשר להשתמש באובייקט Network. גם אם המכשיר יתחבר מאוחר יותר לאותה מכשיר, אובייקט Network חדש ייצג את הרשת החדשה.
  • האובייקט LinkProperties מכיל מידע על הקישור לרשת, כמו רשימת שרתי ה-DNS, כתובות ה-IP המקומיות ומסלולי הרשת שמותקנים ברשת.
  • האובייקט NetworkCapabilities מכיל מידע על מאפייני הרשת, כמו אמצעי התעבורה (Wi-Fi, סלולרי, Bluetooth) והיכולות של הרשת. לדוגמה, אפשר לשלוח שאילתה על האובייקט כדי לקבוע אם הרשת יכולה לשלוח MMS, נמצאת מאחורי פורטל שבוי או שיש בה חיוב לפי שימוש בנתונים.

אפליקציות שרוצות לדעת מה המצב המיידי של הקישוריות בכל זמן נתון יכולות להפעיל את השיטות של ConnectivityManager כדי לברר איזה סוג רשת זמין. השיטות האלה מועילות לניפוי באגים ולבדיקה מדי פעם של קובץ snapshot של הקישוריות שזמינה בכל זמן נתון.

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

NetworkCapabilities ו-LinkProperties

האובייקטים NetworkCapabilities ו-LinkProperties מספקים מידע על כל המאפיינים שהמערכת מכירה לגבי רשת.

האובייקט LinkProperties מכיל מידע על המסלולים, כתובות הקישורים, שם הממשק, פרטי שרת ה-proxy (אם יש כזה) ושרתי ה-DNS. כדי לאחזר את המידע הרצוי, צריך לקרוא ל-method הרלוונטי באובייקט LinkProperties.

האובייקט NetworkCapabilities כולל מידע על התעבורה ברשת ועל היכולות שלהן.

תעבורה היא הפשטה של מדיום פיזי שבו פועלת רשת. דוגמאות נפוצות לסוגי התעבורה הן Ethernet,‏ Wi-Fi ו-mobile. גם רשתות VPN ורשתות Wi-Fi מקצה לקצה (P2P) יכולות לשמש כמעבר. ב-Android, רשת יכולה לכלול כמה אמצעי העברה בו-זמנית. דוגמה לכך היא VPN שפועל גם ברשתות Wi-Fi וגם ברשתות סלולריות. ב-VPN יש את התעבורות Wi-Fi,‏ mobile ו-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 החדשה.

כשרשת חדשה הופכת לברירת המחדל, כל חיבור חדש שהאפליקציה פותחת משתמש ברשת הזו. בשלב מאוחר יותר, כל החיבורים שנותרו ברשת ברירת המחדל הקודמת יופסקו בכוח. אם חשוב לאפליקציה לדעת מתי רשת ברירת המחדל משתנה, היא רושמת קריאה חוזרת (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 משתמש בו. אם ההטמעה של פונקציות ה-callbacks צריכה לבצע פעולות ממושכות יותר, אפשר להפעיל אותן בשרשור עבודה נפרד באמצעות הווריאנט ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler).

אם אתם לא צריכים יותר את האפשרות לקבלת שיחה חוזרת, תוכלו לבטל את הרישום שלה על ידי שליחת הודעת SMS למספר 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. צריך להוסיף את הערך TRANSPORT_WIFI_AWARE אם האפליקציה מתעניינת רק בקישוריות Wi-Fi מסוג P2P. NET_CAPABILITY_INTERNET ו-NET_CAPABILITY_VALIDATED יעזרו לכם אם אתם רוצים להעביר נתונים לשרת באינטרנט.

דוגמה לסדרת קריאה חוזרת

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

לוח הזמנים הוא:

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

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

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

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

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

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

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

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

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

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

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

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

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

הגבלות על השימוש ברשת להעברת נתונים

אם רואים רשת עם קריאה חוזרת (callback) ברשת, האפליקציה לא יכולה להשתמש ברשת לצורך העברת נתונים. חלק מהרשתות לא מספקות חיבור לאינטרנט, וחלק מהרשתות עשויות להיות מוגבלות לאפליקציות בעלות הרשאות. כדי לבדוק את החיבור לאינטרנט, אפשר לעיין במאמרים NET_CAPABILITY_INTERNET וNET_CAPABILITY_VALIDATED.

השימוש ברשתות ברקע כפוף גם הוא לבדיקות הרשאות. אם האפליקציה שלכם רוצה להשתמש ברשת ברקע, היא זקוקה להרשאה CHANGE_NETWORK_STATE.

אפליקציות עם ההרשאה הזו מאפשרות למערכת לנסות להפעיל רשת שלא פועלת, כמו הרשת הסלולרית כשהמכשיר מחובר לרשת Wi-Fi. אפליקציה כזו קוראת ל-ConnectivityManager.requestNetwork(NetworkRequest, NetworkCallback) עם NetworkCallback שייקרא כשהרשת תופעל.