מעקב אחר סטטוס הקישוריות ומדידת החיבור

ConnectivityManager מספק API שמאפשר לבקש מהמכשיר להתחבר לרשת על סמך תנאים שונים, כולל יכולות המכשיר ואפשרויות להעברת נתונים.

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

הגדרת בקשת רשת

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

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

Kotlin

val networkRequest = NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build()

Java

NetworkRequest networkRequest = new NetworkRequest.Builder()
        .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .build();

שימו לב שחיבורים מסוימים יכולים להיות יקרים משמעותית מאחרים (לדוגמה, חיבור לנייד הוא בדרך כלל יקר). משתמשים בערך NetworkCapabilities#NET_CAPABILITY_NOT_METERED כדי לקבוע אם החיבור יקר. כשאתם מחוברים לחיבור מוגבל, כדאי לנסות לצמצם את צריכת הנתונים של האפליקציה או לדחות את השימוש בה עד שהמכשיר יתחבר לחיבור לא מוגבל.

הגדרת קריאה חוזרת (callback) ברשת

כשרושמים את NetworkRequest ב-ConnectivityManager, צריך להטמיע NetworkCallback כדי לקבל התראות על שינויים בסטטוס החיבור וביכולות הרשת.

הפונקציות הנפוצות ביותר שמוטמעות ב-NetworkCallback כוללות את הפונקציות הבאות:

  • onAvailable() מציין שהמכשיר מחובר לרשת חדשה שעומדת בדרישות של היכולות וסוג ההעברה שצוינו בNetworkRequest.
  • onLost() מציין שהמכשיר איבד את החיבור לרשת.
  • onCapabilitiesChanged() מציין שהיכולות של הרשת השתנו. אובייקט NetworkCapabilities מספק מידע על היכולות הנוכחיות של הרשת.

Kotlin

private val networkCallback = object : ConnectivityManager.NetworkCallback() {
    // network is available for use
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
    }

    // Network capabilities have changed for the network
    override fun onCapabilitiesChanged(
            network: Network,
            networkCapabilities: NetworkCapabilities
    ) {
        super.onCapabilitiesChanged(network, networkCapabilities)
        val unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
    }

    // lost network connection
    override fun onLost(network: Network) {
        super.onLost(network)
    }
}

Java

private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(@NonNull Network network) {
        super.onAvailable(network);
    }

    @Override
    public void onLost(@NonNull Network network) {
        super.onLost(network);
    }

    @Override
    public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
        super.onCapabilitiesChanged(network, networkCapabilities);
        final boolean unmetered = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
    }
};

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

אחרי שמצהירים על NetworkRequest ועל NetworkCallback, משתמשים בפונקציות requestNetwork() או registerNetworkCallback() כדי לחפש רשת להתחבר אליה מהמכשיר שעומדת בדרישות של NetworkRequest. הסטטוס מדווח ל-NetworkCallback.

Kotlin

val connectivityManager = getSystemService(ConnectivityManager::class.java) as ConnectivityManager
connectivityManager.requestNetwork(networkRequest, networkCallback)

Java

ConnectivityManager connectivityManager =
        (ConnectivityManager) getSystemService(ConnectivityManager.class);
connectivityManager.requestNetwork(networkRequest, networkCallback);