You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android/Kotlin如何创建全局状态变量实现跨Activity网络状态同步?

可行的内置方案推荐

以下是Android/Kotlin原生内置的几种方案,无需依赖第三方库,也不用通过继承BaseActivity来实现:

1. LiveData + Application级ViewModel(Jetpack内置)

利用Jetpack的ViewModel和LiveData实现全局状态通知,ViewModel绑定Application生命周期,确保全局唯一且不会因页面销毁丢失状态:

  • 先创建一个全局ViewModel,持有网络状态的LiveData:
class NetworkStateViewModel(application: Application) : AndroidViewModel(application) {
    val isNetworkAvailable = MutableLiveData<Boolean>()

    fun updateNetworkState(available: Boolean) {
        isNetworkAvailable.value = available
    }
}
  • 在任意Activity中通过以下方式获取全局实例:
val viewModel = ViewModelProvider(
    this,
    ViewModelProvider.AndroidViewModelFactory.getInstance(application)
)[NetworkStateViewModel::class.java]
  • 网络状态变化时调用updateNetworkState更新值,各个Activity只需观察isNetworkAvailable:
viewModel.isNetworkAvailable.observe(this) { isAvailable ->
    // 在这里设置控件是否可点击
    button.isEnabled = isAvailable
}

2. ConnectivityManager.NetworkCallback(系统原生API)

这是Android 7.0+官方推荐的网络状态监听方案,替代传统的BroadcastReceiver,可靠性更高:

  • 在Application类中注册NetworkCallback,维护全局网络状态,结合LiveData通知页面:
class MyApp : Application() {
    val isNetworkAvailable = MutableLiveData<Boolean>()
    private lateinit var connectivityManager: ConnectivityManager

    override fun onCreate() {
        super.onCreate()
        connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkCallback = object : ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                super.onAvailable(network)
                isNetworkAvailable.postValue(true)
            }

            override fun onLost(network: Network) {
                super.onLost(network)
                isNetworkAvailable.postValue(false)
            }
        }
        connectivityManager.registerDefaultNetworkCallback(networkCallback)
    }
}
  • 各个Activity中通过Application实例获取LiveData并观察:
val app = application as MyApp
app.isNetworkAvailable.observe(this) { isAvailable ->
    button.isEnabled = isAvailable
}

3. Kotlin Object单例 + Flow

利用Kotlin天生的单例特性,结合Flow实现响应式状态通知,适合轻量场景:

  • 创建单例类维护网络状态:
object NetworkStateManager {
    private var _isNetworkAvailable = false
    val isNetworkAvailable: Boolean get() = _isNetworkAvailable
    // 用StateFlow实现状态订阅
    private val _networkStateFlow = MutableStateFlow(_isNetworkAvailable)
    val networkStateFlow = _networkStateFlow.asStateFlow()

    fun updateNetworkState(available: Boolean) {
        _isNetworkAvailable = available
        _networkStateFlow.value = available
    }
}
  • 网络状态变化时调用updateNetworkState,在Activity中收集Flow:
lifecycleScope.launch {
    NetworkStateManager.networkStateFlow.collect { isAvailable ->
        button.isEnabled = isAvailable
    }
}

这些方案都不需要通过继承BaseActivity来实现状态共享,每个Activity可以独立订阅状态变化并处理控件交互。

内容的提问来源于stack exchange,提问作者Saneen K P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:01:08