首页 > 趣闻 > 正文内容

Activity间数据传递终极方案:Bundle传参、Intent跳转与Fragment通信实战

趣闻2025-05-27 13:16:59

哎我说兄弟们,你们有没有遇到过这种情况?点完登录按钮APP卡住了,回头一看——好家伙!用户名密码全丢了;或者购物车选了半天商品,跳转到支付页面发现数据没带过去...这些让人血压飙升的问题啊,十有八九是数据传递的姿势不对!今天咱们就掰开了揉碎了,聊聊Android开发里这三板斧该怎么耍。


一、Bundle传参:Android界的快递小哥

先来说说这个??必考知识点??Bundle。它就像个万能包裹箱,能装下基本数据类型、字符串甚至Parcelable对象。举个栗子,你要从主页跳到商品详情页:

java复制
// 发货方打包
Bundle bundle = new Bundle();
bundle.putString("product_id", "666");
bundle.putDouble("price", 999.99);

// 收货方拆包
String id = getIntent().getStringExtra("product_id");
double price = getIntent().getDoubleExtra("price",0.0);

但这里有个??致命坑??!上次有个老哥把Bitmap直接塞Bundle里,结果在低端机上直接闪退。记住啊,超过1MB的数据别硬塞,该用文件存储就用文件存储。


二、Intent跳转:数据传送带

说到Intent啊,它可不只是页面跳转的工具人。进阶玩法是用??startActivityForResult??搞双向通信。比如从相册选头像的场景:

java复制
// 发起方
startActivityForResult(new Intent(this, PhotoPickerActivity.class), 1001);

// 接收方处理完回调
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    if(requestCode == 1001 && resultCode == RESULT_OK){
        String imagePath = data.getStringExtra("selected_image");
    }
}

不过这个方案现在有点??过时警告??!Google官方推荐用Activity Results API替代。但话说回来,很多老项目还在用这套,学还是不学?我的建议是先掌握再升级!


三、Fragment通信:组件间的悄悄话

说到Fragment之间的数据传递,那可就精彩了。以前见过有人用??静态变量??传数据,结果内存泄漏到怀疑人生。现在主流方案是用ViewModel+LiveData,举个订单确认页的例子:

java复制
// 在ViewModel里声明
MutableLiveData liveOrder = new MutableLiveData<>();

// 发货方更新数据
viewModel.liveOrder.setValue(new Order("202308888"));

// 收货方监听变化
viewModel.liveOrder.observe(this, order -> {
    tvOrderNo.setText(order.getNumber());
});

但这里有个??隐藏关卡??!多个Fragment共享同一个ViewModel时,记得用by activityViewModels()获取,否则数据会不同步。我有个同事因为这个bug加班到凌晨三点,血泪教训啊!


四、灵魂拷问时间

Q:为什么不用全局变量传数据?简单粗暴不香吗?
A:兄弟你这是玩火啊!全局变量就像把家门钥匙插在锁眼上,随便哪个进程都能改你的数据。上次有个APP用户信息被篡改,就是这么翻车的。

Q:三种方式到底该选哪个?
A:把握三个原则:能用Bundle解决的不用全局,需要回调的用Intent,跨组件通信上ViewModel。就像吃饭用筷子、喝汤用勺子,各司其职嘛!


小编观点

看到这儿可能有新手要问:"说这么多到底用哪个好?" 我的经验是:普通页面跳转用Bundle+Intent够用了,但遇到复杂场景——比如购物车要实时同步多个页面的数据,还是得靠ViewModel+LivaData这套组合拳。记住啊,代码不是越高级越好,合适最重要!就像穿衣服,正式场合穿西装,撸串时候穿背心,可别整反了。

搜索