feat: 添加对网络状态监听的支持
This commit is contained in:
@ -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) {
|
||||
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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 内核初始化
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user