Android registerForActivityResult新用法实现两个Activity间数据传递

我们来详细讲解一下如何使用Android registerForActivityResult新用法实现两个Activity间数据传递。

什么是registerForActivityResult

registerForActivityResult是Android个10.0之后新增的 API,可以简化 startActivityForResult 的操作,并且更加灵活。通过 registerForActivityResult 可以申请权限、获取图片、视频,等等。

How-To

要使用registerForActivityResult来实现两个Activity间数据传递,我们需要以下几个步骤:

步骤一:创建打开目标Activity的Intent

在目标Activity中,我们需要使用Intent的putExtra()命令在Intent中添加要传递的数据。例如,在MainActivity中打开目标Activity,并将数据传到目标Activity:

private final ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
    if (result.getResultCode() == Activity.RESULT_OK) {
        Intent intent = result.getData();
        //处理拿到的数据
    }
});

Intent intent = new Intent(MainActivity.this, TargetActivity.class);
intent.putExtra("message", "Hello World!");
mStartForResult.launch(intent);

步骤二:在目标Activity中获取传递的数据

目标Activity中使用getIntent()即可取到传递的数据,例如,在目标Activity中接收来自MainActivity的数据:

String message = getIntent().getStringExtra("message");

步骤三:返回数据到MainActivity中

在目标Activity中,我们可以使用 setResult() 方法返回数据给MainActivity:

Intent intent = new Intent();
intent.putExtra("returnMessage", "Got the message, thanks!");
setResult(Activity.RESULT_OK, intent);
finish();

步骤四:在MainActivity中接收返回数据

我们可以在 onActivityResult() 中获取到返回结果:

private final ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
    if (result.getResultCode() == Activity.RESULT_OK) {
        Intent intent = result.getData();
        String returnMessage = intent.getStringExtra("returnMessage");
        //处理返回的数据
    }
});

示例

示例一:主Activity传递数据给目标Activity

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private Button mButton;

    private final ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent intent = result.getData();
            String returnMessage = intent.getStringExtra("returnMessage");
            Toast.makeText(this, returnMessage, Toast.LENGTH_SHORT).show();
        }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = findViewById(R.id.button);
        mButton.setOnClickListener(view -> {
            Intent intent = new Intent(MainActivity.this, TargetActivity.class);
            intent.putExtra("message", "Hello World!");
            mStartForResult.launch(intent);
        });
    }
}

TargetActivity.java:

public class TargetActivity extends AppCompatActivity {
    private String mMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target);

        mMessage = getIntent().getStringExtra("message");
        TextView textView = findViewById(R.id.text_view);
        textView.setText(mMessage);
    }

    public void onClick(View view) {
        Intent intent = new Intent();
        intent.putExtra("returnMessage", "Got the message, thanks!");
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
    <Button
        android:id="@+id/button"
        android:text="Start TargetActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

activity_target.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ...
    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TargetActivity"
        android:textSize="24sp"
        android:layout_centerInParent="true" />

    <Button
        android:id="@+id/button"
        android:text="Return to MainActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text_view"
        android:layout_centerHorizontal="true"
        android:onClick="onClick" />
</RelativeLayout>

这个示例演示了如何在MainActivity中传递数据到TargetActivity,并在TargetActivity中返回数据到MainActivity。

示例二:目标Activity返回数据给MainActivity

MainActivity.java:

public class MainActivity extends AppCompatActivity {
    private Button mButton;

    private final ActivityResultLauncher<Intent> mStartForResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            Intent intent = result.getData();
            String returnMessage = intent.getStringExtra("returnMessage");
            Toast.makeText(this, returnMessage, Toast.LENGTH_SHORT).show();
        }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = findViewById(R.id.button);
        mButton.setOnClickListener(view -> {
            Intent intent = new Intent(MainActivity.this, TargetActivity.class);
            mStartForResult.launch(intent);
        });
    }
}

TargetActivity.java:

public class TargetActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target);
    }

    public void onClick(View view) {
        Intent intent = new Intent();
        intent.putExtra("returnMessage", "Got the message, thanks!");
        setResult(Activity.RESULT_OK, intent);
        finish();
    }
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        ...
        <Button
            android:id="@+id/button"
            android:text="Start TargetActivity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>

