安卓基础之在Activity之间传递参数
- 行业动态
- 2025-04-22
- 3
在Android中,Activity间传参可通过Intent携带,用putExtra()存基本类型数据,或用Bundle封装复杂对象,启动目标Activity时传递参数
使用Intent传递参数
传递基本数据类型
步骤:
- 在源Activity中创建Intent对象,并通过
putExtra()
方法添加参数。 - 在目标Activity中通过
getIntent().getXXXExtra()
获取参数。
示例代码:
// 源Activity Intent intent = new Intent(SourceActivity.this, TargetActivity.class); intent.putExtra("key_name", "value"); // 字符串 intent.putExtra("key_age", 25); // 整数 startActivity(intent); // 目标Activity String name = getIntent().getStringExtra("key_name"); int age = getIntent().getIntExtra("key_age", 0); // 默认值为0
传递复杂对象(需序列化)
步骤:
- 复杂对象需实现
Serializable
或Parcelable
接口。 - 通过
putExtra()
传递对象,目标Activity中强制类型转换。
示例代码:
// 自定义对象(实现Serializable) public class User implements Serializable { String name; int age; // 构造方法、getter/setter省略 } // 源Activity User user = new User("Alice", 20); Intent intent = new Intent(SourceActivity.this, TargetActivity.class); intent.putExtra("key_user", user); startActivity(intent); // 目标Activity User receivedUser = (User) getIntent().getSerializableExtra("key_user");
通过全局变量传递参数
使用静态变量
步骤:
- 在自定义类中定义静态变量。
- 在任意Activity中修改或读取该变量。
示例代码:
// 全局类 public class GlobalData { public static String sharedData; } // 源Activity GlobalData.sharedData = "Hello from Source"; // 目标Activity String data = GlobalData.sharedData;
使用单例模式
步骤:
- 创建单例类,确保全局唯一实例。
- 通过该实例存取数据。
示例代码:
// 单例类 public class DataHolder { private static DataHolder instance = new DataHolder(); private String data; private DataHolder() {} public static DataHolder getInstance() { return instance; } public void setData(String data) { this.data = data; } public String getData() { return data; } } // 源Activity DataHolder.getInstance().setData("Singleton Data"); // 目标Activity String data = DataHolder.getInstance().getData();
通过持久化存储传递参数
使用SharedPreferences
步骤:
- 在源Activity中通过
SharedPreferences
保存数据。 - 在目标Activity中读取数据。
示例代码:
// 源Activity SharedPreferences sp = getSharedPreferences("my_prefs", MODE_PRIVATE); sp.edit().putString("key_city", "Beijing").apply(); // 目标Activity SharedPreferences sp = getSharedPreferences("my_prefs", MODE_PRIVATE); String city = sp.getString("key_city", "default_city");
使用文件存储
步骤:
- 在源Activity中写入数据到文件。
- 在目标Activity中读取文件内容。
示例代码:
// 源Activity try { FileOutputStream fos = openFileOutput("data.txt", Context.MODE_PRIVATE); fos.write("Hello File".getBytes()); fos.close(); } catch (IOException e) { e.printStackTrace(); } // 目标Activity try { FileInputStream fis = openFileInput("data.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); String line = reader.readLine(); // 读取内容 reader.close(); } catch (IOException e) { e.printStackTrace(); }
方法对比与选择建议
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Intent传参 | 简单直接,支持多种数据类型 | 仅适用于Activity间单向传递 | 页面跳转时传递临时数据 |
全局变量(静态/单例) | 可跨组件共享数据 | 易导致内存泄漏,不适合大量数据 | 全局状态管理(如用户登录信息) |
SharedPreferences | 轻量级,数据持久化 | 仅适合简单键值对数据 | 配置信息、用户偏好设置 |
文件/数据库存储 | 支持复杂数据结构,持久化 | 读写开销较大 | 大量数据或需长期保存的数据 |
相关问题与解答
问题1:如何传递大数据对象(如Bitmap)?
解答:
直接通过Intent传递大数据(如Bitmap)可能导致TransactionTooLargeException
,解决方案:
- 将数据保存到临时文件或缓存中,传递文件路径。
- 使用
Parcelable
优化对象序列化。 - 推荐使用
ViewModel
(若使用Jetpack)在Activity间共享数据。
问题2:使用全局变量是否会导致内存泄漏?
解答:
是的,若全局变量持有Context
引用(如静态变量保存Activity实例),可能导致内存泄漏,解决方法:
- 避免在全局变量中保存
Context
。 - 使用弱引用(
WeakReference
)或单例模式管理数据。 - 优先使用
ViewModel
或LiveData
替代全局