Android Activity 与 Intent 学习笔记
本笔记基于 HelloWorld1 项目实践整理,适合有 Java 后端基础的开发者
一、Activity 是什么?
Activity = 一个页面/屏幕,是 Android 应用的基本组成部分。
类比后端
| Android | 后端类比 |
|---|---|
| Activity | Controller + 对应的 View(一个完整页面) |
| 布局文件 XML | Thymeleaf/HTML 模板 |
| ViewBinding | 模板引擎的上下文变量 |
Activity 的完整结构
kotlin
class FirstActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. 指定布局文件(页面长什么样)
setContentView(R.layout.first_layout)
// 2. 初始化操作
setupViews()
loadData()
}
}
二、Activity 的生命周期(Hook)
Activity 有一套生命周期回调方法,相当于后端的 Hook。
核心生命周期方法
| 方法 | 触发时机 | 用途 |
|---|---|---|
onCreate() |
创建时,只调一次 | 初始化、找控件、设监听器 |
onStart() |
开始可见 | 页面即将显示 |
onResume() |
获得焦点,可交互 | 页面可操作 |
onPause() |
失去焦点 | 保存临时数据 |
onStop() |
完全不可见 | 释放资源 |
onDestroy() |
销毁时 | 清理工作 |
onRestart() |
从后台回来 | 重新启动 |
生命周期流程图

