状态管理与数据流

128 阅读2分钟

第五章:状态管理与数据流

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 调用有很多相似之处。