利用Intent进行数据传递
前面两节讲到过Intent的使用,主要用来在活动之间起到一个桥梁的作用,但是无论显式Intent还是隐式Intent,目前我们只是用来启动活动,其实Intent还可以在启动活动的时候传递数据,本节我们就来学习一下。
在启动活动的时候传递数据的思路很简单,Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动之后,只需要把这些数据再从Intent中取出就可以了。比如说我们还用之前的例子,FirstActivity中有一个字符串,现在要把这个字符串传递到SecondActivity中,FirstActivity我们就可以这样写:
public class FirstActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); //在活动中加载first_layout布局 Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String data = "Hello SecondActivity"; Intent intent = new Intent("com.example.activitytest1.ACTION_START"); intent.addCategory("com.example.activitytest1.MY_CATEGORY"); intent.putExtra("extra_data",data); startActivity(intent); } }); } }
其中,String data就是我们要传递的字符串,我们使用隐式Intent的方式来启动SecondActivity,然后通过putExtra()方法接收两个参数,第一个参数是键,用于后面从Intent中取值,第二个参数才是我们真正要传递的数据。接下来看一下在SecondActivity中如何取出传递过来的数据,代码如下:
public class SecondActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second_layout); //加载second_layout布局 Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Log.d("SecondActivity",data); } }
同样很好理解,首先通过getIntent()方法用来获取用于启动SecondActivity活动的Intent,然后调用getStringExtra()方法,传入相应的键,就可以得到传递过来的数据了。这里由于我们传递的是字符串,所以用getStringExtra()方法来获取,如果传递的是整型数据,则使用getIntExtra()方法。如果传递的是布尔型数据,则使用getBooleanExtra()方法,以此类推。
好了,现在我们来运行一下程序,点击button1按钮,就会跳转到SecondActivity中,并且会传入相应的数据,如下图:
跳转的界面我就不放上来了,就是和之前的一样。这里我截了一段日志。我们在红框中可以看到,从FirstActivity中传递的字符串内容成功的传递到了SecondActivity中。那么,通过Intent向下一个活动传递数据就成功了。
接下来我们看一下,如何把数据返回给上一个活动。我们先来看FirstActivity中的代码:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first_layout); //在活动中加载first_layout布局 Button button1 = (Button) findViewById(R.id.button_1); button1.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ Intent intent = new Intent("com.example.activitytest1.ACTION_START"); intent.addCategory("com.example.activitytest1.MY_CATEGORY"); startActivityForResult(intent,1); //通过startActivityForResult()方法来启动下一个活动 } }); }
在这里,我们使用startActivityForResult()来启动活动,其中,第一个参数是intent,第二个参数是请求码,用于在之后的回掉中判断数据的来源。因为这个方法会在活动销毁的时候能够返回一个结果给上一个活动。
再来看一下SecondActivity中的代码,如下:
红框中的代码,intent不是用来启动活动的,而是用来传递数据的,通过调用setResult()方法,其中这个方法有两个参数,第一个用于向上一个活动返回一个处理结果,第二个参数用于传递数据回去。因为我们是使用的startActivityForResult()方法来启动的活动,所以SecondActivity在被销毁之后会回掉上一个活动的onActivityResult()方法,因此,我们在FirstActivity中重写这个方法来获得返回的数据,代码如下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode){ case 1: if(resultCode == RESULT_OK){ String returnedData = data.getStringExtra("data_return"); Log.d("FirstActivity",returnedData); } break; default: } }
这个方法中带有三个参数,其中第一个参数是requestCode,就是我们在请求活动时传入的请求码。第二个参数时resultCode,是我们在返回数据时传入的处理结果,第三个参数data,就是携带着返回数据的Intent。
由于在上一个活动中可能调用startActivityForResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调到onActivityResult()这个方法中,因此我们要先通过requestCode这个请求码来判断数据的来源,也就是是否是从SecondActivity中返回的数据。再通过resultCode来判断处理结果是否成功,最后从data中获得数据。
我们运行程序,点击button2按钮,看下日志显示情况:
Hello FirstActivity,正是我们从SecondActivity返回给上一个活动的数据。说明我们通过Intent来向上一个活动以及下一个活动传递数据都成功了。
好了,关于通过Intent来传递数据,就学到这里。想必聪明的你一定已经完全掌握了。下一节,我们来学习一下活动的生命周期,非常非常重要的一个知识点。不要错过哦!