使用startActivityForResult()启动活动在活动销毁的时候返回一个结果给上一个活动;有两个参数,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。
MainActivity
//在活动中通过findViewById(),获取布局文件中定义的元素
Button button1=findViewById(R.id.button);
//注册监听器,执行监听器中的onClick()方法
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//请求码只是一个唯一值
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
SecondActivity
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button button2=findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Intent仅仅用于传递数据,把传递的数据放在Intent中
Intent intent=new Intent();
intent.putExtra("key","yyy");
/***
* setResult()专门用于向上一个活动返回数据的,接收两个参数,第一个参数用于向上一个活动返回数据的,
* 一般只使用RESULT_OK和RESULT_CANCELED两个值 ,第二个参数则把带有数据的Intent传递回去,
* 然后调用finish()方法来销毁当前的活动
*
*/
setResult(RESULT_OK,intent);
finish();
}
});
}
}
由于我们使用startActivityForResult()方法来启动SecondActivity活动,在SecondActivity被销毁后回回调上一个活动的onActivityResult()方法,因此在MainActivity重写这个方法来得到返回的数据
/***
*
* @param requestCode 第一个参数在活动的传入的请求码
* @param resultCode 第二个参数返回数据是传入的处理结果
* @param data 第三个参数:携带着返回数据的Intent
* 在这个活动中有可能调用startActivityForResult()方法启动很多不同的活动,
* 每一个活动返回的数据都会回调到 onActivityResult()这个方法中 ,通过检查requestCode的值来判断数据来源,
* 确定数据是从SecondActivity返回的之后,在通过resultCode 的值判断数据处理结果是否成功,最后从data中取值。
*
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if(requestCode==RESULT_OK){
String returnedData=data.getStringExtra("key");
Log.d("MainActivity", returnedData);
}
break;
default:
}
}
如果用户在SecondActivity中通过Back键返回活动,而不是按钮,那数据无法返回怎么办?
解决办法:在SecondActivity中重写onBackPressed()方法解决。
@Override
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("key","yyy");
setResult(RESULT_OK,intent);
finish();
}