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 }
相关推荐
辞旧 lekkk13 小时前
【Qt】信号和槽
linux·开发语言·数据库·qt·学习·mysql·萌新
阿巴斯甜15 小时前
ARouter
android
Andya_net16 小时前
MySQL | MySQL 8.0 权限管理实践-精确赋予库、表只读等权限
android·数据库·mysql
阿巴斯甜16 小时前
Map
android
巫山老妖16 小时前
鹅厂十年:三段式技术成长复盘
android·人工智能·程序员
爱上好庆祝17 小时前
学习js的第七天(wed APIs的开始)
前端·javascript·css·学习·html·css3
阿巴斯甜17 小时前
List集合
android
问心无愧051317 小时前
ctf show web入门37
笔记
羊群智妍17 小时前
2026生成式AI搜索优化:GEO监测工具全解析
笔记
ooseabiscuit17 小时前
Laravel6.x核心优化与特性全解析
android·开发语言·javascript