feat: 添加对网络状态监听的支持

This commit is contained in:
Quyunshuo
2021-07-11 18:24:34 +08:00
parent 3d331749cc
commit 627d4ec0da
6 changed files with 223 additions and 8 deletions

View File

@ -2,16 +2,12 @@ package com.quyunshuo.androidbaseframemvvm.base.mvvm.v
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.viewbinding.ViewBinding
import com.alibaba.android.arouter.launcher.ARouter
import com.jaeger.library.StatusBarUtil
import com.quyunshuo.androidbaseframemvvm.base.R
import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
import com.quyunshuo.androidbaseframemvvm.base.utils.BindingReflex
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusRegister
import com.quyunshuo.androidbaseframemvvm.base.utils.EventBusUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.ViewRecreateHelper
import com.quyunshuo.androidbaseframemvvm.base.utils.*
import com.quyunshuo.androidbaseframemvvm.base.utils.network.AutoRegisterNetListener
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateChangeListener
/**
* Activity基类
@ -20,7 +16,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.ViewRecreateHelper
* @since 8/27/20
*/
abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppCompatActivity(),
FrameView<VB> {
FrameView<VB>, NetworkStateChangeListener {
protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) {
BindingReflex.reflexViewBinding(javaClass, layoutInflater)
@ -45,10 +41,18 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppComp
setStatusBar()
mBinding.initView()
initNetworkListener()
initObserve()
initRequestData()
}
/**
* 初始化网络状态监听
* @return Unit
*/
private fun initNetworkListener() {
lifecycle.addObserver(AutoRegisterNetListener(this))
}
/**
* 设置状态栏
@ -57,6 +61,22 @@ abstract class BaseFrameActivity<VB : ViewBinding, VM : BaseViewModel> : AppComp
*/
open fun setStatusBar() {}
/**
* 网络类型更改回调
* @param type Int 网络类型
* @return Unit
*/
override fun networkTypeChange(type: Int) {}
/**
* 网络连接状态更改回调
* @param isConnected Boolean 是否已连接
* @return Unit
*/
override fun networkConnectChange(isConnected: Boolean) {
toast(if (isConnected) "网络已连接" else "网络已断开")
}
override fun isRecreate(): Boolean = mStatusHelper?.isRecreate ?: false
override fun onSaveInstanceState(outState: Bundle) {

View File

@ -0,0 +1,41 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.network
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
/**
* 自动注册网络状态监听
* 使用的是[androidx.lifecycle.LifecycleObserver]来同步生命周期
*
* @author Qu Yunshuo
* @since 2021/7/11 4:56 下午
*/
class AutoRegisterNetListener constructor(listener: NetworkStateChangeListener) :
LifecycleObserver {
/**
* 当前需要自动注册的监听器
*/
private var mListener: NetworkStateChangeListener? = null
init {
mListener = listener
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun register() {
mListener?.run { NetworkStateClient.setListener(this) }
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun unregister() {
NetworkStateClient.removeListener()
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun clean() {
NetworkStateClient.removeListener()
mListener = null
}
}

View File

@ -0,0 +1,59 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.network
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
/**
* 实时监听网络状态变化的[ConnectivityManager.NetworkCallback]实现类
*
* @author Qu Yunshuo
* @since 2021/7/10 5:38 下午
*/
class NetworkCallbackImpl : ConnectivityManager.NetworkCallback() {
/**
* 当前网络类型
*/
var currentNetworkType = -1
/**
* 当前网络是否已连接
*/
var isConnected = false
/**
* 注册的监听
*/
var changeCall: NetworkStateChangeListener? = null
override fun onAvailable(network: Network) {
super.onAvailable(network)
isConnected = true
changeCall?.networkConnectChange(isConnected)
}
override fun onLost(network: Network) {
super.onLost(network)
isConnected = false
changeCall?.networkConnectChange(isConnected)
}
override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities)
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
currentNetworkType = when {
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
NetworkCapabilities.TRANSPORT_WIFI
}
networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
NetworkCapabilities.TRANSPORT_CELLULAR
}
else -> {
NetworkCapabilities.TRANSPORT_WIFI
}
}
changeCall?.networkTypeChange(currentNetworkType)
}
}
}

View File

@ -0,0 +1,24 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.network
/**
* 网络状态改变监听起
*
* @author Qu Yunshuo
* @since 2021/7/11 4:56 下午
*/
interface NetworkStateChangeListener {
/**
* 网络类型更改回调
* @param type Int 网络类型
* @return Unit
*/
fun networkTypeChange(type: Int)
/**
* 网络连接状态更改回调
* @param isConnected Boolean 是否已连接
* @return Unit
*/
fun networkConnectChange(isConnected: Boolean)
}

View File

@ -0,0 +1,60 @@
package com.quyunshuo.androidbaseframemvvm.base.utils.network
import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.NetworkRequest
import androidx.annotation.RequiresPermission
import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
/**
* 网络状态监听
*
* @author Qu Yunshuo
* @since 2021/7/11 3:58 下午
*/
object NetworkStateClient {
private val mNetworkCallback = NetworkCallbackImpl()
/**
* 注册网络监听客户端
* @return Unit
*/
@RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE)
fun register() {
val build = NetworkRequest.Builder().build()
val cm =
BaseApplication.context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
cm.registerNetworkCallback(build, mNetworkCallback)
}
/**
* 设置监听器
* @param listener NetworkStateChangeListener 监听器
* @return Unit
*/
fun setListener(listener: NetworkStateChangeListener) {
mNetworkCallback.changeCall = listener
}
/**
* 移除监听器
* @return Unit
*/
fun removeListener() {
mNetworkCallback.changeCall = null
}
/**
* 获取网络类型 其他类型的网络归为了WIFI如果需要细分可以对[NetworkCallbackImpl]进行追加分类
* @return Int WIFI:[NetworkCapabilities.TRANSPORT_WIFI]、移动网络:[NetworkCapabilities.TRANSPORT_CELLULAR]
*/
fun getNetworkType(): Int = mNetworkCallback.currentNetworkType
/**
* 网络是否连接
* @return Boolean
*/
fun isConnected(): Boolean = mNetworkCallback.isConnected
}

View File

@ -12,6 +12,7 @@ import com.quyunshuo.androidbaseframemvvm.base.app.InitDepend
import com.quyunshuo.androidbaseframemvvm.base.constant.VersionStatus
import com.quyunshuo.androidbaseframemvvm.base.utils.ProcessUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.SpUtils
import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateClient
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.smtt.export.external.TbsCoreSettings
import com.tencent.smtt.sdk.QbSdk
@ -69,6 +70,7 @@ class CommonApplication : ApplicationLifecycle {
if (ProcessUtils.isMainProcess(BaseApplication.context)) {
worker.add { initMMKV() }
worker.add { initARouter() }
main.add { initNetworkStateClient() }
}
worker.add { initTencentBugly() }
return InitDepend(main, worker)
@ -81,6 +83,15 @@ class CommonApplication : ApplicationLifecycle {
initX5WebViewCore()
}
/**
* 初始化网络状态监听客户端
* @return Unit
*/
private fun initNetworkStateClient(): String {
NetworkStateClient.register()
return "NetworkStateClient -->> init complete"
}
/**
* 腾讯TBS WebView X5 内核初始化
*/