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