ToolkitX
知识库工具箱

Android 开发入门

Activity, Intent, Jetpack Compose

30min·进阶

01. Kotlin 基础语法

Kotlin 是 JetBrains 开发的现代 JVM 语言,现在是 Android 开发的官方语言。var 声明可变变量,val 声明不可变(推荐用 val)。类型写在冒号后面,变量名前面。分号可写可不写。字符串模板用 $var 或 ${expr}。空安全是杀手特性,? 后缀表示可空类型。
kotlin
fun main() {
    // 变量
    val name: String = "小明"
    var age = 18  // 类型推断
    
    // 字符串模板
    println("你好, $name, 你${age + 1}岁了")
    
    // 空安全
    var nullable: String? = null
    val length = nullable?.length ?: 0  // Elvis 操作符给默认值
    // nullable!!.length  // 强制解包,如果是 null 就崩
    
    // when 表达式
    val grade = when (age) {
        in 0..6 -> "幼儿"
        in 7..17 -> "学生"
        else -> "成人"
    }
    
    // 数据类 - 一行搞定
    data class User(val name: String, val email: String)
}
Elvis 操作符 ?: 是 Kotlin 最好用的特性之一,给可空值提供默认值的简洁写法。

02. Activity 生命周期

Activity 是 Android 的一个页面,有自己的生命周期。onCreate 创建时调用(只一次),onStart 可见但不在前台,onResume 在前台可交互,onPause 暂停(如弹窗覆盖),onStop 完全不可见,onDestroy 销毁。理解生命周期是写 Android 的基础,不然各种闪退。
kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        println("onCreate - 创建")
    }
    
    override fun onStart() {
        super.onStart()
        println("onStart - 可见了")
    }
    
    override fun onResume() {
        super.onResume()
        println("onResume - 可以交互了")
    }
    
    override fun onPause() {
        super.onPause()
        println("onPause - 失去焦点")
        // 保存临时数据
    }
    
    override fun onStop() {
        super.onStop()
        println("onStop - 不可见了")
    }
    
    override fun onDestroy() {
        super.onDestroy()
        println("onDestroy - 销毁")
    }
}
旋转屏幕时 Activity 会重建(销毁再创建),要注意保存状态。

03. RecyclerView 列表

RecyclerView 是 Android 上显示长列表的标准组件,比旧的 ListView 高效很多因为它会回收复用的 item 视图。需要一个 Adapter 提供数据和创建 ViewHolder,一个 LayoutManager 决定排列方式(线性、网格、瀑布流)。配合 ViewBinding 写起来比 findViewById 舒服。
kotlin
// Adapter
class UserAdapter(
    private val users: List<User>,
    private val onItemClick: (User) -> Unit
) : RecyclerView.Adapter<UserAdapter.ViewHolder>() {
    
    class ViewHolder(binding: ItemUserBinding) : RecyclerView.ViewHolder(binding.root) {
        val nameText = binding.nameText
        val emailText = binding.emailText
    }
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemUserBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val user = users[position]
        holder.nameText.text = user.name
        holder.emailText.text = user.email
        holder.itemView.setOnClickListener { onItemClick(user) }
    }
    
    override fun getItemCount() = users.size
}

// 使用
recyclerView.adapter = UserAdapter(users) { user ->
    Toast.makeText(this, "点击了 ${user.name}", Toast.LENGTH_SHORT).show()
}
recyclerView.layoutManager = LinearLayoutManager(this)
AsyncListDiffer 可以在列表更新时自动计算差异并优雅地动画刷新,比 notifyDataSetChanged 体验好。

04. ViewModel 和 LiveData

ViewModel 保存 UI 数据,在配置改变(如旋转)时不销毁。LiveData 是可观察的数据容器,数据变化时自动通知 UI 更新。配合 lifecycle 作用域,LiveData 只通知活跃的 UI,不用担心内存泄漏。这是 Android 推荐的架构组件。
kotlin
class MainViewModel : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users
    
    fun loadUsers() {
        viewModelScope.launch {
            // 模拟网络请求
            val result = fetchUsersFromApi()
            _users.value = result
        }
    }
    
    private suspend fun fetchUsersFromApi(): List<User> {
        delay(1000)
        return listOf(User("小明", "[email protected]"))
    }
}

// Activity 中使用
class MainActivity : AppCompatActivity() {
    private val viewModel: MainViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        viewModel.users.observe(this) { users ->
            // 数据变化时更新 UI
            adapter.submitList(users)
        }
        
        viewModel.loadUsers()
    }
}
viewModelScope 是 ViewModel 自带的协程作用域,ViewModel 销毁时自动取消所有协程。

05. Jetpack Compose 入门(现代 UI)

Compose 是 Android 的现代声明式 UI 工具包,用 Kotlin 代码写 UI。@Composable 函数描述界面,状态变化时自动重组。不再需要 XML 布局文件,UI 和逻辑在同一个 Kotlin 文件里。LazyColumn 替代 RecyclerView,简单到只有几行代码。
kotlin
@Composable
fun UserListScreen() {
    var users by remember { mutableStateOf(listOf<User>()) }
    
    LaunchedEffect(Unit) {
        users = fetchUsers()
    }
    
    Scaffold(
        topBar = { TopAppBar(title = { Text("用户列表") }) }
    ) { padding ->
        LazyColumn(contentPadding = padding) {
            items(users) { user ->
                UserCard(user)
            }
        }
    }
}

@Composable
fun UserCard(user: User) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp)
            .clickable { println("点击: ${user.name}") }
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text(user.name, style = MaterialTheme.typography.headlineSmall)
            Text(user.email, style = MaterialTheme.typography.bodyMedium)
        }
    }
}
Compose 的 remember 和 LaunchedEffect 配合使用,能实现以前需要多个生命周期方法才能做的事。

知识测验

1/4正确 0

Kotlin 中 val 和 var 的区别?

下一节

协程深入

下一节