1 概述
Activity之间的跳转主要使用
startActivity
这两个函数,传递数据的话利用Intent进行传递,负责数据需要配合Bundle使用.这篇文章讲述了如何利用这两个函数在Activity之间的跳转以及传递数据.
2 Activity间跳转
2.1 直接跳转
这里有两个Activity:FirstActivity与SecondActivity,从FirstActivity中跳转到SecondActivity中只需要一个startActivity()即可:
startActivity
一般需要在SecondActivity中加上finish()函数,表示这个Activity结束,比如这里直接在SecondActivity的按钮事件里面加上了finish():
![e542f3820acf26d35cec62350d985615.png](https://i-blog.csdnimg.cn/blog_migrate/e123092876f640e99298a58fe09a74b0.jpeg)
![3702575fe33f0695b797a3c4fa7ef7cf.gif](https://i-blog.csdnimg.cn/blog_migrate/9be5d399626c15274d29acc16a067b09.gif)
2.2 回调
很多情况下需要在FirstActivity跳转到SecondActivity后,在SecondActivity进行相应的操作,如更新数据之类,然后返回FirstActivity,通知FirstActivity执行某些操作,这时候就需要使用startActivityForResult(). startActivityForResult有两个参数,一个是Intent,表示将要跳转的Activity,一个是requestCode(int类型),表示请求码,用于调用Activity的onActivityResult()函数. 如FirstActivity中:
startActivityForResult
这里11就是请求码,然后在SecondActivity中,使用setResult()函数:
setResult
setResult()接受两个参数,第一个参数表示resultCode,从这个SecondActivity返回的结果码,另一个Intent,表示要返回给FirstActivity的数据. 最后在FirstActivity中重载onActivityResult():
![5969c9f7b803c6addf1aeaf78d150a43.png](https://i-blog.csdnimg.cn/blog_migrate/6ccbb13bbf06067bd3cc43b81fe43bcf.jpeg)
onActivityResult中判断请求码与结果码后进行相应操作.
![297732467832ae6e202b1258e9f46457.gif](https://i-blog.csdnimg.cn/blog_migrate/38d4afd25b6261cc624e639f75eeeac2.gif)
3 Activity间传递数据
3.1 传递普通数据
传递普通类型的数据直接使用Intent的putExtra()即可,putExtra接受两个参数,第一个是一个String,表示键,第二个是值,类型可以是byte,char,short,long等基本类型与这些基本类型组成的数组,当然String也可以.
![f8d301d70ff3d4876f62e16624907c79.png](https://i-blog.csdnimg.cn/blog_migrate/aa68c3b3abad7225ee243d06111f2515.jpeg)
比如在FirstActivity中,传递数据给SecondActivity:
![e6fa63797a0135398f815955585aa15d.png](https://i-blog.csdnimg.cn/blog_migrate/ffe0cb05622fd331a44ba066fbe438c3.png)
然后在SecondActivity中使用getIntent()获取Intent后,再从里面获取数据:
![b0155c9dfde9c77e6767f5e51fe2458b.png](https://i-blog.csdnimg.cn/blog_migrate/352a6c59b51a70ce971b25e6d5d9d97c.png)
如果想从SecondActivity中返回数据给FirstActivity,也就是从被调用的Activity中返回数据,可以使用前面介绍过的setResult()方法. 其中第二个参数是一个用于存储数据的Intent,把数据put进去即可.
![3139f55c83ee1bc77c98d40e62e0db2b.png](https://i-blog.csdnimg.cn/blog_migrate/db83ef7751422afaf142460340727b5c.png)
最后记得在onActivityResult做相应的判断处理:
![c4f2dfae85c284ad1be73998e21cba3b.png](https://i-blog.csdnimg.cn/blog_migrate/89ad8fc0c3ca878ce873df8bedb261a0.jpeg)
![537358812e3d138c9ab0bfc5df0d38ec.gif](https://i-blog.csdnimg.cn/blog_migrate/3b6f08782ca688146e36d19d8565a44e.gif)
3.2 传递一组数据
当数据的种类变多时,比如混合了int,String,byte,char等,可以对逐个类型使用putExtra(),但更好的方法是使用Bundle. Bundle的使用与Intent类似,也是对于不同的类型采用键值对的添加方法,直接putXXX:
![83b7952a558ff53b5c7b93e240baae2c.png](https://i-blog.csdnimg.cn/blog_migrate/f32927d51f0a1723966437f2daba514f.jpeg)
数据添加完毕之后,在intent中使用putExtras(bundle):
![5ba1aa3fdc72b7753c95548ea538c12a.png](https://i-blog.csdnimg.cn/blog_migrate/a07ec3eaa0b5b3c4daafebfd3f5a4b21.jpeg)
然后就可以在SecondActivity中接收数据了. 首先需要使用getIntent().getExtras()获取Bundle,再获取里面的数据.
![1d102362465e3085e3c9f5a3b8cac8ae.png](https://i-blog.csdnimg.cn/blog_migrate/ee82b6503444dfe21978083e6753a3d2.png)
注意一下获取到的Bundle有可能为null,取数据前需要判断一下.
![a648dd344ea982b7bedfe2eb71b883bf.gif](https://i-blog.csdnimg.cn/blog_migrate/6762c29b8ed00e98dd5929d3557b3eee.gif)
3.3 传递对象
如果想要传递的数据是一个对象怎么办?难道对每一个属性都使用getter再放进去吗? 并不是,Bundle提供了一个处理序列化对象的方法:
![e876aa4b396c5c41338678623aeb8f78.png](https://i-blog.csdnimg.cn/blog_migrate/3bdc5a70ed50c82d5dcc14507fe0d1b8.jpeg)
只要对象实现了Serializable,就可以被Bundle处理,比如这里有一个测试类Student:
![1b79dad39ca5512234f60cf590a4ea0a.png](https://i-blog.csdnimg.cn/blog_migrate/b9f569fdcacec1f4dcf1fa98406504b3.jpeg)
然后在FirstActivity中直接new一个,并使用Bundle的putSerializable即可.
![1a08f52604d32f4535e29ada3b03b52a.png](https://i-blog.csdnimg.cn/blog_migrate/c7068169469e17523dc086876d37dcb1.png)
接着再SecondActivity中通过Intent取出Bundle后,使用其中的getSerializable()取出对象,最后使用强制类型转换:
![d664af10ac022b94ccfa1f4689fb7b1f.png](https://i-blog.csdnimg.cn/blog_migrate/a07e7171b42e45ffdde4e0f9ea331a49.png)
![2c7113235a575a8c30aff3e2c228bd78.gif](https://i-blog.csdnimg.cn/blog_migrate/9baa31bc7b84d82bf0b7fd2bcfeea39b.gif)
4 源码
github 码云