Intent除了可以开启一个活动,还能在启动活动的时候传递数据,此时Intent相当于一个保存数据的库,我们先把数据保存在Intent中,然后再根据各个activity的需要从其中取出数据。

 一、使用Intent向下一个activity传递数据

  1、思路:Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂时保存在Intent中,当启动另外一个活动后,再把这些数据从Intent中取出来就行了。

  2、在FirstActivity.java中有一个字符串,把这个字符串传递到SecondActivity.java中,操作如下:

FirstActivity.java中的代码:

SecondActivity.java中的代码:

  3、效果展示:

 

点击button1:进入到SecondActivity.java的活动页面

 

查看Logcat:
  1、根据SecondActivity.java中Log.d()传入的tag数据添加一个过滤器:SecondActivity

  2、将过滤器选为SecondActivity,就会看到打印出的数据

 

 二、使用Intent返回数据给上一个活动

  1、在Activity中有一个方法也可以启动活动,这个方法就是:startActivityForResult()方法,它可以在活动销毁的时候返回一些数据给上一个活动,startActivityForResult()方法接受两个参数。一个参数是Intent,第二个是请求码,用于在之后的回调中判断数据的来源,请求码只要是唯一的就行了(比如常量)。

FirstActivity.java的代码: 

 1 public class FirstActivity extends AppCompatActivity {
 2     @Override
 3     protected void onCreate(@Nullable Bundle savedInstanceState) {
 4         super.onCreate(savedInstanceState);
 5         setContentView(R.layout.first_layout);
 6         Button button = (Button) findViewById(R.id.button1);
 7         button.setOnClickListener(new View.OnClickListener() {
 8             @Override
 9             public void onClick(View view) {
10                 Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
11                 startActivityForResult(intent, 1);
12                 /*
13                 1、startActivityForResult()方法:当一个活动销毁时返回一个数据给上一个活动,它也可以开启一个活动,它传入两个参数
14                     第一个参数:intent
15                     第二个参数:请求码,唯一即可,用于判断数据的来源
16                 2、使用startActivityForResult()方法来开启SecondActivity,当SecondActivity活动销毁过后,会调用上一个活动的onActivityResult()方法,
17                     即这里的FirstActivity中的onActivityResult()方法,因此我们要在FirstActivity活动中重写onActivityResult()方法。
18                     onActivityResult()这个方法的作用是得到返回的数据。
19                 */
20             }
21         });
22     }
23 
24     @Override
25     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
26         switch (requestCode) {
27             case 1:
28                 if (resultCode == RESULT_OK) {
29                     String returnData = data.getStringExtra("return_extra");
30                     Log.d("FirstActivity", returnData);
31                     /*
32                     1、该方法中传入三个参数:
33                         requestCode:请求码
34                         resultCode:处理结果
35                         data:携带数据的Intent
36                     */
37                 }
38                 break;
39             default:
40                 break;
41         }
42     }
43 }

 

SecondActivity.java中的代码:

  2、运行效果:

点击button1:进入SecondActivity活动界面

打开Logcat查看打印数据(先创建一个FirstActivity的过滤器):

 

 三、点击Back键返回数据
  上面返回给FirstActivity的数据是在点击SecondActivity活动界面的button2按钮触发的,如果用户直接通过手机的Back键回到FirstActivity界面,也是可以返回数据,我们只需要在SecondActivity.java中重写onBackPressed()方法就能解决该问题,代码如下:

  想要点击按钮与Back键均能返回数据,其他代码不变,把SecondActivity的代码结合就行了:

 1 public class SecondActivity extends AppCompatActivity {
 2        @Override
 3    protected void onCreate(@Nullable Bundle savedInstanceState) {
 4        super.onCreate(savedInstanceState);
 5        setContentView(R.layout.second_layout);
 6        Button button=findViewById(R.id.button2);
 7        button.setOnClickListener(new View.OnClickListener() {
 8            @Override
 9            public void onClick(View view) {
10                Intent intent=new Intent();
11                intent.putExtra("return_extra","Button FirstActivity");
12                setResult(RESULT_OK,intent);
13                finish();
14                /*
15                 1、这里的Intent仅仅是传递数据而已,没有任何意图,通过putExtra()方法把数据存放在intent中
16                 2、setResult()方法:这个方法很重要,是专门用于向上一个活动返回数据的,这个方法有两个参数:
17                     第一个参数:用于向上一个活动返回数据的处理结果,RESULT_OK 、 RESULT_CANCELED两种
18                     第二个参数:返回的数据,将带有数据的intent返回过去
19                 3、finish():销毁活动
20                 */
21             }
22         });
23     }
24     @Override
25     public void onBackPressed() {
26         Intent intent=new Intent();
27         intent.putExtra("return_extra","Back FirstActivity");
28         setResult(RESULT_OK,intent);
29         finish();
30     }
31 }