您的位置:首页 > 移动开发 > Android开发

野人学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 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日
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: