添加依赖
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已连接"
}
}
})
}
}