From 627d4ec0da18211a7cab2d5fe406affcb01e9c86 Mon Sep 17 00:00:00 2001 From: Quyunshuo Date: Sun, 11 Jul 2021 18:24:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E7=8A=B6=E6=80=81=E7=9B=91=E5=90=AC=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mvvm/v/BaseFrameActivity.kt | 36 ++++++++--- .../utils/network/AutoRegisterNetListener.kt | 41 +++++++++++++ .../base/utils/network/NetworkCallbackImpl.kt | 59 ++++++++++++++++++ .../network/NetworkStateChangeListener.kt | 24 ++++++++ .../base/utils/network/NetworkStateClient.kt | 60 +++++++++++++++++++ .../common/CommonApplication.kt | 11 ++++ 6 files changed, 223 insertions(+), 8 deletions(-) create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/AutoRegisterNetListener.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkCallbackImpl.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateChangeListener.kt create mode 100644 lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateClient.kt diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt index 61d192a..086f0c1 100644 --- a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/mvvm/v/BaseFrameActivity.kt @@ -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 : AppCompatActivity(), - FrameView { + FrameView, NetworkStateChangeListener { protected val mBinding: VB by lazy(mode = LazyThreadSafetyMode.NONE) { BindingReflex.reflexViewBinding(javaClass, layoutInflater) @@ -45,10 +41,18 @@ abstract class BaseFrameActivity : AppComp setStatusBar() mBinding.initView() + initNetworkListener() initObserve() initRequestData() } + /** + * 初始化网络状态监听 + * @return Unit + */ + private fun initNetworkListener() { + lifecycle.addObserver(AutoRegisterNetListener(this)) + } /** * 设置状态栏 @@ -57,6 +61,22 @@ abstract class BaseFrameActivity : 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) { diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/AutoRegisterNetListener.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/AutoRegisterNetListener.kt new file mode 100644 index 0000000..9867aa9 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/AutoRegisterNetListener.kt @@ -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 + } +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkCallbackImpl.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkCallbackImpl.kt new file mode 100644 index 0000000..fe2d7c3 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkCallbackImpl.kt @@ -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) + } + } +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateChangeListener.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateChangeListener.kt new file mode 100644 index 0000000..77740cb --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateChangeListener.kt @@ -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) +} \ No newline at end of file diff --git a/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateClient.kt b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateClient.kt new file mode 100644 index 0000000..b060287 --- /dev/null +++ b/lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/utils/network/NetworkStateClient.kt @@ -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 +} \ No newline at end of file diff --git a/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt index df218f4..a8a5237 100644 --- a/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt +++ b/lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt @@ -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 内核初始化 */