一个需求:一个activity到另一个activity进行一些设置,返回第一个activity的时候 获取第二个activity设置的数据
百度了一下,发现startActivityForResult这个很完美的符合了我的效果要求。
正文:
startActivityForResult的主要作用就是它可以回传数据,假设我们有两个页面,首先进入第一个页面,里面有一个按钮,用于进入下一个页面,当进入下一个页面时,进行设置操作,并在其finish()动作或者back动作后,将设置的值回传给第一个页面,从而第一个页面来显示所得到的值。这个有一点像回调方法,就是在第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法。
这里看下Demo,一共两个activity
让我们来看下代码:
1 package other; 2 3 import com.example.allcode.R; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.os.Bundle; 8 import android.view.View; 9 import android.view.View.OnClickListener; 10 import android.widget.Button; 11 import android.widget.TextView; 12 13 public class Use_startActivityForResult_frist extends Activity implements OnClickListener{ 14 private TextView text_frist; 15 private TextView text_second; 16 private Button btn_frist; 17 private Button btn_second; 18 int requestCode = 0; 19 Intent intent; 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 // TODO Auto-generated method stub 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.other_frist_activity); 25 text_frist = (TextView) findViewById(R.id.id_frist_text); 26 text_second = (TextView) findViewById(R.id.id_second_text); 27 btn_frist = (Button) findViewById(R.id.btn_frist); 28 btn_second = (Button) findViewById(R.id.btn_second); 29 btn_frist.setOnClickListener(this); 30 btn_second.setOnClickListener(this); 31 32 33 intent = new Intent(); 34 intent.setClass(Use_startActivityForResult_frist.this,Use_startActivityForResult_second.class); 35 36 } 37 @Override 38 public void onClick(View v) { 39 // TODO Auto-generated method stub 40 switch (v.getId()) { 41 case R.id.btn_frist: 42 // 请求码的值随便设置,但必须>=0 43 requestCode = 0; 44 startActivityForResult(intent, requestCode); 45 break; 46 case R.id.btn_second: 47 requestCode = 2; 48 startActivityForResult(intent, requestCode); 49 break; 50 default: 51 break; 52 } 53 54 } 55 56 57 // 回调方法,从第二个页面回来的时候会执行这个方法 58 @Override 59 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 60 String change01 = data.getStringExtra("change01"); //获取change01 对应的数据 61 String change02 = data.getStringExtra("change02"); //获取change02 对应的数据 62 // 根据上面发送过去的请求吗来区别 63 switch (requestCode) { 64 case 0: 65 text_frist.setText(change01); //根据请求码执行相应的操作 66 break; 67 case 2: 68 text_second.setText(change02); 69 break; 70 default: 71 break; 72 } 73 74 } 75 76 77 }
1 package other; 2 3 import com.example.allcode.R; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.os.Bundle; 8 9 public class Use_startActivityForResult_second extends Activity{ 10 int resultCode = 0; 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 // TODO Auto-generated method stub 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.other_second_activity); 16 17 Intent intent = new Intent(); 18 intent.putExtra("change01", "第一行值已经改变,现在为:1000"); //给change01参数一个值1000 19 intent.putExtra("change02", "第二行值已经改变,现在为:2000"); //给change02参数一个值2000 注意这个值,即第二个参数必须是字符串类型的 20 // 设置结果,并进行传送 21 this.setResult(resultCode, intent); 22 this.finish(); 23 } 24 25 }
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 > 7 <TextView 8 android:id="@+id/id_frist_text" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:text="第一行文本信息" 12 /> 13 <TextView 14 android:id="@+id/id_second_text" 15 android:layout_width="fill_parent" 16 android:layout_height="wrap_content" 17 android:text="第二行文本信息" 18 /> 19 <Button 20 android:id="@+id/btn_frist" 21 android:layout_width="fill_parent" 22 android:layout_height="wrap_content" 23 android:text="改变第一行文本的值" 24 /> 25 <Button 26 android:id="@+id/btn_second" 27 android:layout_width="fill_parent" 28 android:layout_height="wrap_content" 29 android:text="改变第二行文本的值" 30 /> 31 </LinearLayout>
效果图:
请求码的作用
使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法(该方法需要重写)。
结果码的作用
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):