添加依賴
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
創建個用來判斷網絡類型的類(根據業務需求自行增添)
object NetworkState {
// 無網絡
const val NONE = 0
// 網絡連接
const val CONNECT = 1
// WIFI
const val WIFI = 2
// 移動網絡
const val CELLULAR = 3
}
創建LiveData單例模式
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class NetworkLiveData : LiveData<Int>() {
private var networkCallback: ConnectivityManager.NetworkCallback
private var request: NetworkRequest
private var manager: ConnectivityManager
init {
networkCallback = NetworkCallbackImpl()
request = NetworkRequest.Builder().build()
manager = MyApp.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
}
override fun onActive() {
super.onActive()
manager.registerNetworkCallback(request, networkCallback)
}
override fun onInactive() {
super.onInactive()
manager.unregisterNetworkCallback(networkCallback)
}
object NetworkLiveDataHolder {
val INSTANCE = NetworkLiveData()
}
companion object {
fun getInstance(): NetworkLiveData {
return NetworkLiveDataHolder.INSTANCE
}
}
class NetworkCallbackImpl : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d("onAvailable: ", "網絡已連接")
getInstance().postValue(NetworkState.CONNECT)
}
override fun onLost(network: Network) {
super.onLost(network)
Log.d("onLost: ", "網絡斷開")
getInstance().postValue(NetworkState.NONE)
}
override fun onCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities
) {
super.onCapabilitiesChanged(network, networkCapabilities)
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.d("WIFI: ", "WIFI已連接")
getInstance().postValue(NetworkState.WIFI)
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.d("CELLULAR: ", "移動網絡已連接")
getInstance().postValue(NetworkState.CELLULAR)
}
}
}
}
使用方法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
NetworkLiveData.getInstance().observe(this, Observer {
when (it) {
NetworkState.CONNECT -> {
text.text = "網絡已連接"
}
NetworkState.NONE -> {
text.text = "網絡中斷"
}
NetworkState.CELLULAR -> {
text.text = "移動網絡已連接"
}
NetworkState.WIFI -> {
text.text = "WIFI已連接"
}
}
})
}
}