• 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或者发起权限请求

  • 相关阅读:
    2020/7/18 JDBC
    2020.8.1
    2020.7.31
    二元泰勒公式
    一元泰勒公式
    极值
    介值定理
    积分上限函数
    积分中值定理
    狄利克雷(Dirichlet)函数
  • 原文地址:https://www.cnblogs.com/lihuawei/p/16574688.html
Copyright © 2020-2023  润新知