最近在更新之前的一些java代碼到kotlin去,然后把原來的NetReciever更新為kotlin版本,然后as給了我以下的錯誤:
image.png
image.png
wtf?這是什么情況,仔細(xì)把提示的文字閱讀一遍。。。
image.png
原來CONNECTIVITY_ACTION已經(jīng)過時(shí),這里官方推薦使用 requestNetwork,registerNetworkCallbackor registerDefaultNetworkCallback來替換原有的BroadcastReciever方案,既然如此,就嘗試來改造一番。
首先根據(jù)不同的版本區(qū)分不同的監(jiān)聽方案
主方法
//網(wǎng)絡(luò)變化監(jiān)聽器
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
mConnectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallbackImpl = NetworkCallbackImpl()
mConnectivityManager.requestNetwork(NetworkRequest.Builder().build(),networkCallbackImpl)
}else{
networkReceiver = NetWorkReciever()
val netFilter = IntentFilter()
netFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver,netFilter)
}
NetworkCallbackImpl
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
class NetworkCallbackImpl: ConnectivityManager.NetworkCallback() {
val TAG = "NetworkCallbackImpl"
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.i(TAG,"網(wǎng)絡(luò)已鏈接")
}
override fun onLost(network: Network) {
super.onLost(network)
Log.i(TAG,"網(wǎng)絡(luò)已斷開")
}
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities)
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
when {
//WIFFI
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
Log.i(TAG,"wifi已經(jīng)連接")
}
//數(shù)據(jù)流量
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
Log.i(TAG,"數(shù)據(jù)流量已經(jīng)連接")
}
else -> {
Log.i(TAG,"其他網(wǎng)絡(luò)")
}
}
}
}
}
然后補(bǔ)充一下原來NetWorkReciever的代碼
class NetWorkReciever:BroadcastReceiver() {
companion object{
const val TAG = "NetWork"
}
override fun onReceive(context: Context?, intent: Intent?) {
if(ConnectivityManager.CONNECTIVITY_ACTION==intent?.action){
//網(wǎng)絡(luò)改變
Log.i(TAG,"NETWORK_CHANGE")
val connectivityManager =
context?.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val info = connectivityManager.activeNetworkInfo
if (info != null && info.isConnected) {
val type = info.type
Log.i(TAG,"network isconnected ,type is $type")
} else {
Log.i(TAG,"network disconnected ,type is -1")
}
}
}
}
這里要添加兩個(gè)權(quán)限到AndroidManifest.xml下
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
再注冊一下NetWorkReciever
<receiver android:name=".reciever.NetWorkReciever">
<intent-filter>
<action android:name="android.intent.action.CONNECTIVITY_CHANGE"/>
</intent-filter>
最終運(yùn)行效果
image.png
代碼地址:https://github.com/jiaoery/MyAndroidKotlin(也有一些其他的代碼學(xué)習(xí)記錄)
image.png