onActivityResult详解

onActivityResult详解

在进行界面间的跳转和传递数据的时候,我们有的时候要获得跳转之后界面传递回来的状态,数据等信息。这个时候,我们不一定需要使用Intent进行跳转回原先设置的界面,而是使用onActivityResult方法就可以解决这个问题。

onActivityResult(int requestCode, int resultCode, @Nullable Intent data)

requestCode: 请求码,对应你在startActivityForResult(Intent intent, int requestCode)中传入

requestCode,该参数的作用是让你在有多个activity返回结果时,能判断是哪一个activity返回。

resultCode:返回码,通过该参数判断子activity返回的状态,有OK,CANCELED,RESULT_FIRST_USER等,
本质上是子Activity的一个实例变量 int mResultCode,该变量在定义时就被赋值为RESULT.CANCELED,因此默认返回RESULT.CANCELED 可通过setResult(int resultCode)修改

data:用来传递数据,对应子Activity的一个实例变量Intent mResultData,初始化为null,可通过setResult(int resultCode, Intent data)修改。

例:
MyActivityA.java

public class MyActivityA extends AppCompatActivity implements View.OnClickListener {
    
    
    public final int REQUEST_CODE_B = 1;
    public final int REQUEST_CODE_C = 2;
    private Button buttonB;
    private Button buttonC;
    private Intent intent;
    private TextView result_text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_activity_a);
        buttonB = findViewById(R.id.btn_B);
        buttonC = findViewById(R.id.btn_C);
        result_text = findViewById(R.id.result_text);
        buttonB.setOnClickListener(this);
        buttonC.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    
    
        switch (v.getId()){
    
    
            case R.id.btn_B:
                intent = new Intent(MyActivityA.this,MyActivityB.class);
                startActivityForResult(intent,REQUEST_CODE_B);
                break;
            case R.id.btn_C:
                intent = new Intent(MyActivityA.this,MyActivityC.class);
                startActivityForResult(intent,REQUEST_CODE_C);
                break;
            default:
                break;
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    
    
        switch (requestCode) {
    
    
            case REQUEST_CODE_B:
            case REQUEST_CODE_C: //返回的结果是来自于Activity C
                if (resultCode == Activity.RESULT_OK) {
    
    
                    result_text.setText(data.getStringExtra("respond"));
                } else {
    
    
                    result_text.setText("No Name Activity");
                }
                break;
            default:
                break;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

MyActivityB.java

public class MyActivityB extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_b);
        Button btn = findViewById(R.id.b_back_a);
        btn.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                Intent intent = new Intent();
                intent.putExtra("respond", "Hello,I'm B Activity.");
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        });
    }
}

MyActivityC.java

public class MyActivityC extends AppCompatActivity {
    
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_c);
        Button btn = findViewById(R.id.c_back_a);
        btn.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View v) {
    
    
                Intent intent = new Intent();
                intent.putExtra("respond", "I'm C Activity.");
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        });
    }
}

activity_my_activity_a.xml:

<?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="com.example.myscrollview.acivity.MyActivityA">

    <Button
        android:id="@+id/btn_B"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:text="B Activity"
        />

    <Button
        android:id="@+id/btn_C"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_B"
        android:text="C Activity"
        />
    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:gravity="center"
        android:textSize="30sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toBottomOf="@id/btn_C"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_my_b.xml

<?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="com.example.myscrollview.acivity.MyActivityB">

    <Button
        android:id="@+id/b_back_a"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:gravity="center"
        android:text="b_back_a"
        android:textSize="18sp"
        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="ACTIVITY B"
        android:textSize="32sp"
        android:gravity="center"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

activity_my_c.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.myscrollview.acivity.MyActivityB">
    <Button
        android:id="@+id/c_back_a"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:gravity="center"
        android:text="c_back_a"
        android:textSize="18sp"
        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="ACTIVITY C"
        android:textSize="32sp"
        android:gravity="center"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

这里复习下intent的知识:

Intent的概念:

Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的activity, service和broadcast receiver之间的交互。

Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。
activity、service和broadcast receiver之间是通过Intent进行通信的,而另外一个组件Content Provider本身就是一种通信机制,不需要通过Intent。

使用Context.startActivity()Activity.startActivityForResult(),传入一个intent来启动一个activity。使用 Activity.setResult(),传入一个intent来从activity中返回结果。

将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。将intent对象传给 Context.bindService()来绑定一个service。

将intent对象传给 Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则它们被传给 broadcast receiver。

Intent的相关属性:

Intent由以下各个组成部分:
component(组件):目的组件
action(动作):用来表现意图的行动
category(类别):用来表现动作的类别
data(数据):表示与动作要操纵的数据
type(数据类型):对于data范例的描写
extras(扩展信息):扩展信息
Flags(标志位):期望这个意图的运行模式

具体的可以看看大佬写的这篇,已经非常详细了,我就不再多述了。

猜你喜欢

转载自blog.csdn.net/i_nclude/article/details/105457083