背景
硬件设备有时候断网或者网络不佳的时候,需要做出相应逻辑,比如跳转到网络异常界面,或者从网络异常界面恢复,当然也可能只是简单的提示。
第一步
写receiver
//这里传入了一个全局的livedata参数过来
class NetworkReceiver(private val liveNetInfo: MutableLiveData<NetworkInfo?>) :
BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context ?: return LogUtils.e("网络广播 Context Cannot be null")
intent ?: return LogUtils.e("网络广播 Intent Cannot be null")
//获得ConnectivityManager对象
val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
//获取所有网络连接的信息
val networks = connMgr.allNetworks
val info = networks.map {
connMgr.getNetworkInfo(it)
}.firstOrNull {
it?.isConnected == true
}
liveNetInfo.postValue(info)
// LogUtils.d("网络广播 $info ping ${NetworkUtils.isAvailableByPing()}")
}
}
//上面全局的livedata就是在这里定义的
class MyApplication : BaseApplication() {
val liveNetworkStatus = MutableLiveData<NetworkInfo?>()
第二步
在合适位置注册广播
private var netReceiver: NetworkReceiver? = null
private fun initReceiver() {
val liveNetworkStatus = (application as MyApplication).liveNetworkStatus
netReceiver = NetworkReceiver(liveNetworkStatus)
val timeFilter = IntentFilter()
timeFilter.addAction("android.net.ethernet.ETHERNET_STATE_CHANGED")
timeFilter.addAction("android.net.ethernet.STATE_CHANGE")
timeFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE")
timeFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED")
timeFilter.addAction("android.net.wifi.STATE_CHANGE")
timeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
registerReceiver(netReceiver, timeFilter)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initReceiver()
}
override fun onDestroy() {
super.onDestroy()
netReceiver?.let {
unregisterReceiver(netReceiver)
}
}
第三步
监听并反馈逻辑给用户
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = FragmentErrorBinding.inflate(inflater)
binding.vm = viewModel
binding.lifecycleOwner = this
//观察网络标记status
(requireActivity().application as MyApplication).liveNetworkStatus.observe(
viewLifecycleOwner
) { netInfo: NetworkInfo? ->
if(netInfo?.isAvailable==true&&NetworkUtils.isAvailableByPing()){
callBack.fromPay2Home()
}
LogUtils.i("liveNetInfo $netInfo ping ${NetworkUtils.isAvailableByPing()}")
}
return binding.root
}