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

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. כדי לבדוק אם לרשת יש תעבורה מסוימת, משתמשים ב-method 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.

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

למען הנוחות, האובייקט 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 (ללא חיוב לפי נפח). קריאה חוזרת רגילה מהרשת מקבלת קריאות ל-onAvailable(),‏ onNetworkCapabilitiesChanged() ו-onLinkPropertiesChanged() עבור רשת ה-Wi-Fi.

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

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