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

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

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

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

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

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

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

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

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

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