Android开发学习笔记——12、Activity数据传递

Android开发学习笔记——12、Activity数据传递
一、概述Intent 是 Android 四大组件通信的核心媒介不仅可以启动页面还可以携带数据跨页面传输。Activity 之间无法直接互相访问变量所有页面通信必须通过 Intent 完成。Intent 分为两类显式 Intent、隐式 Intent。数据传递分为两类向下一级页面传值正向、向上一级页面回传值反向。二、Intent 两种类型核心区分1. 显式 Intent应用内部跳转特点直接指定目标 Activity 类名精准跳转只能打开本 App 页面。用途项目中 90% 页面跳转、正向传值都用它。最简代码带传值// A页面跳转B页面 携带数据 val intent Intent(this, SecondActivity::class.java) intent.putExtra(username, 张三) intent.putExtra(age, 20) startActivity(intent)2. 隐式 Intent系统/跨App跳转特点不指定具体组件通过Action、Data匹配系统或第三方App组件。用途打开浏览器、拨号、打开相册、唤起其他App。最简代码// 打开浏览器 val intent Intent(Intent.ACTION_VIEW, Uri.parse(https://www.baidu.com)) startActivity(intent)两者区别总结显式写死类名 → 内部页面跳转、支持传参隐式靠Action匹配 → 系统功能、跨App三、正向数据传递A → B 向下传值原理Intent 作为数据容器putExtra 存值getExtra 取值1. 基础数据传递String、Int、BooleanA页面发送val intent Intent(this, SecondActivity::class.java) intent.putExtra(name, 李四) intent.putExtra(score, 99) startActivity(intent)B页面接收onCreate中val name intent.getStringExtra(name) val score intent.getIntExtra(score, 0) // 0为默认值2. 对象传递必须序列化Activity不支持直接传普通对象必须序列化常用Serializable学习首选第一步实体类序列化class User : Serializable { var name: String var age: Int 0 }第二步A发送对象val user User() user.name 王五 user.age 22 intent.putExtra(user_info, user)第三步B接收对象val user intent.getSerializableExtra(user_info) as User四、反向数据回传B → A 向上返回数据场景A打开BB操作完成关闭B、把数据返回给A。废弃旧APIstartActivityForResult现行标准APIregisterForActivityResult1. A页面注册监听、跳转页面// 注册回传监听全局只写一次 private val resultLauncher registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ if(it.resultCode RESULT_OK){ // 接收B返回的数据 val backText it.data?.getStringExtra(back_data) } } // 点击跳转B页面 btn_jump.setOnClickListener { val intent Intent(this, SecondActivity::class.java) resultLauncher.launch(intent) }2. B页面返回数据 关闭页面btn_back.setOnClickListener { // 封装返回数据 val intent Intent() intent.putExtra(back_data, 我是B页面返回的结果) // 设置返回结果 setResult(RESULT_OK, intent) // 关闭页面触发A的回调 finish() }回传必须同时两步setResult 存数据 finish 触发返回五、完整流程总览1. 正向流程A→BAputExtra 存数据 - startActivity - BgetExtra 取数据2. 反向流程B→AA注册监听 - 跳转B - BsetResult存数据 finish关闭 - A自动回调取值六、重点总结1. 页面之间不能直接传对象必须序列化Serializable / Parcelable2. 取值 Key 必须和存值 Key完全一致3. 取数值、布尔一定要给默认值防止null崩溃4. 回传缺一不可setResult finish5. 内部跳转一律用显式Intent系统功能用隐式Intent七、总结显式Intent指定类名内部页面跳转可传参隐式IntentAction匹配系统/跨App调用正向传值putExtra存、getExtra取对象传值必须序列化反向回传register监听 setResult返回 finish触发