当前位置:首页 > 行业动态 > 正文

安卓基础之在Activity之间传递参数

在Android中,Activity间传参可通过Intent携带,用putExtra()存基本类型数据,或用Bundle封装复杂对象,启动目标Activity时传递参数

使用Intent传递参数

传递基本数据类型

步骤:

  1. 在源Activity中创建Intent对象,并通过putExtra()方法添加参数。
  2. 在目标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

传递复杂对象(需序列化)

步骤:

  1. 复杂对象需实现SerializableParcelable接口。
  2. 通过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之间传递参数

  1. 在自定义类中定义静态变量。
  2. 在任意Activity中修改或读取该变量。

示例代码:

// 全局类
public class GlobalData {
    public static String sharedData;
}
// 源Activity
GlobalData.sharedData = "Hello from Source";
// 目标Activity
String data = GlobalData.sharedData;

使用单例模式

步骤:

  1. 创建单例类,确保全局唯一实例。
  2. 通过该实例存取数据。

示例代码:

安卓基础之在Activity之间传递参数

// 单例类
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

步骤:

  1. 在源Activity中通过SharedPreferences保存数据。
  2. 在目标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之间传递参数

  1. 在源Activity中写入数据到文件。
  2. 在目标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,解决方案:

  1. 将数据保存到临时文件或缓存中,传递文件路径。
  2. 使用Parcelable优化对象序列化。
  3. 推荐使用ViewModel(若使用Jetpack)在Activity间共享数据。

问题2:使用全局变量是否会导致内存泄漏?

解答:
是的,若全局变量持有Context引用(如静态变量保存Activity实例),可能导致内存泄漏,解决方法:

  1. 避免在全局变量中保存Context
  2. 使用弱引用(WeakReference)或单例模式管理数据。
  3. 优先使用ViewModelLiveData替代全局