1 概述
Activity之间的跳转主要使用
startActivity(Intent intent);
startActivityForResult(Intent intent,int requestCode);
这两个函数,传递数据的话利用Intent进行传递,负责数据需要配合Bundle使用.这篇文章讲述了如何利用这两个函数在Activity之间的跳转以及传递数据.
2 Activity间跳转
2.1 直接跳转
这里有两个Activity:FirstActivity与SecondActivity,从FirstActivity中跳转到SecondActivity中只需要一个startActivity()即可:
startActivity(new Intent(this,SecondActivity.class));
一般需要在SecondActivity中加上finish()函数,表示这个Activity结束,比如这里直接在SecondActivity的按钮事件里面加上了finish():
![283dd7d3e41ca2d38c7011231ca3433e.png](https://i-blog.csdnimg.cn/blog_migrate/2cf49372e2bda87a4bbba12d60df1495.jpeg)
![8183907ee4dfa303310e5c0eaf0b7547.gif](https://i-blog.csdnimg.cn/blog_migrate/daa00f86d814a4ad076ccd9b0a3afd3e.gif)
2.2 回调
很多情况下需要在FirstActivity跳转到SecondActivity后,在SecondActivity进行相应的操作,如更新数据之类,然后返回FirstActivity,通知FirstActivity执行某些操作,这时候就需要使用startActivityForResult(). startActivityForResult有两个参数,一个是Intent,表示将要跳转的Activity,一个是requestCode(int类型),表示请求码,用于调用Activity的onActivityResult()函数. 如FirstActivity中:
startActivityForResult(new Intent(this,SecondActivity.class),11);
这里11就是请求码,然后在SecondActivity中,使用setResult()函数:
setResult(22,new Intent().putExtra("str","from second activity"));
setResult()接受两个参数,第一个参数表示resultCode,从这个SecondActivity返回的结果码,另一个Intent,表示要返回给FirstActivity的数据. 最后在FirstActivity中重载onActivityResult():
![7bbf332912383696143dd69ab64221df.png](https://i-blog.csdnimg.cn/blog_migrate/38ae61e887e26de29d037a069db16700.jpeg)
onActivityResult中判断请求码与结果码后进行相应操作.
![345cbaaafc3e010989fa7ffef8ef7f08.gif](https://i-blog.csdnimg.cn/blog_migrate/66d7f63812c1e6a9849ab52fc7a26681.gif)
3 Activity间传递数据
3.1 传递普通数据
传递普通类型的数据直接使用Intent的putExtra()即可,putExtra接受两个参数,第一个是一个String,表示键,第二个是值,类型可以是byte,char,short,long等基本类型与这些基本类型组成的数组,当然String也可以.
![fc49dfd565c6a4f0dd111ca250e12b44.png](https://i-blog.csdnimg.cn/blog_migrate/169fa1ff1f2d97781387946979148bc4.jpeg)
比如在FirstActivity中,传递数据给SecondActivity:
![3b35cee0066ae71eafff3fef36ea0fde.png](https://i-blog.csdnimg.cn/blog_migrate/03b165a6d455fcdfd136d7ca350f9756.png)
然后在SecondActivity中使用getIntent()获取Intent后,再从里面获取数据:
![f380cda8e57b532f86541e46f794f964.png](https://i-blog.csdnimg.cn/blog_migrate/e80cdcc2513bbae92f0f6c6aa7b426c2.png)
如果想从SecondActivity中返回数据给FirstActivity,也就是从被调用的Activity中返回数据,可以使用前面介绍过的setResult()方法. 其中第二个参数是一个用于存储数据的Intent,把数据put进去即可.
![99583a46b017c866ab130d86189f6527.png](https://i-blog.csdnimg.cn/blog_migrate/22a3481fd9cda69509a286eaa5a988e8.png)
最后记得在onActivityResult做相应的判断处理:
![94307138f78aa019e14b9b889503627d.png](https://i-blog.csdnimg.cn/blog_migrate/9e1c65e63f7d8d6e75f7bf3abe551508.jpeg)
![01fdbde077a61b2bfca576a2f1036d3e.gif](https://i-blog.csdnimg.cn/blog_migrate/eb8617e00a02993eaf5688089f029603.gif)
3.2 传递一组数据
当数据的种类变多时,比如混合了int,String,byte,char等,可以对逐个类型使用putExtra(),但更好的方法是使用Bundle. Bundle的使用与Intent类似,也是对于不同的类型采用键值对的添加方法,直接putXXX:
![b209de45874d2e35992ba3400488300a.png](https://i-blog.csdnimg.cn/blog_migrate/c38a047a5335965dff943d2155f910f4.jpeg)
数据添加完毕之后,在intent中使用putExtras(bundle):
![e79c7fde340283632919fa91e29996ad.png](https://i-blog.csdnimg.cn/blog_migrate/e043e1c9489546b2c8d443519bc7942f.jpeg)
然后就可以在SecondActivity中接收数据了. 首先需要使用getIntent().getExtras()获取Bundle,再获取里面的数据.
![a8312bd4ada87ea7bba81bc69f905469.png](https://i-blog.csdnimg.cn/blog_migrate/57b48d8faee8a516fc23d9fd2d82a4ea.png)
注意一下获取到的Bundle有可能为null,取数据前需要判断一下.
![f98ae45120baea4f18f400c772ab1245.gif](https://i-blog.csdnimg.cn/blog_migrate/5055f98a713e22ca686dcef4348bdbaf.gif)
3.3 传递对象
如果想要传递的数据是一个对象怎么办?难道对每一个属性都使用getter再放进去吗? 并不是,Bundle提供了一个处理序列化对象的方法:
![137d33c00c092ec598d22e06a680e17b.png](https://i-blog.csdnimg.cn/blog_migrate/127a4a8ba168549d549f6a8e8efe8c66.jpeg)
只要对象实现了Serializable,就可以被Bundle处理,比如这里有一个测试类Student:
![b0407d94ca297f89b794202305471bae.png](https://i-blog.csdnimg.cn/blog_migrate/b80ef11c3036342f9b05997b1e7eb8df.jpeg)
然后在FirstActivity中直接new一个,并使用Bundle的putSerializable即可.
![6917cb8f6224feb739e9003ba8dd2a3e.png](https://i-blog.csdnimg.cn/blog_migrate/39e25e09101de6fa9043b19b1ec77f56.png)
接着再SecondActivity中通过Intent取出Bundle后,使用其中的getSerializable()取出对象,最后使用强制类型转换:
![73c58cf4e008dc0c734c8a32100afe44.png](https://i-blog.csdnimg.cn/blog_migrate/beccc0d88633370022fb9d184801da4a.png)
![cce537799baf83cd72cf5d6eba37388e.gif](https://i-blog.csdnimg.cn/blog_migrate/22239842068b5e5efe881f3f7093268e.gif)
4 源码
github 码云