Intent传值和Bundle传值的区别

举个例子:我现在要从A界面跳转到B界面或者C界面
这样的话,我就需要写2个Intent,如果你还要涉及的传值的话,你的Intent就要写两遍添加值的方法。那么,如果我用1个Bundle,直接把值先存里边,然后再存到Intent中,不就更简洁吗?

另外一个例子:如果我现在有Activity A ,B ,C;
现在我要把值通过A经过B传给C
你怎么传?如果用Intent的话,A-B先写一遍,再在B中都取出来,然后在把值塞到Intent中,再跳到C,累吗?
如果我在A中用了Bundle的话,我把Bundle传给B,在B中再转传到C,C就可以直接去了。
这样的话,还有一个好处,就是在B中还可以给Bundle对象添加新的key-value,同样可以在C中取出来。

Android中提供了Intent机制来协助应用间的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。Intent这个英语单词的本意是“目的、意向”等,对于较少从事于大型平台开发工作的程序员来说,这可能是一个不太容易理解的抽象概念,因为它与我们平常使用的简单函数/方法调用,或者上节中提到的通过库调用接口的方式不太一样。在Intent的使用中你看不到直接的函数调用,相对函数调用来说,Intent是更为抽象的概念,利用Intent所实现的软件复用的粒度是Activity/Service,比函数复用更高一些,另外耦合也更为松散。


Activity间用Intent和Bundle传递参数

传递方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//点击btn_sub传递 fieldHeight.getText()和 fieldWeight.getText()
private void setListeners(){
btn_sub.setOnClickListener(calrBMI);
}

private OnClickListener calrBMI = new OnClickListener(){
public void onClick(View v){
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("key_height", fieldHeight.getText().toString());
bundle.putString("key_weight", fieldWeight.getText().toString());
intent.setClass(ActivityMain.this,Report.class);
intent.putExtras(bundle);
startActivity(intent);
}
};

接收方:

1
2
3
4
Bundle bundle = new Bundle();
bundle = this.getIntent().getExtras();
double height = Double.parseDouble(bundle.getString("key_height"))/100;
double weight = Double.parseDouble(bundle.getString("key_weight"));

Bundle携带对象来传输对象
传输的对象需要实现序列化:有两种方式,一种是实现Serializable接口,就是原来的java方式;另外一种是android的Parcelable方式,这个性能可能好一些,我猜的,但是这在需要手动去写Parcelable接口的实现。

Serializable存数据:

1
2
3
4
5
6
7
Person mPerson = new Person();  
mPerson.setName("frankie");
mPerson.setAge(25);
Intent mIntent = new Intent(this,ObjectTranDemo1.class);
Bundle mBundle = new Bundle();
mBundle.putSerializable("person",mPerson);
mIntent.putExtras(mBundle);

Serializable取数据:

1
2
3
4
5
6
// 获取启动该ResultActivity的Intent
Intent intent = getIntent();
// 获取该Intent所携带的数据
Bundle bundle = intent.getExtras();
// 从bundle数据包中取出数据
Person person = (Person) bundle.getSerializable("person");

Parcelable存数据:

1
2
3
4
Intent mIntent = new Intent(this,ObjectTranDemo2.class);  
Bundle mBundle = new Bundle();
mBundle.putParcelable(PAR_KEY, mBook);
mIntent.putExtras(mBundle);

Parcelable取数据:
Book mBook = (Book)getIntent().getParcelableExtra(ObjectTranDemo.PAR_KEY);

参考:Intent 传值和 Bundle传值的区别
Android中Intent传递对象的两种方法(Serializable,Parcelable)
http://my.oschina.net/u/577632/blog/76906