带返回值的Intent startActivityForResult()废弃/过时,替代为registerForActivityResult()简介

本文介绍了在Android应用中,startActivityForResult()方法被废弃后,如何使用registerForActivityResult()方法进行活动间的数据传递,并提供了Kotlin版本的代码示例。
摘要由CSDN通过智能技术生成

startActivityForResult()废弃/过时后,我们可以用registerForActivityResult()替代。
代码如下:
FirstAvitvity.class

public class FirstActivity extends AppCompatActivity {

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

        ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(resultresult.getResultCode() == Activity.RESULT_OK){
                    Log.d("TAG", result.getData().getStringExtra("data_return"));
                }
            }
        });

        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
                launcher.launch(intent);//启动intent跳转
            }
        });
    }
}

SecondActivity

public class SecondActivity extends AppCompatActivity {

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

        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.putExtra("data_return","Hello World!");
                setResult(RESULT_OK,intent);
                finish();
            }
        });
    }
}

Kotlin写法如下
FirstAvitvity.class

class FirstActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val launcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
            if (result.resultCode == RESULT_OK && result.data != null) {
                result.data?.getStringExtra("data_return")?.let {
                    Log.e("TAG", it)
                }
            }
        }
        
        findViewById<Button>(R.id.button_1).setOnClickListener {
            val intent = Intent(this, SecondAct::class.java)
            launcher.launch(intent)
        }
    }
}

SecondActivity

class SecondActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        findViewById<Button>(R.id.button_2).setOnClickListener {
            val intent = Intent()
            intent.putExtra("data_return","Hello World!")
            setResult(RESULT_OK,intent)
            finish()
        }
    }
}
在介绍startActivityForResult方法的参数如何入registerForActivityResult之前,先来了解一下这两个方法的作用。 startActivityForResult是一个用于启动另一个Activity并获取结果的方法。它接收两个参数:Intent对象和请求码(requestCode)。Intent对象用于指定要启动的目标Activity,而请求码用于标识这个启动请求。 registerForActivityResult是用于注册一个ActivityResultLauncher的方法。它接收一个ActivityResultContract对象作为参数,用于指定要注册的ActivityResultLauncher的类型。 现在我们来看一下如何将startActivityForResult方法的参数入registerForActivityResult。 首先,你需要创建一个ActivityResultContract对象,用于指定要注册的ActivityResultLauncher的类型。例如,如果你想要获取一个字符串结果,可以使用ActivityResultContracts.StartActivityForResult()方法创建一个ActivityResultContract对象。 然后,你可以使用registerForActivityResult方法将ActivityResultContract对象传递给它,以注册一个ActivityResultLauncher。这样就完成了参数的传递。 下面是一个示例代码: ```java // 创建一个ActivityResultContract对象 ActivityResultContract<Intent, ActivityResult> contract = new ActivityResultContracts.StartActivityForResult(); // 将ActivityResultContract对象传递给registerForActivityResult方法进行注册 ActivityResultLauncher<Intent> launcher = registerForActivityResult(contract, result -> { // 在这里处理返回的结果 if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); // 处理返回的数据 } }); // 使用startActivityForResult方法启动目标Activity,并传递Intent对象和请求码 Intent intent = new Intent(this, TargetActivity.class); launcher.launch(intent); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值