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

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() {

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

相关推荐

[求助]为什么IE9、IE11再也装不上了?
beat365手机版中文

[求助]为什么IE9、IE11再也装不上了?

📅 10-08 👁️ 1803
为什么羊绒大衣会起球(羊绒、羊毛衣物的护理与清洁 !)
365体育投注网站官网

为什么羊绒大衣会起球(羊绒、羊毛衣物的护理与清洁 !)

📅 08-29 👁️ 792
DNF兰总套怎么做
365体育投注网站官网

DNF兰总套怎么做

📅 08-02 👁️ 4239
野花香电视剧完整版高清
365体育投注网站官网

野花香电视剧完整版高清

📅 07-01 👁️ 9692
重庆狗狗训练学校
beat365手机版中文

重庆狗狗训练学校

📅 07-23 👁️ 5226
日落的近义词日落的近义词是什么
beat365手机版中文

日落的近义词日落的近义词是什么

📅 10-31 👁️ 1618