Android
안드로이드 네트워크 연결 상태 확인
easy-1
2021. 12. 11. 19:21
<개요>
앱 개발을 하다보면 네트워크 연결 상태에 대한 처리가 필요하다
여기서는 네트워크 연결 상태 확인 클래스를 만들어 액티비티에서 상속하여 사용해보도록 하자
<적용방법>
1. 네트워크 연결 상태에 대한 인터페이스를 생성
interface NetworkListener {
fun networkConnected() // 연결됨
fun networkFailed() // 연결실패
}
2. 네트워크 연결 상태 확인하는 클래스 생성
class NetworkInfo(
private val activity: Activity,
private val networkListener: NetworkListener
) : ConnectivityManager.NetworkCallback() {
// 네트워크가 연결될 때 호출
override fun onAvailable(network: Network) {
networkListener.networkConnected()
}
// 네트워크가 끊길 때 호출
override fun onLost(network: Network) {
networkListener.networkFailed()
}
// 콜백을 등록하는 함수
fun registerNetworkCallback() {
// 네트워크 연결 상태 확인
val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 와이파이
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR) // 셀룰러 데이터
.build()
connectivityManager.registerNetworkCallback(networkRequest, this) // 등록
}
// 콜백을 해제하는 함수
fun terminateNetworkCallback() {
val connectivityManager = activity.getSystemService(ConnectivityManager::class.java)
connectivityManager.unregisterNetworkCallback(this) // 해제
}
}
3. 액티비티에서 상속 및 콜백 등록, 해제 진행
- onReume() 시에 콜백 등록해주고 onStop()시에 콜백해제해줌
- 여기서는 BaseActivity 에서 연결해서 사용
abstract class BaseActivity<B : ViewDataBinding, R : ViewModel>(
@LayoutRes val layoutId: Int
) : AppCompatActivity(), NetworkListener {
lateinit var binding: B // Binding
abstract val viewModel: R // ViewModel
private lateinit var networkInfo: NetworkInfo // 네트워크 연결 상태 클래스
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutId)
binding.lifecycleOwner = this
networkInfo = NetworkInfo(this, this) // init
}
/**
* 네트워크 연결 상태 확인
*/
override fun onResume() {
super.onResume()
// 콜백등록
networkInfo.registerNetworkCallback()
}
override fun onStop() {
super.onStop()
// 콜백해제
networkInfo.terminateNetworkCallback()
}
// 네트워크 연결됨
override fun networkConnected() {
Dlog.d("네트워크 연결됨")
}
// 네트워크 연결끊김
override fun networkFailed() {
Dlog.d("네트워크 끊김")
}
}
이렇게 액티비티에 네트워크 연결 상태를 처리해 줄 수 있다