startActivityForResult()被标注弃用,推荐使用registerForActivityResult()方法

startActivityForResult()方法如今已经被废弃了,官方推荐的是使用Activity Result API来实现两个Activity之间传递数据功能。

但Activity Result API时能做的事还有很多,下面来学习一下怎么使用。

注意1:registerForActivityResult只能在onCreate()中注册。onstart()之后就不能注册了。

注意2:registerForActivityResult()方法不要放在setOnClickListener()里面,要放在onCreate里。

第2个Activity给第1个Activity返回数据

传统的写法就是使用startActivityForResult()方法传入intent和请求码,然后会回调到onActivityResult()中,在这里面进行返回数据的处理。

使用Activity Result API的话,SecondActivity的代码是不用修改的,如下:

复制代码
public class SecondActivity extends AppCompatActivity {
    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        Button btnQuit = findViewById(R.id.btnQuit);
        btnQuit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d(TAG, "onClick: ");
                Intent intent = new Intent();
                intent.putExtra("data_return", "返回的数据");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}
复制代码

只需要修改第一个Activity中的代码:

复制代码
public class FirstActivity extends AppCompatActivity {
    private static final String TAG = "FirstActivity";

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

        Button btnSecond = (Button) findViewById(R.id.btnSecond);

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

        btnSecond.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//                startActivityForResult(intent, 1);
                launcher.launch(intent);
            }
        });
    }

//    @Override
//    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
//        switch (requestCode) {
//            case 1:
//                if (resultCode == RESULT_OK) {
//                    Log.d(TAG, "onActivityResult: data = " + data.getStringExtra("data_return"));
//                }
//                break;
//        }
//    }
}
复制代码

现在只需要调用registerForActivityResult()方法来注册一个对Activity结果的监听。

此方法接收两个参数,第一个是Contract类型,第二个是一个Lambda表达式,当有结果返回时会回调到这里,在这里获取并处理数据就行。

registerForActivityResult()方法详解

两个参数:

需要传入 ActivityResultContract

需要传入一个回调 ActivityResultCallback

返回值:

它返回一个 ActivityResultLauncher 对象

用法:

调用 ActivityResultLauncher的 launch方法可以跳转到另一个Activity或者发起权限请求

posted @   熊猫Panda先生  阅读(11862)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示