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

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

‫NetworkCapabilities ו-LinkProperties

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

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

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

תעבורה היא הפשטה של מדיום פיזי שבו הרשת פועלת. דוגמאות נפוצות לתעבורה הן אתרנט, Wi-Fi ונייד. גם רשתות VPN ו-Wi-Fi מקצה לקצה יכולות לשמש כערוצי העברה. ב-Android, לרשת יכולים להיות כמה אמצעי תעבורה בו-זמנית. דוגמה לכך היא VPN שפועל גם ברשתות Wi-Fi וגם ברשתות סלולריות. ל-VPN יש את התעבורה של Wi-Fi, של הרשת הסלולרית ושל ה-VPN. כדי לבדוק אם לרשת יש סוג מסוים של תעבורת נתונים, משתמשים ב-method‏ NetworkCapabilities.hasTransport(int) עם אחד מהקבועים של NetworkCapabilities.TRANSPORT_*.

יכולת מתארת מאפיין של הרשת. דוגמאות ליכולות: MMS,‏ NOT_METERED ו-INTERNET. רשת עם יכולת MMS יכולה לשלוח ולקבל הודעות 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) או את שניהם כדי להגיב בהתאם לשינויים בקישוריות.

ב-callback שרשום ב-registerDefaultNetworkCallback(), המשמעות של onLost() היא שהרשת כבר לא מוגדרת כרשת ברירת המחדל. יכול להיות שהוא מנותק.

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

במקום זאת, השתמשו ב-NetworkCapabilities.getLinkDownstreamBandwidthKbps() כדי למדוד את רוחב הפס, וב-NetworkCapabilites.hasCapability(int) עם הארגומנטים NET_CAPABILITY_NOT_METERED כדי לקבוע אם החיבור נמדד. מידע נוסף זמין בקטע בנושא NetworkCapabilities ו-LinkProperties.

כברירת מחדל, שיטות הקריאה החוזרת נקראות בשרשור הקישוריות של האפליקציה, שהוא שרשור נפרד שמשמש את ConnectivityManager. אם ההטמעה של הקריאות החוזרות (callbacks) דורשת עבודה ארוכה יותר, צריך לקרוא להן ב-Thread עובד נפרד באמצעות הווריאנט ConnectivityManager.registerDefaultNetworkCallback(NetworkCallback, Handler).

כדי לבטל את הרישום של הקריאה החוזרת כשכבר לא צריך אותה, מפעילים את ConnectivityManager.unregisterNetworkCallback(NetworkCallback). ה-onPause() של הפעילות הראשית הוא מקום טוב לעשות את זה, במיוחד אם רושמים את הקריאה החוזרת (callback) ב-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);

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

לגבי הקריאה החוזרת (callback) של רשת ברירת המחדל, יש גרסה של registerNetworkCallback(NetworkRequest, NetworkCallback, Handler) שמקבלת Handler, כך שהיא לא טוענת את ה-thread של Connectivity באפליקציה.

מפעילים את ConnectivityManager.unregisterNetworkCallback(NetworkCallback) כשהקריאה החוזרת (callback) כבר לא רלוונטית. אפליקציה יכולה לרשום כמה פונקציות קריאה חוזרת (callback) של רשת בו-זמנית.

מטעמי נוחות, האובייקט NetworkRequest מכיל את היכולות הנפוצות שרוב האפליקציות צריכות, כולל:

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

לדוגמה, אם האפליקציה צריכה לשלוח הודעות MMS, צריך להוסיף את NET_CAPABILITY_MMS ל-NetworkRequest כדי להימנע מקבלת הודעות על כל הרשתות שלא יכולות לשלוח הודעות MMS. מוסיפים את TRANSPORT_WIFI_AWARE אם האפליקציה מתעניינת רק בקישוריות Wi-Fi מסוג P2P. NET_CAPABILITY_INTERNET ו-NET_CAPABILITY_VALIDATED שימושיים אם אתם רוצים להעביר נתונים עם שרת באינטרנט.

רצף לדוגמה של קריאות חוזרות (callback)

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

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

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

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

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

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

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

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

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