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实现打印功能的两种方法

    当我们在开发Web应用时,经常会遇到需要实现打印功能的需求。在Vue.js中,我们可以使用以下两种方法来实现打印功能: 方法一:使用原生JavaScript实现打印功能 第一种方法是通过原生JavaScript来实现打印功能。具体步骤如下: 在Vue组件中添加一个button按钮,并在该按钮的点击事件中添加打印功能的实现代码: “` 打印 methods:…

    Vue 2023年5月29日
    00
  • vue props数据传递类型限制方式

    Vue中的props是一种用于父子组件之间传递数据的机制。为了保证数据的正确性和可维护性,我们可以通过对props进行数据传递类型限制方式来限制传递的数据类型,以确保数据能够按照我们的预期运行。 在Vue中,我们可以通过拥有以下数据类型的props: String Number Boolean Array Object Date Function 其中,Ar…

    Vue 2023年5月27日
    00
  • vite vue3 规范化与Git Hooks详解

    以下是“vite vue3 规范化与Git Hooks详解”的详细攻略。 概述 在前端开发中,如何进行规范化开发是一个十分重要的话题。同时,在团队协作中,代码的版本控制也是必不可少的一环。本文将介绍如何使用Vite和Vue3来实现前端规范化开发,并结合Git Hooks来实现代码的自动检测和提交。 Vite+Vue3规范化开发 创建项目 首先需要使用Vue …

    Vue 2023年5月28日
    00
  • 关于Vue Router的10条高级技巧总结

    下面我将详细讲解”关于Vue Router的10条高级技巧总结”这篇文章的完整攻略。 1. 理解vue-router的基本概念 在使用vue-router前,我们需要先了解基本概念,包括路由、路由参数、路由钩子函数等内容。对这些基本概念进行了解后,我们才能更好地理解vue-router的高级用法、优化和技巧。 2. 利用路由钩子函数优化路由过渡效果 路由钩子…

    Vue 2023年5月27日
    00
  • VUE 实现动态给对象增加属性,并触发视图更新操作示例

    VUE 实现动态给对象增加属性,并触发视图更新操作可以通过以下两个示例进行说明。 示例一 <template> <div> <button @click="addAttr">添加属性</button> <span>添加属性之前:</span><span>{…

    Vue 2023年5月28日
    00
  • 基于vite2+vue3制作个招财猫游戏

    下面是基于vite2+vue3制作招财猫游戏的攻略,包括如何搭建开发环境、创建基本项目结构、编写代码、调试和打包等步骤: 1. 搭建开发环境 首先需要安装Node.js,然后通过npm全局安装vite和vue: npm install -g vite vue 2. 创建项目 在终端中进入想要创建项目的目录下执行以下命令: mkdir zhao-cai-mao…

    Vue 2023年5月28日
    00
  • Vue实现全局异常处理的几种方案

    关于Vue实现全局异常处理的几种方案,我将在以下几个方面展开讲解: 为什么需要全局异常处理 Vue的错误处理机制 实现方式与方案对比 1. 为什么需要全局异常处理 在开发中,往往需要处理很多错误情况,这些错误可能是前端的语法错误、网络请求失败、后台接口异常等等。对于这些错误我们需要进行详细的处理,让用户可以更好地感觉到我们的产品质量和体验。而且全局异常处理不…

    Vue 2023年5月28日
    00
  • 微信小程序实现表单验证提交功能

    讲解“微信小程序实现表单验证提交功能”的完整攻略,具体步骤如下: 1. 编写表单 首先需要在小程序页面中编写表单,包括输入框、下拉框等等常见表单元素,并且给每一个表单元素设置一个唯一的id值,以便后面表单验证时获取元素。代码示例: <form> <input id="name" placeholder="请输入…

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