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

yizhihongxing

我们来详细讲解一下如何使用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日

相关文章

  • 关于Vue3&TypeScript的踩坑汇总

    关于Vue3&TypeScript的踩坑汇总 简介 Vue3是一款非常流行的JavaScript框架,提供了许多强大的功能和工具,使得开发复杂的前端应用程序变得更加容易。与此同时,TypeScript是一种强类型的JavaScript语言,它可以提供更好的可读性和可维护性,在Vue3的开发过程中也极其有用。但是,在使用Vue3和TypeScript的…

    Vue 2023年5月28日
    00
  • 聊聊vue生命周期钩子函数有哪些,分别什么时候触发

    Vue是一种用于构建用户界面的渐进式框架,为方便开发者管理组件状态,Vue提供了一组生命周期钩子函数。 Vue组件生命周期分为创建阶段、更新阶段和销毁阶段三个阶段,每个阶段包含不同的生命周期函数。 创建阶段 在组件创建时,从上到下执行以下生命周期函数:* beforeCreate:此时组件实例刚刚被创建,组件数据对象还没初始化,无法访问任何其他的生命周期函数…

    Vue 2023年5月28日
    00
  • Vue 事件处理函数的绑定示例详解

    让我为您详细讲解“Vue 事件处理函数的绑定示例详解”的完整攻略。 Vue 事件处理函数的绑定示例详解 在Vue.js中,事件处理是一种非常重要的机制,您可以使用v-on指令将事件处理代码附加到DOM元素上。在本文中,我们将详细讲解Vue事件绑定的示例,以便更好地理解Vue事件机制的工作原理。 监听指定事件 通过使用v-on指令,您可以监听指定DOM事件(如…

    Vue 2023年5月29日
    00
  • vue实现动态给data函数中的属性赋值

    要实现动态地给Vue的data函数中的属性赋值,可以使用Vue.set()方法或this.$set()方法。这两个方法的作用是一样的,都可以在不直接修改对象的情况下更新响应式数据。 具体方法如下: 使用Vue.set() Vue.set()方法接收三个参数,分别是需要更新的对象、需要更新的属性名以及属性值。 例如,假设data函数返回的对象如下: data(…

    Vue 2023年5月28日
    00
  • vue单页应用的内存泄露定位和修复问题小结

    针对“vue单页应用的内存泄露定位和修复问题小结”,我们可以分为以下几个步骤来进行解决。 1. 了解什么是内存泄露 内存泄露指的是程序在运行过程中,动态分配的内存空间未被及时释放,从而导致系统的内存不断被占用,最终导致系统崩溃或者运行缓慢。尤其是前端领域,由于运行在客户端的浏览器环境中,内存泄漏更加容易发生。 2. 定位内存泄露 当我们发现系统出现内存泄漏时…

    Vue 2023年5月27日
    00
  • Vue.js按键修饰符及v-model修饰符示例详解

    Vue.js按键修饰符及v-model修饰符示例详解 Vue.js按键修饰符 Vue.js提供了按键修饰符,可以轻松地绑定按键相关事件。对于选择文本框或文本域等表单元素非常有用。按键修饰符是通过添加特殊的后缀来对v-on监听的事件进行修饰的。示例代码如下: <template> <div> <input type="t…

    Vue 2023年5月27日
    00
  • vue3中reactive数据被重新赋值后无法双向绑定的解决

    在Vue3中,数据响应式的实现由Vue2中的Object.defineProperty改为了ES6的Proxy,使得Vue3的响应式系统在性能和功能上都有了提升。但是,在Vue3中,当我们直接给响应式对象中的属性进行重新赋值时,这个属性就会脱离响应式系统,从而失去了双向绑定的功能,即无法自动更新页面。下面给出两个示例,分别说明这个问题的存在及解决方式。 问题…

    Vue 2023年5月27日
    00
  • 基于Vue.js与WordPress Rest API构建单页应用详解

    那么让我为你详细讲解“基于Vue.js与WordPress Rest API构建单页应用详解”的完整攻略。 概述 本文将介绍如何使用Vue.js和WordPress Rest API构建单页应用。使用Vue.js和WordPress Rest API结合,可以轻松快速的创建现代化的单页应用。Vue.js是一个用于构建用户界面的JavaScript框架,而Wo…

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