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
相关产品推荐
相关产品推荐

