Android Activity 与 Intent 学习笔记

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.xmlFirstLayoutBinding


十一、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 }
相关推荐
studyForMokey2 小时前
【Android面试】动画 & Bitmap
android·面试·职场和发展
Engineer邓祥浩2 小时前
JVM学习笔记(12) 第四部分 程序编译与代码优化 第11章 后端编译与优化
jvm·笔记·学习
羊群智妍2 小时前
2026年GEO监测工具,AI搜索优化免费指南
笔记
wangcheng3032 小时前
原创检测到底在检测什么
笔记
黑牛儿2 小时前
面试高频问题:从浏览器请求到PHP响应:完整流程拆解
android·后端·面试·php
rainbow7242442 小时前
AI学习路线分享:通用型认证与算法认证学习体验对比
人工智能·学习·算法
夜瞬2 小时前
NLP学习笔记10:Transformer 架构——从编码器、解码器到自注意力
笔记·学习·自然语言处理
像一只黄油飞3 小时前
第二章-04-数据类型
笔记·python·学习·零基础
elseif1233 小时前
初学者必背【考点清单(大全)】【上篇】
开发语言·c++·笔记·学习·循环结构·分支结构·考纲