startActivityForResult() 实例简述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38306233/article/details/82023477

在启动另外一个Activity的时候,有两种方法:

一种是直接使用startActivity,

另外一种就是使用startActivityForResult。

startActivityForResult的主要作用就是它可以回传数据

(1)startActivityForResult(Intent intent, int requestCode);

   第一个参数:一个Intent对象,用于携带将跳转至下一个界面中使用的数据,使用putExtra(A,B)方法,此处存储的数据类型特别多,基本类型全部支持。

   第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回,用来标识目标activity。

  与下面的resultCode功能一致,感觉Android就是为了保证数据的严格一致性特地设置了两把锁,来保证数据的发送,目的地的严格一致性。

(2)onActivityResult(int requestCode, int resultCode, Intent data)

  第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。

  第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。

  第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据,

(3)setResult(int resultCode, Intent data)

  在意图跳转的目的地界面调用这个方法把Activity想要返回的数据返回到主Activity,

  第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。

  第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。上面由济南大介绍。

=======================================================================================

下边这个例子看一看:

1.页面跳转的时候不采用startActivity(intent) ,而采用startActivityForResult(intent, REQUEST_CODE)。

public static int REQUEST_CODE = 1;
Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("text", editText.getText().toString());//添加数据 key为 text,value 为edittext中输入的String
startActivityForResult(intent, REQUEST_CODE);//这里采用startActivityForResult来做跳转,启动activity ,并传入requestCode请求码 请求码可以自己定义 我这边声明的是1(大于等于0即可),你也可以直接写成startActivityForResult(intent, 1)

2.重写onActivityResult方法,用来接收OtherActivity回传的数据,当OtherActivity执行finish()方法后调用。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == REQUEST_CODE && resultCode == OtherActivity.RESULT_CODE) {//resultCode是返回的结果码 在Other中通过setResult()方法返回给第一个activity
        editText.setText(data.getStringExtra("text"));//获取返回的数据,转成String类型 显示到edittext控件上
    }
}

3.在OtherActivity中回传数据时采用setResult方法,并且之后要调用finish方法。

public static int RESULT_CODE = 1;
Intent intent = new Intent();
intent.putExtra("text", editText.getText().toString());//根据key “text” 把获取OtherActivity中的edittext中的String回传给第一个activity
setResult(RESULT_CODE, intent);//回传结果码,我这边也是给1,大于等于0即可,值随意
finish();//setResult之后必须调用finish方法

4.这里finish执行完 OtherActivity就关闭 开始执行步骤2中的onActivityResult方法  就能接通过发出的请求码1 和 从activity返回的结果码1 一起来识别返回的数据

温馨提示:

要想返回到第一个activity中onActivityResult方法   要在Activity 执行finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

源码也比较简单,贴一下吧:

MainActivity.java:

package com.tissmarthome.startactivityresult;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private EditText editText;
    private Button button;
    public static int REQUEST_CODE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        LinearLayout layout = new LinearLayout(this);
        editText = new EditText(this);
        button = new Button(this);
        button.setText("Main");
        button.setOnClickListener(this);


        layout.addView(editText);
        layout.addView(button);
        setContentView(layout);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, OtherActivity.class);
        intent.putExtra("text", editText.getText().toString());//添加数据 key为 text,value 为edittext中输入的String
        startActivityForResult(intent, REQUEST_CODE);//这里采用startActivityForResult来做跳转,启动activity ,并传入requestCode请求码 请求码可以自己定义 我这边声明的是1(大于等于0即可),你也可以直接写成startActivityForResult(intent, 1)
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == REQUEST_CODE && resultCode == OtherActivity.RESULT_CODE) {//resultCode是返回的结果码 在Other中通过setResult()方法返回给第一个activity
            editText.setText(data.getStringExtra("text"));//获取返回的数据,转成String类型 显示到edittext控件上
        }
    }
}

OtherActivity.java:

package com.tissmarthome.startactivityresult;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;

/**
 * Created by TRJ on 2018/8/29.
 */
public class OtherActivity extends Activity implements View.OnClickListener{

    private EditText editText;
    private Button button;
    public static int RESULT_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout layout = new LinearLayout(this);
        editText = new EditText(this);
        button = new Button(this);
        button.setText("Other");
        button.setOnClickListener(this);

        layout.addView(editText);
        layout.addView(button);
        setContentView(layout);

        editText.setText(getIntent().getStringExtra("text"));
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent();
        intent.putExtra("text", editText.getText().toString());//根据key “text” 把获取OtherActivity中的edittext中的String回传给第一个activity
        setResult(RESULT_CODE, intent);//回传结果码,我这边也是给1,大于等于0即可,值随意
        finish();//setResult之后必须调用finish方法
    }
}

注意OtherActivity需要在AndroidManifest.xml清单文件中注册:

<activity android:name=".OtherActivity"/>

注意:因为我是直接在代码中添加布局跟控件的,所以是没有布局文件的,新手也不要感觉迷惑。

部分参考:https://www.cnblogs.com/jfice/p/6617719.html

猜你喜欢

转载自blog.csdn.net/qq_38306233/article/details/82023477