activity_target.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        ...
        <Button
            android:id="@+id/button"
            android:text="Return to MainActivity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" 
            android:onClick="onClick"/>
    </RelativeLayout>

这个示例演示了如何在TargetActivity中返回数据到MainActivity。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android registerForActivityResult新用法实现两个Activity间数据传递 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue打印插件vue-print-nb的实现代码

    下面详细讲解一下vue打印插件vue-print-nb的实现代码的攻略。 1. 确认安装 首先需要确认已经在vue项目中安装了vue-print-nb插件,确认方法可通过以下命令进行: npm list vue-print-nb 如果已经正确安装,则可查看到vue-print-nb以及其依赖项在项目文件夹中的位置。 2. 使用vue-print-nb插件 接…

    Vue 2023年5月27日
    00
  • vue中使用vuex的超详细教程

    下面是关于vue中使用vuex的超详细教程,内容主要包括以下几个部分: vuex在vue中的作用及基本概念 在vue中引入vuex 构建vuex的基本结构 如何引用vuex中的数据和方法 示例说明 总结 1. vuex在vue中的作用及基本概念 vuex是一种状态管理模式,用于管理vue应用中的所有组件的状态,将数据交给vuex中心化管理,实现全局统一的数据…

    Vue 2023年5月28日
    00
  • Vue2 响应式系统之异步队列

    当我们修改 Vue 实例数据时,Vue 会根据监听的数据属性触发响应式更新。Vue 2.x 的响应式系统包含依赖追踪和异步队列两个部分,其中异步队列主要负责缓存数据变更并批量更新 DOM,以最小代价更新视图。具体来说,异步队列可以将同一事件循环中的数据变更缓存起来,避免了对于同一数据进行多次 DOM 更新,降低了性能消耗。而且通过微任务让 DOM 更新在下一…

    Vue 2023年5月29日
    00
  • vue webpack打包优化操作技巧

    下面是关于Vue Webpack打包优化的完整攻略。 为什么需要打包优化? Vue Webpack打包过程通常比较复杂,对于大型项目而言,打包过程中可能会遇到各种各样的问题。我们需要对Webpack打包进行优化,以提高项目的性能和稳定性。通常需要考虑以下几个方面: 减少打包体积 减少打包时间 提高页面加载速度 稳定可靠性 打包优化操作技巧 1. 优化load…

    Vue 2023年5月28日
    00
  • Vue编译器解析compile源码解析

    Vue编译器是一个非常重要的组成部分,它的作用是将Vue组件中的template模板转化为渲染函数,以实现组件的动态渲染。本篇攻略将详细介绍Vue编译器解析compile源码的过程。 什么是compile源码? compile源码是Vue编译器的一部分,它是Vue的编译过程的核心部分。该部分主要负责将Vue组件的模板转化为渲染函数。 compile源码执行过…

    Vue 2023年5月27日
    00
  • Vue 中 createElement 使用实例详解

    下面我给出“Vue 中createElement 使用实例详解”的完整攻略,包括基本语法和两条示例说明。 What is createElement? createElement 是 Vue 的一个渲染函数,它通过 JavaScript 代码的方式生成虚拟 DOM。通过 createElement 我们能够在 JS 代码中定义 Vue 的组件,从而实现动态渲…

    Vue 2023年5月29日
    00
  • vue 获取及修改store.js里的公共变量实例

    获取和修改vue中的全局变量通常需要使用Vuex。Vuex是一个专业用于管理Vue应用中的状态(state)的库。它支持将状态集中在单个位置中,以便更轻松地进行管理和交互。 下面是如何在vue中获取和修改store.js里的公共变量实例的详细攻略: 安装依赖 为了使用Vuex,您需要先安装它。您可以在项目中使用以下命令安装它: npm install vue…

    Vue 2023年5月27日
    00
  • 浅析Vue 中的 render 函数

    下面我将为你详细讲解“浅析Vue 中的 render 函数”的完整攻略。 什么是 render 函数 在 Vue 中,模板是数据与 DOM 的映射,我们通过编写模板可以将数据渲染到页面上。但是,在一些场景下,如大规模的复杂组件或者需要高度自定义渲染逻辑的场景,使用传统的模板语法显得力不从心。这时候可以使用 Vue 的 render 函数,它不仅可以让我们更加…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部