在启动另外一个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清单文件中注册:
注意:因为我是直接在代码中添加布局跟控件的,所以是没有布局文件的,新手也不要感觉迷惑。
部分参考:https://www.cnblogs.com/jfice/p/6617719.html