【Android】Activity组件通信

文章目录

在Android中,Activity之间的通信是一个常见且重要的任务。以下是一些常用的方法来实现Activity之间的数据传递和通信:

1.使用Intent传递数据

这是最常见的方式,适用于从一个Activity向另一个Activity传递数据。可以通过Intent的putExtra()方法来附加数据,接收方则通过getIntent().getStringExtra()等方法来获取数据。

发送数据Activity:

java 复制代码
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                intent.putExtra("text","成功跳转过来了");
                startActivity(intent);

            }
        });

接受数据Activity:

java 复制代码
 textView2.setText(getIntent().getStringExtra("text"));

2.使用Bundle传递复杂数据

对于更复杂的数据结构,如对象数组或自定义对象,可以使用Bundle来封装数据并通过Intent传递。

发送数据Activity:

java 复制代码
                Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                Bundle bundle = new Bundle();
                bundle.putString("text","使用Bundle成功跳转过来了");
                intent.putExtras(bundle);
                startActivity(intent);

接受数据Activity:

java 复制代码
        Bundle bundle = getIntent().getExtras();
        if(bundle != null){
            String text = bundle.getString("text");
            textView2.setText(text);
        }else {
            textView2.setText("没有数据");
        }

3.startActivityForResult 和 onActivityResult

当需要从一个Activity启动另一个Activity,并期望从后者返回结果时,可以使用startActivityForResult()方法。在目标Activity中,可以通过setResult()方法设置返回结果,然后调用finish()结束Activity。原Activity通过重写onActivityResult()方法来处理返回的结果。

发送请求的Activity:

java 复制代码
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
                startActivityForResult(intent,REQUEST_CODE);

处理结果的Activity:

java 复制代码
 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE && resultCode == SUCCESS_CODE){
            Log.d("ning", "MainActivity2返回成功");
            String response_content = data.getStringExtra("response_content");
            textView.setText(response_content);
        }
    }

返回结果的Activity:

java 复制代码
        Intent intent = new Intent();
        intent.putExtra("response_content","这是来自MainActivity2的数据");
        setResult(SUCCESS_CODE,intent);
        finish();

4.使用ViewModel共享数据

在MVVM架构中,ViewModel可以用来在多个Activity或Fragment之间共享数据。ViewModel的生命周期与Activity或Fragment的生命周期独立,因此它可以保留数据,即使Activity或Fragment被重新创建。

创建ViewModel:

java 复制代码
public class MyViewModel extends ViewModel {

    private MutableLiveData<String> mText = new MutableLiveData<>();

    public MutableLiveData<String> getText() {
        return mText;
    }

    public void setText(String text) {
        mText.setValue(text);
    }
}
java 复制代码
myViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String s) {
                textView2.setText(s);
            }
        });
相关推荐
GY-9332 分钟前
【Android】Android Studio 中的协程
android
Geek-Chow34 分钟前
移动 App 侧载攻击:Android 与 iOS 的信任链、突破口与防护
android
Android小码家2 小时前
framework&framework-minus-apex&android.jar的区别
android·python·jar
技术风向解码者2 小时前
安卓跨端选型:为什么优先看 Kuikly
android
科小怪2 小时前
大肥鱼桌宠下载(2026最新版):在安卓桌面上养一条会走会弹会碎碎念的胖鱼
android
qq3621967052 小时前
安卓安装包完整性校验:怎么确认下载的 APK 没被动过手脚
android
FLJwu2 小时前
《运动相机硬件防护选型实战》专栏|第二篇(PPTC 自恢复保险丝)
android·经验分享·数码相机·1024程序员节·运动相机
驰骋工作流13 小时前
流程时效考核的表结构:从待办时限到 WF_CH 考核结果驰骋BPM驰骋低代码低代码工作流引擎
android·低代码·rxjava
传奇开心果编程14 小时前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
方白羽18 小时前
Android 双开环境底层剖析与风控检测落地
android·安全·app