在Android应用中如何在Activity之间传递数据

在Android应用中如何在Activity之间传递数据

技术背景

在Android应用开发中,Activity是应用的重要组件,经常需要在不同的Activity之间传递数据。例如,在登录Activity中获取用户信息后,需要将这些信息传递到主界面Activity。了解如何在Activity之间传递数据是Android开发的基础技能。

实现步骤

使用Intent传递数据

  1. 发送数据:在当前Activity中创建一个新的Intent,并使用putExtra方法添加要传递的数据,然后调用startActivity方法启动新的Activity。
1
2
3
4
String value = "Hello world";
Intent i = new Intent(CurrentActivity.this, NewActivity.class);
i.putExtra("key", value);
startActivity(i);
  1. 接收数据:在新的Activity中,通过getIntent().getExtras()方法获取传递的数据。
1
2
3
4
5
Bundle extras = getIntent().getExtras();
if (extras != null) {
String value = extras.getString("key");
//The key argument here must match that used in the other activity
}

使用Bundle传递数据

  1. 发送数据:创建一个Bundle对象,将数据放入Bundle中,然后将Bundle放入Intent,最后启动新的Activity。
1
2
3
4
5
6
int n = 10;
Intent in = new Intent(From_Activity.this, To_Activity.class);
Bundle b1 = new Bundle();
b1.putInt("integerNumber", n);
in.putExtras(b1);
startActivity(in);
  1. 接收数据:在新的Activity中,通过getIntent().getExtras()获取Bundle,然后从Bundle中获取数据。
1
2
3
4
5
Bundle b2 = getIntent().getExtras();
int m = 0;
if (b2 != null) {
m = b2.getInt("integerNumber");
}

使用静态变量传递数据

  1. 定义静态变量:在一个类中定义静态变量来存储数据。
1
2
3
4
public class Info {
public static int ID = 0;
public static String NAME = "TEST";
}
  1. 设置和获取数据:在Activity中设置和获取静态变量的值。
1
2
3
4
5
6
7
// 设置值
Info.ID = 5;
Info.NAME = "USER!";

// 获取值
int id = Info.ID;
String name = Info.NAME;

使用Application类传递数据

  1. 自定义Application类:创建一个自定义的Application类,在其中定义需要传递的数据和对应的getter和setter方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MyApplication extends Application {
private MainActivity mainActivity;

@Override
public void onCreate() {
super.onCreate();
}

public void setMainActivity(MainActivity activity) {
this.mainActivity = activity;
}
public MainActivity getMainActivity() {
return mainActivity;
}
}
  1. 在Activity中使用:在Activity中通过getApplication()方法获取自定义的Application类的实例,然后调用其方法。
1
2
((MyApplication) getApplication()).setMainActivity(this);
MainActivity mainActivity = ((MyApplication) getApplication()).getMainActivity();

使用SharedPreferences传递数据

  1. 保存数据:在Activity中使用SharedPreferences保存数据。
1
2
3
4
SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("sessionId", sessionId);
editor.commit();
  1. 获取数据:在其他Activity中使用SharedPreferences获取数据。
1
2
SharedPreferences preferences = getSharedPreferences("session", getApplicationContext().MODE_PRIVATE);
String sessionId = preferences.getString("sessionId", null);

核心代码

使用Intent传递数据示例

1
2
3
4
5
6
7
8
// 发送数据
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
intent.putExtra("key", "value");
startActivity(intent);

// 接收数据
Intent receivedIntent = getIntent();
String value = receivedIntent.getStringExtra("key");

使用Kotlin实现Intent传递数据示例

1
2
3
4
5
6
7
// 发送数据
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

// 接收数据
val value = intent.getStringExtra("key")

最佳实践

  • 使用常量定义键名:为了避免键名拼写错误,建议使用static final常量来定义键名。
1
2
3
4
static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";
Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);
  • 使用静态方法创建Intent:为相关的Activity创建一个静态方法,该方法包含启动Intent所需的参数,方便设置和获取参数。
1
2
3
4
5
6
7
8
9
10
11
12
public class MyActivity extends Activity {
public static final String ARG_PARAM1 = "arg_param1";

public static Intent getIntent(Activity from, String param1) {
Intent intent = new Intent(from, MyActivity.class);
intent.putExtra(ARG_PARAM1, param1);
return intent;
}
}

// 使用
startActivity(MyActivity.getIntent(FromActivity.this, varA));

常见问题

  • 数据丢失问题:如果使用静态变量传递数据,当应用被系统杀死或重新启动时,静态变量的值可能会丢失。建议使用IntentSharedPreferences来持久化数据。
  • 内存泄漏问题:使用静态变量或Application类传递数据时,如果持有Activity的引用,可能会导致内存泄漏。确保在不需要时及时释放引用。
  • 数据类型不匹配问题:在使用getExtra方法获取数据时,要确保数据类型与发送时一致,否则可能会导致ClassCastException异常。

在Android应用中如何在Activity之间传递数据
https://119291.xyz/posts/passing-data-between-activities-in-android/
作者
ww
发布于
2025年6月3日
许可协议