启动 App
│
│ onCreate() ← 创建
│ onStart() ← 开始可见
│ onResume() ← 可交互
│
▼
运行中...
│
▼
按 Home 键
│
│ onPause()
│ onStop()
│
▼
后台
│
▼
切回来
│
│ onRestart()
│ onStart()
│ onResume()
│
▼
退出 App
│
│ onPause()
│ onStop()
│ onDestroy()
类比后端
| Android | 后端类比 |
|---|---|
onCreate() |
@PostConstruct |
onDestroy() |
@PreDestroy |
onPause() |
暂停任务 |
onSaveInstanceState() |
session.setAttribute() |
三、Intent 是什么?
Intent = 意图,告诉 Android 系统"我要做什么",系统找到对应的组件来处理。
Intent 的组成
kotlin
val intent = Intent()
intent.action = "com.example.SOME_ACTION" // 动作
intent.data = Uri.parse("https://xxx") // 数据
intent.category = "DEFAULT" // 分类
intent.putExtra("key", "value") // 额外数据
intent.component = ComponentName(...) // 指定目标(显式)
四、Intent 两种类型
4.1 显式 Intent
直接指定目标 Activity,明确告诉系统找谁。
kotlin
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("message", "来自第一个页面!")
startActivity(intent)
类比: 直接 forward(request, response, TargetController.class)
4.2 隐式 Intent
只描述动作和数据,让系统去找谁能处理。
kotlin
// Manifest 中注册
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.helloworld1.ACTION_SECOND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
// 调用方
val intent = Intent("com.example.helloworld1.ACTION_SECOND")
intent.addCategory(Intent.CATEGORY_DEFAULT)
intent.putExtra("message", "来自第一个页面!")
startActivity(intent)
类比: 领导说"我要开会",秘书找所有会议室,用户自己选。
五、数据传递
发送数据
kotlin
// 发送方
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("name", "张三") // String
intent.putExtra("age", 25) // Int
intent.putExtra("isVip", true) // Boolean
startActivity(intent)
接收数据
kotlin
// 接收方
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val name = intent.getStringExtra("name")
val age = intent.getIntExtra("age", 0) // 0 是默认值
val isVip = intent.getBooleanExtra("isVip", false)
}
数据回传(startActivityForResult)
kotlin
// 第一个页面:请求返回结果
val intent = Intent(this, SecondActivity::class.java)
startActivityForResult(intent, 1) // 请求码用于区分多个返回
// 第一个页面:接收返回
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK) {
val result = data?.getStringExtra("result")
}
}
// 第二个页面:返回数据
val intent = Intent()
intent.putExtra("result", "处理完成!")
setResult(RESULT_OK, intent)
finish()
六、系统内置 ACTION 一览
| ACTION | 意思 | 配合 Data | 打开什么 |
|---|---|---|---|
ACTION_VIEW |
查看 | https://xxx |
浏览器 |
ACTION_DIAL |
拨号(预览) | tel:10086 |
拨号盘 |
ACTION_CALL |
打电话 | tel:10086 |
直接拨打(需权限) |
ACTION_SEND |
发送 | 无 | 分享选择框 |
ACTION_SENDTO |
发给谁 | smsto:10086 |
短信 |
ACTION_EDIT |
编辑 | content://xxx |
编辑页面 |
ACTION_MAIN |
主入口 | 无 | App 启动入口 |
常用隐式 Intent 示例
kotlin
// 打开网页
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.baidu.com"))
startActivity(intent)
// 拨打电话(弹拨号盘,不直接打)
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:10086"))
startActivity(intent)
// 发送短信
val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:10086"))
intent.putExtra("sms_body", "你好")
startActivity(intent)
// 分享内容
val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_TEXT, "分享内容")
startActivity(Intent.createChooser(intent, "分享到"))
// 发邮件
val intent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:example@mail.com"))
intent.putExtra(Intent.EXTRA_SUBJECT, "主题")
intent.putExtra(Intent.EXTRA_TEXT, "正文")
startActivity(intent)
// 打开地图
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:39.9,116.4?q=北京"))
startActivity(intent)
七、布局与 View
Layout(容器)vs View(组件)
| 概念 | 作用 | 例子 |
|---|---|---|
| Layout | 负责排列规则 | LinearLayout、ConstraintLayout |
| View | 最小显示单元 | Button、TextView、ImageView |
项目中的布局结构
xml
<LinearLayout <!-- 容器:垂直排列 -->
android:orientation="vertical">
<Toolbar /> <!-- View:标题栏 -->
<ConstraintLayout /> <!-- ViewGroup:装内容的容器 -->
└── <Button /> <!-- View:按钮 -->
</LinearLayout>
命名空间
| 命名空间 | 前缀 | 来源 | 作用 |
|---|---|---|---|
android: |
android | Android 系统 | 标准属性 |
app: |
app | 第三方库 | 库自定义属性 |
tools: |
tools | Android Studio | 仅预览用,不打包 |
xml
<TextView
android:id="@+id/button1" <!-- android: 系统属性 -->
app:titleTextColor="@android:color/white" <!-- app: 库属性 -->
tools:text="预览文字" <!-- tools: 仅 IDE 预览 -->
/>
八、Toolbar 标题栏
布局中添加 Toolbar
xml
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:title="页面标题"
app:titleTextColor="@android:color/white" />
</LinearLayout>
Activity 中注册
kotlin
setSupportActionBar(binding.toolbar)
supportActionBar?.title = "动态标题"
九、Menu 菜单
1. 创建菜单资源文件
res/menu/main_menu.xml
xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_add"
android:title="添加" />
<item
android:id="@+id/menu_search"
android:title="搜索" />
</menu>
2. Activity 中声明和响应
kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.menu_add -> { /* 处理 */; true }
R.id.menu_search -> { /* 处理 */; true }
else -> super.onOptionsItemSelected(item)
}
}
十、ViewBinding 视图绑定
开启配置
kotlin
// build.gradle.kts
buildFeatures {
viewBinding = true
}
Activity 中使用
kotlin
private lateinit var binding: FirstLayoutBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = FirstLayoutBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button1.setOnClickListener { /* ... */ }
}
命名规则: first_layout.xml → FirstLayoutBinding
十一、R.java 资源索引
编译时自动生成,存储所有资源的整型常量映射。
XML 里写的 编译后变成
─────────────────────────────────────────────────
android:id="@+id/button1" → R.id.button1
android:text="@string/hello" → R.string.hello
类比
| Android | 后端 |
|---|---|
R.java |
Bean 名称映射表 |
R.id.button1 |
Bean 的名字 |
xml @+id/ |
@Component("button1") |
十二、Android Bar 体系
| Bar | 位置 | 作用 |
|---|---|---|
| StatusBar | 屏幕最顶部 | 系统信息(信号、wifi、电量、时间) |
| ActionBar/Toolbar | StatusBar 下方 | App 标题、菜单、导航 |
| NavigationBar | 屏幕底部 | 系统导航(全面屏手机) |
| BottomNavigationBar | 内容区底部 | App 内底部 Tab 导航 |
┌─────────────────────────────┐
│ StatusBar(状态栏) │ ← 系统级别
│ 信号 wifi 电量 时间 │
├─────────────────────────────┤
│ ActionBar / Toolbar │ ← App 级别
│ App 名称 菜单按钮 │
├─────────────────────────────┤
│ │
│ 内容区域 │
│ │
├─────────────────────────────┤
│ BottomNavigationBar │ ← App 级别
└─────────────────────────────┘
十三、隐式 Intent 工作流程
显式 Intent → 直接定位目标
↓
隐式 Intent → 系统扫描所有 App 的 Manifest
↓
找注册了对应 ACTION 的 Activity
↓
如果多个 → 弹出选择框
↓
启动选中的 Activity
十四、项目文件结构参考
app/src/main/
├── java/com/example/helloworld1/
│ ├── FirstActivity.kt # 入口 Activity
│ └── SecondActivity.kt # 被跳转的 Activity
├── res/
│ ├── layout/
│ │ ├── first_layout.xml # FirstActivity 的布局
│ │ └── second_layout.xml # SecondActivity 的布局
│ ├── menu/
│ │ └── main_menu.xml # 菜单配置
│ └── values/
│ └── themes.xml # 主题配置
└── AndroidManifest.xml # 应用配置清单
十五、常见错误排查
| 问题 | 原因 | 解决 |
|---|---|---|
找不到 R.id.xxx |
未同步 Gradle | Sync Project |
minSdkVersion 冲突 |
库要求更高版本 | 提高 minSdk |
| 隐式 Intent 匹配失败 | 未加 CATEGORY_DEFAULT |
intent.addCategory(Intent.CATEGORY_DEFAULT) |
| 布局预览不显示 | 缺 tools: 命名空间 |
添加 xmlns:tools |
| ViewBinding 找不到类 | 未开启 viewBinding | buildFeatures { viewBinding = true } |