野人学Android基础篇之四大组件第一课--Activity的Intent传递

来源:互联网 发布:sql if两个判断 编辑:程序博客网 时间:2024/05/22 02:16

在web编程中,get和post充当html之间的信使。那么在Android中谁充当Activity的“信使”呢?答案是Intent!

那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);//实例化IntentBundle bundle = new Bundle();//实例化Bundlebundle.putString("name","野人");//给Bundle赋值intent.putExtras(bundle);//将Bundle类赋值给IntentstartActivity(intent);//启动传递

B Activity的代码:

Intent intent = getIntent();//获取IntentBundle bundle = intent.getExtras();//获取BundleString 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);@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.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日



0 0
原创粉丝点击