首页 / Android 入门教程 / Activity 基础

Android 入门教程

Activity 基础

本教程共 100 篇 · 第 24 篇 · 更新于 2026-07-28 · 约 7 分钟阅读

AndroidAndroid 入门教程Activity活动ComponentActivity单 Activity 架构Compose

24. Activity 基础

本节目标:理解 Activity 是什么、会创建和注册 Activity、会启动和关闭 Activity、知道现代 Compose 项目的单 Activity 架构是怎么回事。

Activity 是什么

活动(Activity)是 Android 应用的 UI 入口,一个 Activity 通常对应一个屏幕。用户能看到的、能点的界面,都装在 Activity 提供的窗口里。

跟普通桌面应用不同,Android 应用的入口不是 main 函数,而是系统通过生命周期回调启动 Activity。一个应用可以有多个 Activity,每个 Activity 都是独立的入口点—别的应用能直接启动你的某个 Activity(比如点「分享」调起你的分享界面)。

Activity 的现代定位

在传统 View 时代,一个应用有几十个 Activity,每个屏幕一个。导航靠 startActivity 跳来跳去。

到了 Compose 时代,官方推荐单 Activity 架构:整个应用只有一个 MainActivity,所有屏幕用 Compose 可组合函数 + Navigation 组件管理。Activity 退化为「Compose 的宿主」。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyAppTheme {
                AppNavHost()        // 所有屏幕导航都在这
            }
        }
    }
}
Note
  • 单 Activity 不是强制,传统多 Activity 也能用。但 Compose + Navigation 的单 Activity 方案能避免 Activity 切换的卡顿和状态丢失,是现代推荐做法。本教程以单 Activity 为主,但传统多 Activity 用法也会讲,因为你可能维护老项目。

创建 Activity

第 1 步:写 Kotlin 类

继承 ComponentActivity(Compose 用)或 AppCompatActivity(传统 View 用):

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text

class SecondActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Text("这是第二个 Activity")
        }
    }
}

第 2 步:在 Manifest 注册

每个 Activity 都必须在 AndroidManifest.xml 声明:

<application ...>
    <activity
        android:name=".SecondActivity"
        android:exported="false" />
</application>
Warning
  • 漏了注册会崩溃:ActivityNotFoundException。用 Android Studio 向导新建 Activity(右键包 -> New -> Activity)会自动注册,手动建文件要自己加。

第 3 步:设为入口(可选)

想让某个 Activity 成为桌面图标启动的入口,给它加 intent-filter:

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

一个应用通常只有一个入口 Activity。android:exported="true" 表示能被外部启动(桌面启动器要能调起它)。

启动 Activity

startActivity + Intent 启动:

// 显式 Intent:指定类名
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

// 带数据
val intent = Intent(this, SecondActivity::class.java).apply {
    putExtra("user_id", 1001L)
    putExtra("user_name", "张三")
}
startActivity(intent)

被启动的 Activity 取数据:

class SecondActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val userId = intent.getLongExtra("user_id", 0L)
        val userName = intent.getStringExtra("user_name") ?: "未知"
        setContent {
            Text("用户:$userName (ID: $userId)")
        }
    }
}

第 29 章细讲 Intent,第 28 章讲数据传递。

关闭 Activity

  • finish():关闭当前 Activity,回到上一个。
  • finishAffinity():关闭当前任务栈里所有 Activity(退出应用)。
  • 按返回键相当于 finish()
// 完成操作后关闭自己
saveButton.setOnClickListener {
    saveData()
    finish()
}

Activity 之间是什么关系

Activity 之间没有继承关系,它们通过 Intent任务栈(Task)关联:

  • 启动 Activity A -> A 入栈。
  • A 启动 B -> B 入栈,A 在底下。
  • B finish() -> B 出栈,A 重新显示。

这个栈叫返回栈(Back Stack),第 27 章细讲。返回键就是出栈当前 Activity。

Activity 的 Context

Activity 是 Context 的子类,所以能做 Context 能做的事:访问资源、启动组件、获取系统服务。

class MainActivity : ComponentActivity() {
    fun doSomething() {
        val appName = getString(R.string.app_name)       // Context 的方法
        val inflater = LayoutInflater.from(this)
        startActivity(Intent(this, SecondActivity::class.java))
    }
}
Warning
  • Activity Context 跟 Activity 生命周期绑定。别把 Activity Context 存到静态变量或单例里,Activity 销毁了它还引用着,内存泄漏。需要长期持有的用 applicationContext

单 Activity + Compose 示例

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()                          // 边到边显示
        setContent {
            MyAppTheme {
                AppNavHost()
            }
        }
    }
}

@Composable
fun AppNavHost() {
    val navController = rememberNavController()
    NavHost(navController, startDestination = "home") {
        composable("home") { HomeScreen(onClick = { navController.navigate("detail") }) }
        composable("detail") { DetailScreen(onBack = { navController.popBackStack() }) }
    }
}

导航用 Navigation Compose 组件,屏幕切换在 Compose 内部完成,不涉及 Activity 切换,过渡更流畅,状态也好保存。

传统多 Activity 何时还用

虽然单 Activity 是主流,这些场景仍可能用多 Activity:

  • 老项目迁移,逐步 Compose 化。
  • 某些屏幕要被外部应用调起(如支付 SDK 的回调 Activity)。
  • 特定功能需要独立进程(android:process)。
  • Wear OS、TV 等特殊形态。

小结

Activity 是 UI 入口,现代 Compose 项目用单 Activity 架构,Activity 作为 Compose 宿主。创建 Activity 要写类继承 ComponentActivity 并在 Manifest 注册。启动用 startActivity + Intent,关闭用 finish()。Activity 是 Context,但别长期持有。下一节深入 Activity 生命周期。