0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ネットワーク監視機構実装

0
Posted at

はじめに

今回はAndroidにおけるネットワーク監視の共通処理を実装してみようと思います

コード

fun Context.isOnline(): Boolean {
    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as? ConnectivityManager
    return connectivityManager?.getNetworkCapabilities(connectivityManager.activeNetwork)?.run {
        when {
            hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
            hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
            hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true
            hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> true
            else -> false
        }
    } ?: false
}
@Singleton
class NetworkConnectivityChecker @Inject constructor(
    @ApplicationContext private val context: Context,
) {
    private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    // ネットワーク状態を Flow で公開
    private val _networkState = MutableStateFlow(context.isOnline())
    val networkState: StateFlow<Boolean> = _networkState.asStateFlow()

    init {
        registerNetworkCallback()
    }

    private fun registerNetworkCallback() {
        try {
            val networkRequest = NetworkRequest.Builder()
                .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                .build()

            val callback = object : ConnectivityManager.NetworkCallback() {
                override fun onAvailable(network: Network) {
                    _networkState.value = true
                }

                override fun onLost(network: Network) {
                    // 他のネットワークがまだ有効かどうかを確認
                    // Wi-Fi ↔ モバイルネットワークの切り替え時に誤ってfalseにならないようにする
                    _networkState.value = context.isOnline()
                }

                override fun onCapabilitiesChanged(
                    network: Network,
                    networkCapabilities: NetworkCapabilities,
                ) {
                    val hasInternet = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                    val hasValidated = networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
                    _networkState.value = hasInternet && hasValidated
                }
            }

            connectivityManager.registerNetworkCallback(networkRequest, callback)
        } catch (e: Exception) {
           
        }
    }
}

最後に

復帰時にすぐ更新をかけたい時などに役立つと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?