第五章:状态管理与数据流
Activity 生命周期
如果你熟悉 React 组件的生命周期,那么理解 Activity 的生命周期会相对容易。不过 Android 的生命周期更加复杂和细致:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 类似 React 的 componentDidMount
}
override fun onResume() {
super.onResume()
// Activity 可见且可交互
}
override fun onPause() {
super.onPause()
// Activity 失去焦点,但仍可见
}
override fun onDestroy() {
super.onDestroy()
// 类似 React 的 componentWillUnmount
}
}
数据绑定与视图更新
使用 ViewBinding
ViewBinding 是 Android 推荐的视图绑定方式,类似于 Vue 的 v-model:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 直接访问视图
binding.userNameInput.setText("Hello")
binding.submitButton.setOnClickListener {
val userName = binding.userNameInput.text.toString()
updateUI(userName)
}
}
}
DataBinding
DataBinding 提供了更强大的数据绑定能力,类似于 Vue 的模板语法:
<layout>
<data>
<variable
name="user"
type="com.example.User" />
</data>
<LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{String.valueOf(user.age)}" />
</LinearLayout>
</layout>
class User(
val name: String,
val age: Int
)
// 在 Activity 中使用
binding.user = User("张三", 25)
状态管理方案
ViewModel
ViewModel 类似于 Vue 的状态管理,用于管理 UI 相关的数据:
class UserViewModel : ViewModel() {
private val _userName = MutableLiveData<String>()
val userName: LiveData<String> = _userName
fun updateUserName(name: String) {
_userName.value = name
}
}
// 在 Activity 中使用
class MainActivity : AppCompatActivity() {
private val viewModel: UserViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.userName.observe(this) { name ->
binding.userNameText.text = name
}
}
}
StateFlow
StateFlow 是基于协程的状态管理方案,类似于 Redux:
class UserViewModel : ViewModel() {
private val _uiState = MutableStateFlow(UiState())
val uiState: StateFlow<UiState> = _uiState.asStateFlow()
fun updateUserName(name: String) {
_uiState.update { currentState ->
currentState.copy(userName = name)
}
}
}
data class UiState(
val userName: String = "",
val isLoading: Boolean = false
)
组件间通信
Intent 通信
Intent 用于 Activity 间通信,类似于 Web 中的路由参数传递:
// 发送数据
val intent = Intent(this, SecondActivity::class.java).apply {
putExtra("user_name", "张三")
putExtra("user_age", 25)
}
startActivity(intent)
// 接收数据
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val userName = intent.getStringExtra("user_name")
val userAge = intent.getIntExtra("user_age", 0)
}
}
EventBus
对于组件间的解耦通信,可以使用 EventBus,类似于 Vue 的事件总线:
// 定义事件
data class MessageEvent(val message: String)
// 发送事件
EventBus.getDefault().post(MessageEvent("Hello"))
// 接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent) {
Toast.makeText(this, event.message, Toast.LENGTH_SHORT).show()
}
这些状态管理和通信方案可能看起来很多,但它们各自有其适用场景。在实际开发中,我们通常会根据具体需求选择合适的方案。下一章我们将介绍 Android 中的存储与网络请求,这与前端开发中的数据持久化和 API 调用有很多相似之处。