参考Android 网络管家ConnectivityManager
android 7.0 之后 对于监听网络变化的广播*** CONNECTIVITY_ACTION***。
如果是在应用AndroidManifest文件中声明对该广播的监听,则无效;
如果使用register声明对该广播的监听,则有效。
所以我们应该使用更通用的方式(requestNetwork)来监听网络的变化。
步骤
1.声明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
2.监听网络
val cm = app.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val builder = NetworkRequest.Builder()
val request = builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.build()
cm.requestNetwork(request,object :ConnectivityManager.NetworkCallback(){
override fun onAvailable(network: Network?) {
super.onAvailable(network)
NetPublishSubject.instance().post(NetPublishSubject.CONNECTION)
Log.i("net detect","onAvailable")
}
override fun onLost(network: Network?) {
super.onLost(network)
NetPublishSubject.instance().post(NetPublishSubject.DIS_CONNECTION)
Log.i("net detect","onUnavailable")
}
})
网友评论