I have a sample in Github (https://github.com/alirezaeiii/Movies) where I have a utility class in order to check internet network connection :
class NetworkUtils(context: Context) : ConnectivityManager.NetworkCallback() {
private val networkLiveData: MutableLiveData<Boolean> = MutableLiveData()
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
fun getNetworkLiveData(): LiveData<Boolean> {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(this)
} else {
val builder = NetworkRequest.Builder()
connectivityManager.registerNetworkCallback(builder.build(), this)
}
var isConnected = false
connectivityManager.allNetworks.forEach { network ->
val networkCapability = connectivityManager.getNetworkCapabilities(network)
networkCapability?.let {
if (it.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)) {
isConnected = true
return@forEach
}
}
}
networkLiveData.postValue(isConnected)
return networkLiveData
}
override fun onAvailable(network: Network) {
networkLiveData.postValue(true)
}
override fun onLost(network: Network) {
networkLiveData.postValue(false)
}
fun unRegister() {
connectivityManager.unregisterNetworkCallback(this)
}
}
In an Activity I observe in onCreate() and unRegisterNetworkCallback in onDestroy() :
override fun onCreate() {
super.onCreate(savedInstanceState)
handleNetwork()
}
override fun onDestroy() {
super.onDestroy()
networkUtils.unRegister()
}
private fun handleNetwork() {
networkUtils.getNetworkLiveData().observe(this) { isConnected: Boolean ->
if (!isConnected) {
...
} else {
Log.d("Test", "Connected")
...
}
}
}
The 1st time that I launch the app "Connected" tag will be called once, but when I rotate the device it will be called twice. Why is that?
I have another sample where I did not use Navigation architecture component
in it and it get called once when I rotate :https://github.com/alirezaeiii/TMDb-Paging/blob/master/app/src/main/java/com/sample/android/tmdb/ui/BaseActivity.kt
Provider using hilt :
@Module
@InstallIn(SingletonComponent::class)
class AppUtilsModule {
@Singleton
@Provides
fun provideNetworkUtils(context: Context): NetworkUtils {
return NetworkUtils(context)
}
}