如何通过Bundle在Activity间传递数据?如何不跳转Activity B传递double数据?
关于Android Bundle传递数据的两个问题解答
嘿,这两个都是Android开发里非常常见的场景,我来给你详细拆解清楚:
1. 借助Bundle实现两个Activity间的数据传递
这是最基础的跨Activity传值方式,分发送和接收两步来做就好:
发送方(Activity A)操作:
- 先创建一个
Intent,指定要跳转到的目标Activity(也就是Activity B) - 实例化
Bundle,用它的putXxx()方法把数据存进去——不管是字符串、整数还是自定义的可序列化对象,基本数据类型都有对应的方法 - 把Bundle绑定到Intent上,用
intent.putExtras(bundle)就行(其实直接用intent.putExtra()也可以,底层也是用Bundle实现的) - 最后调用
startActivity(intent)启动Activity B
给你个代码示例,一看就懂:
// Activity A 里的代码 Intent intent = new Intent(ActivityA.this, ActivityB.class); Bundle dataBundle = new Bundle(); dataBundle.putString("nickname", "CodeMonkey"); dataBundle.putInt("level", 10); intent.putExtras(dataBundle); startActivity(intent);
接收方(Activity B)操作:
- 在
onCreate()方法里,通过getIntent()拿到启动当前Activity的那个Intent - 调用
intent.getExtras()取出传递过来的Bundle - 用
getXxx()方法把数据取出来,建议加个默认值,避免空指针问题
代码示例:
// Activity B 里的代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); Intent incomingIntent = getIntent(); if (incomingIntent != null) { Bundle receivedBundle = incomingIntent.getExtras(); if (receivedBundle != null) { String nickname = receivedBundle.getString("nickname", "Unknown"); // 默认值Unknown int level = receivedBundle.getInt("level", 0); // 这里就可以用拿到的数据做你想做的事啦 } } }
2. 不跳转Activity B,用Bundle传递double类型数据
首先得明确:Bundle本身只是个数据容器,它最常用的场景是配合Intent做Activity跳转传值,但如果不需要跳转,我们可以把Bundle当数据载体,通过其他方式让Activity B获取到里面的double数据。给你两个实用的方案:
方案一:用ViewModel共享数据(推荐,符合Jetpack架构规范)
如果两个Activity在同一个应用进程里,ViewModel是跨组件共享数据的最佳选择之一,Bundle可以用来临时封装数据:
- 先创建一个共享的ViewModel类:
import androidx.lifecycle.ViewModel; public class SharedDataViewModel extends ViewModel { private Bundle sharedBundle; public void setSharedBundle(Bundle bundle) { this.sharedBundle = bundle; } public Bundle getSharedBundle() { return sharedBundle; } }
- 在Activity A中,把double数据存入Bundle,再设置到ViewModel:
// Activity A 里的代码 SharedDataViewModel viewModel = new ViewModelProvider(this).get(SharedDataViewModel.class); Bundle dataBundle = new Bundle(); dataBundle.putDouble("humidity", 65.2); // 存入double类型数据 viewModel.setSharedBundle(dataBundle);
- 在Activity B中,从ViewModel取出Bundle,再拿到double数据:
// Activity B 里的代码 SharedDataViewModel viewModel = new ViewModelProvider(this).get(SharedDataViewModel.class); Bundle receivedBundle = viewModel.getSharedBundle(); if (receivedBundle != null) { double humidity = receivedBundle.getDouble("humidity", 0.0); // 默认值0.0 // 这里就可以使用数据了 }
方案二:用SharedPreferences持久化存储
如果需要数据在应用重启后还能保留,可以把Bundle里的double数据存入SharedPreferences,Activity B再读取:
注意:SharedPreferences本身不直接支持double类型,所以我们可以把double转成float存储(精度足够的场景下完全没问题)
- Activity A中存入数据:
// Activity A 里的代码 Bundle dataBundle = new Bundle(); dataBundle.putDouble("distance", 45.8); // 把Bundle里的double转成float存入SharedPreferences SharedPreferences prefs = getSharedPreferences("AppData", MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putFloat("saved_distance", (float) dataBundle.getDouble("distance")); editor.apply();
- Activity B中读取数据:
// Activity B 里的代码 SharedPreferences prefs = getSharedPreferences("AppData", MODE_PRIVATE); double distance = prefs.getFloat("saved_distance", 0.0f); // 转成double即可使用
另外提一句:如果是要给后台运行的Activity B主动发数据,以前常用LocalBroadcastManager把Bundle作为广播附加数据发送,但现在这个API已经被标记为过时了,更推荐用ViewModel或者LiveData来实现组件间通信哦。
内容的提问来源于stack exchange,提问作者MazullahKhan
相关产品推荐
相关产品推荐

