引言
我们可能需要实现这样的场景:当前Activity需要单例,即,在该页面执行主流程,比如填写订单,而往往订单需要从其他的Activity中获取相关数据进行组合,方能形成整个订单数据。然而,还需要保证该页面为单例,不能去其他页面获取数据后又生成新页面,造成页面叠加,影响用户体验。
onActivityResult方法正是为解决这一问题而存在。它得以保证请求前和请求后的Activity为同一个,只是中间通过跳转去其他Activity获取了数据。
效果预览

用法
第一步:创建ActivityA的布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".blog2.Case67"
tools:ignore="MissingConstraints">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/black"
android:gravity="center"
android:text="Activity_A"
android:textColor="@color/white"
android:textSize="20sp" />
<Button
android:id="@+id/btn_A"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Button_A"
android:textAllCaps="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/showA_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:padding="20dp"
android:text="ceshi:"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/btn_A" />
</androidx.constraintlayout.widget.ConstraintLayout>
第二步:在ActivityA中书写业务逻辑代码
public class Case67 extends AppCompatActivity {
private TextView tvShowA;
private Button btnA;
private String userName;
private String userId;
//第三人称说的话
private String speakenB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_case67);
initView();
userId = "900000000"; //9亿,懂得都懂
userName = "林更新";
btnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
goToB();
}
});
}
private void initView() {
tvShowA = findViewById(R.id.showA_view);
btnA = findViewById(R.id.btn_A);
}
//正戏来啦
//跳转页面到B
private void goToB() {
Intent intent = new Intent(this, Case67Other.class);
//第一种:直接使用Intent对象传值
intent.putExtra("Id", userId);
intent.putExtra("Name", userName);
// //第二种:通过Bundle对象传值(更佳)
// Bundle bundle = new Bundle();
// bundle.putString("Id",userId);
// bundle.putString("Name",userName);
// intent.putExtras(bundle)
startActivityForResult(intent, 200); //要保证ActivityA为单例,因此不用startActivity()方法,用这个。
}
//重写方法onActivityResult():获取从B再跳转到A的结果但仍保证A为跳转到B之前的那个A(单例A)
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 200) {
if (resultCode == Activity.RESULT_OK) {
speakenB = data.getStringExtra("speakenB");
//获取从B传过来的值并展示在按钮下方
if (speakenB.isEmpty()) {
tvShowA.setText("未接收到信息");
}else {
tvShowA.setText(speakenB);
}
}
}
}
}
第三步:ActivityB布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity.Case67Other"
tools:ignore="MissingConstraints">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/black"
android:gravity="center"
android:text="Activity_B"
android:textColor="@color/white"
android:textSize="20sp" />
<Button
android:id="@+id/btn_B"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Button_B"
android:textAllCaps="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/showB_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:padding="20dp"
android:text="ceshi:"
android:textSize="18sp"
app:layout_constraintTop_toBottomOf="@id/btn_B" />
</androidx.constraintlayout.widget.ConstraintLayout>
第四步:在ActivityB中书写业务逻辑
public class Case67Other extends AppCompatActivity {
private Button btnB;
private TextView tvShowB;
//传递给A一个信息
private String Bspeak = "他就是一个微博段子手。";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_case67_other);
initView();
btnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
goToA();
}
});
showText();
}
private void initView() {
btnB = findViewById(R.id.btn_B);
tvShowB = findViewById(R.id.showB_view);
}
//跳转页面到A
private void goToA(){
Intent intent = new Intent(this, Case67.class);
intent.putExtra("speakenB",Bspeak);
setResult(Activity.RESULT_OK,intent); //设置返回结果码为RESULT_OK,默认-1
finish();
}
//获取从A传过来的值并展示在按钮下方
private void showText(){
Intent intent = getIntent();
String id = intent.getStringExtra("Id");
String name = intent.getStringExtra("Name");
if (id.isEmpty()){
tvShowB.setText("未接收到的参数:Id,Name");
}else {
tvShowB.setText("id:" + id + "name:" + name);
}
}
}
大功告成!

网友评论