高版本網絡監聽方案更新

最近在更新之前的一些java代碼到kotlin去,然後把原來的NetReciever更新爲kotlin版本,然後as給了我以下的錯誤:

wtf?這是什麼情況,仔細把提示的文字閱讀一遍。。。

原來CONNECTIVITY_ACTION已經過時,這裏官方推薦使用 requestNetwork,registerNetworkCallbackor registerDefaultNetworkCallback來替換原有的BroadcastReciever方案,既然如此,就嘗試來改造一番。

首先根據不同的版本區分不同的監聽方案

主方法

//網絡變化監聽器
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,"網絡已鏈接")
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        Log.i(TAG,"網絡已斷開")
    }


    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已經連接")
                }
                //數據流量
                networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    Log.i(TAG,"數據流量已經連接")
                }
                else -> {
                    Log.i(TAG,"其他網絡")
                }
            }
        }

    }
}

然後補充一下原來NetWorkReciever的代碼

class NetWorkReciever:BroadcastReceiver() {

    companion object{
        const val TAG = "NetWork"
    }

    override fun onReceive(context: Context?, intent: Intent?) {
        if(ConnectivityManager.CONNECTIVITY_ACTION==intent?.action){

            //網絡改變
            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")
            }
        }
    }
}

這裏要添加兩個權限到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>

最終運行效果

代碼地址:https://github.com/jiaoery/MyAndroidKotlin(也有一些其他的代碼學習記錄)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章