野人学Android基础篇之四大组件第一课--Activity的Intent传递
2015-09-05 13:46
816 查看
在web编程中,get和post充当html之间的信使。那么在Android中谁充当Activity的“信使”呢?答案是Intent!
那Intent如何使用呢?按照目的不同,分成三种方式:
1.无参数传递
2.参数传递
3.返回传递
一、无参数传递
这种传递方式有点像web编程中的网页跳转,从一个页面转到另一个页面,不带一个参数。原理图如下:
从这个原理图中可以看出,从A页面跳转到B页面的时候,A页面会调用startActivity()方法,就能传送到B页面了。来点代码,更加直观。
来简单解释下Intent的参数,第一个是上下文,第二个是目标class,就是你要跳转到的Activity。当实例化Intent之后,直接调用startActivity(intent),就Ok了!
二、参数传递
如果Intent传递不能携带参数,那不是太逊了。那我们来了解下Intent是怎么携带参数传递的吧。
如图所示,首先我们要在A页面给Intent绑定数据,用的是putExtras()方法。然后就可以调用startActivity()方法,使用方法和上面的一致。接着在B页面中接收Intent,可以直接用getIntent()方法,赋值给Intent。那接下来我们就要从Intent中抠出数据,就直接用getExtras()方法,这样就能获取A页面传递过来的参数,至于这个参数你想怎么用,那就看你喽。
A Activity的代码:
B Activity的代码:
这里的Bundle类是上一篇博客中讲到的,有不懂的可以参考我上一篇博客。好了,有了这些核心代码,赶快去试试效果吧。
三、返回传递
这个传递是最复杂的一个,因为不仅要从A传递参数给B,并且B还要返回参数给A。听起来是不是有点高大上,那先来看下原理图吧。
在A页面中给Intent绑定数据的那段我就不讲了,讲一下不一样的。因为要从B中得到返回值,启动传递的方法也不一样,这次是startActivityForResult(),如果有点英语基础的,因为能明白这个方法的字面意思。除了启动这个方法,还要重写一个方法,在返回的时候被调用,就是onActivityResult()。然后就是在B页面中进行编写,获取A传递过来的参数的方法还是和前面的一样,就是在返回给A页面的时候,调用了setResult(),其他的没有什么不同。
A Activity的代码:
在Android文档中,对于resquestCode的解释是“If >= 0, this code will be returned in onActivityResult() when the activity exits.”,翻译过来就是“如果resquestCode的值大于等于0,那么当activity存在的时候,这个参数就会在onActivityResult()方法中返回”。ok,如果有兴趣的话,大家可以通过调试requestCode的大小来验证下这句话对不对。
B Activity的代码:
setResult的第一个参数分别由三个常量可供选择,RESULT_OK(对应的int是-1,指结果正常)、RESULT_CANCELED(对应的int是0,指结果取消)、RESULT_FIRST_USER(对应的int是1,指第一次接触)。有了这些核心代码,相信你能很快实现多个Activity之间的intent传递效果。
百变不离其宗。不管以后的开发有多复杂,都是建立在这些基础之上。希望大家能多多练习,带着疑问去练习,在练习中找到答案。本来还想讲一下多个Activity交互对生命周期的影响,但是我想,大家自己去发现结果的快乐,远比我直接告诉大家结果所带来的快乐更大。四大组件还有三个,我暂时不准备讲了,以后有机会会补上的。本系列还有三节内容,异步任务、数据存储、网络通讯,都是硬骨头!
写于2015年9月5日
那Intent如何使用呢?按照目的不同,分成三种方式:
1.无参数传递
2.参数传递
3.返回传递
一、无参数传递
这种传递方式有点像web编程中的网页跳转,从一个页面转到另一个页面,不带一个参数。原理图如下:
从这个原理图中可以看出,从A页面跳转到B页面的时候,A页面会调用startActivity()方法,就能传送到B页面了。来点代码,更加直观。
Intent intent = new Intent(this, B.class); startActivity(intent);
来简单解释下Intent的参数,第一个是上下文,第二个是目标class,就是你要跳转到的Activity。当实例化Intent之后,直接调用startActivity(intent),就Ok了!
二、参数传递
如果Intent传递不能携带参数,那不是太逊了。那我们来了解下Intent是怎么携带参数传递的吧。
如图所示,首先我们要在A页面给Intent绑定数据,用的是putExtras()方法。然后就可以调用startActivity()方法,使用方法和上面的一致。接着在B页面中接收Intent,可以直接用getIntent()方法,赋值给Intent。那接下来我们就要从Intent中抠出数据,就直接用getExtras()方法,这样就能获取A页面传递过来的参数,至于这个参数你想怎么用,那就看你喽。
A Activity的代码:
Intent intent = new Intent(this, B.class);//实例化Intent Bundle bundle = new Bundle();//实例化Bundle bundle.putString("name","野人");//给Bundle赋值 intent.putExtras(bundle);//将Bundle类赋值给Intent startActivity(intent);//启动传递
B Activity的代码:
Intent intent = getIntent();//获取Intent Bundle bundle = intent.getExtras();//获取Bundle String name = bundle.getString("name");//获取name值
这里的Bundle类是上一篇博客中讲到的,有不懂的可以参考我上一篇博客。好了,有了这些核心代码,赶快去试试效果吧。
三、返回传递
这个传递是最复杂的一个,因为不仅要从A传递参数给B,并且B还要返回参数给A。听起来是不是有点高大上,那先来看下原理图吧。
在A页面中给Intent绑定数据的那段我就不讲了,讲一下不一样的。因为要从B中得到返回值,启动传递的方法也不一样,这次是startActivityForResult(),如果有点英语基础的,因为能明白这个方法的字面意思。除了启动这个方法,还要重写一个方法,在返回的时候被调用,就是onActivityResult()。然后就是在B页面中进行编写,获取A传递过来的参数的方法还是和前面的一样,就是在返回给A页面的时候,调用了setResult(),其他的没有什么不同。
A Activity的代码:
Intent intent = new Intent(this, B.class); Bundle bundle = new Bundle(); bundle.putString("name","野人"); intent.putExtras(bundle); startActivityForResult(intent,resquestCode); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (requestCode==REQUEST_CODE){ <span style="white-space:pre"> </span>if(resultCode==RESULT_CANCELED) <span style="white-space:pre"> </span>setTitle("cancle"); <span style="white-space:pre"> </span>else if (resultCode==RESULT_OK) { <span style="white-space:pre"> </span>String temp=null; Bundle bundle=data.getExtras(); if(bundle!=null){ temp=bundle.getString("name"); tv.setText(temp); } } }else{ Toast.makeText(this, "dd"+requestCode, Toast.LENGTH_SHORT).show(); } }
在Android文档中,对于resquestCode的解释是“If >= 0, this code will be returned in onActivityResult() when the activity exits.”,翻译过来就是“如果resquestCode的值大于等于0,那么当activity存在的时候,这个参数就会在onActivityResult()方法中返回”。ok,如果有兴趣的话,大家可以通过调试requestCode的大小来验证下这句话对不对。
B Activity的代码:
Bundle bundle = getIntent().getExtras(); name = bundle.getString("name"); Intent intent = getIntent(); bundle2.putString("name", "Hello,这是从SecondActivity传来的消息!"); it.putExtras(bundle2); setResult(RESULT_OK, intent);//返回带有参数的intent给A
setResult的第一个参数分别由三个常量可供选择,RESULT_OK(对应的int是-1,指结果正常)、RESULT_CANCELED(对应的int是0,指结果取消)、RESULT_FIRST_USER(对应的int是1,指第一次接触)。有了这些核心代码,相信你能很快实现多个Activity之间的intent传递效果。
百变不离其宗。不管以后的开发有多复杂,都是建立在这些基础之上。希望大家能多多练习,带着疑问去练习,在练习中找到答案。本来还想讲一下多个Activity交互对生命周期的影响,但是我想,大家自己去发现结果的快乐,远比我直接告诉大家结果所带来的快乐更大。四大组件还有三个,我暂时不准备讲了,以后有机会会补上的。本系列还有三节内容,异步任务、数据存储、网络通讯,都是硬骨头!
写于2015年9月5日
相关文章推荐
- android学习笔记(15)Android消息机制
- android学习笔记(14)Status Bar Notification 状态栏、通知栏推送
- Android Parcel初识
- android中.9.png图片
- 如何检查后台服务(Android的Service类)是否正在运行?
- Android下Json文件解析
- 倍数提高工作效率的Android Studio奇技
- 【Android进阶】-Android组合的方式自定义控件
- Android(java)学习笔记209:采用get请求提交数据到服务器(qq登录案例)
- Android学习系列之(六)Fragment初涉
- Android:使用fragment(碎片)—让你的应用更灵活(一)简单运用
- Android Universal Image Loader 源码分析
- android图片压缩终极解决方案
- Android中JNI的使用方法
- android6.0进入Material Design时代
- android-百度地图
- Android延时执行调用的几种方法
- Android的Tween动画与控制动画的Interpolator
- android 的service
- android-Fragment和Activity通信:将Fragment中的数据传入Activity