intent.putextra用法 使用Intent传递对象的两种方式

发布时间:2017-05-22

来源:服务器之家

Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动、发送广播、启动服务等。在进行上述操作的时候,我们还可以在Intent 中添加一些附加数据,以达到传值的效果,比如在FirstActivity 中添加如下代码:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

intent.putExtra("string_data", "hello");

intent.putExtra("int_data", 100);

startActivity(intent);

这里调用了Intent 的putExtra()方法来添加要传递的数据,之后在SecondActivity 中就可以得到这些值了,代码如下所示: getIntent().getStringExtra("string_data");

getIntent().getIntExtra("int_data", 0);

但是不知道你有没有发现,putExtra()方法中所支持的数据类型是有限的,虽然常用的一些数据类型它都会支持,但是当你想去传递一些自定义对象的时候就会发现无从下手。不用担心,下面我们就学习一下使用Intent 来传递对象的技巧。

方式一:Serializable 方式

使用Intent 来传递对象通常有两种实现方式,Serializable 和Parcelable,我们先来学习一下第一种的实现方式。

Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。

比如说有一个Person 类,其中包含了name 和age 这两个字段,想要将它序列化就可以这样写:

public class Person implements Serializable{

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

其中get、set 方法都是用于赋值和读取字段数据的,最重要的部分是在第一行。这里让Person 类去实现了Serializable 接口,这样所有的Person 对象就都是可序列化的了。

接下来在FirstActivity 中的写法非常简单:

Person person = new Person();

person.setName("Tom");

person.setAge(20);

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

intent.putExtra("person_data", person);

startActivity(intent);

可以看到,这里我们创建了一个Person 的实例,然后就直接将它传入到putExtra()方法中了。由于Person 类实现了Serializable 接口,所以才可以这样写。

接下来在SecondActivity 中获取这个对象也很简单,写法如下: Person person = (Person) getIntent().getSerializableExtra("person_data");

这里调用了getSerializableExtra()方法来获取通过参数传递过来的序列化对象,接着再将它向下转型成Person 对象,这样我们就成功实现了使用Intent 来传递对象的功能了。

方式二:Parcelable

除了Serializable 之外,使用Parcelable 也可以实现相同的效果,不过不同于将对象进行序列化,Parcelable 方式的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent 所支持的数据类型,这样也就实现传递对象的功能了。

下面我们来看一下Parcelable 的实现方式,修改Person 中的代码,如下所示:

public class Person implements Parcelable {

private String name;

private int age;

@Override

public int describeContents() {

// TODO Auto-generated method stub

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

// TODO Auto-generated method stub

dest.writeString(name);

dest.writeInt(age);

}

public static final Parcelable.Creator CREATOR=new Parcelable.Creator() {

@Override

public Person createFromParcel(Parcel source) {

// TODO Auto-generated method stub

Person person=new Person();

person.name=source.readString();

person.age=source.readInt();

return person;

}

@Override

public Person[] newArray(int size) {

// TODO Auto-generated method stub

return new Person[size];

}

};

}

Parcelable 的实现方式要稍微复杂一些。可以看到,首先我们让Person 类去实现了Parcelable 接口,这样就必须重写describeContents()和writeToParcel()这两个方法。其中describeContents()方法直接返回0 就可以了,而writeToParcel()方法中我们需要调用Parcel的writeXxx()方法将Person 类中的字段一一写出。注意字符串型数据就调用writeString()方法,整型数据就调用writeInt()方法,以此类推。

除此之外,我们还必须在Person 类中提供一个名为CREATOR 的常量,这里创建了Parcelable.Creator 接口的一个实现,并将泛型指定为Person。接着需要重写createFromParcel()和newArray()这两个方法,在createFromParcel()方法中我们要去读取刚才写出的name 和age字段,并创建一个Person 对象进行返回,其中name 和age 都是调用Parcel 的readXxx()方法读取到的,注意这里读取的顺序一定要和刚才写出的顺序完全相同。而newArray()方法中的实现就简单多了,只需要new 出一个Person 数组,并使用方法中传入的size 作为数组大小就可以了。

接下来在FirstActivity 中我们仍然可以使用相同的代码来传递Person 对象,只不过在SecondActivity 中获取对象的时候需要稍加改动,如下所示: Person person = (Person) getIntent().getParcelableExtra("person_data");

注意这里不再是调用getSerializableExtra()方法,而是调用getParcelableExtra()方法来获取传递过来的对象了,其他的地方都完全相同。这样我们就把使用Intent 来传递对象的两种实现方式都学习完了,对比一下,Serializable的方式较为简单,但由于会把整个对象进行序列化,因此效率方面会比Parcelable 方式低一些,所以在通常情况下还是更加推荐使用Parcelable 的方式来实现Intent 传递对象的功能。

putextra 传递对象_intent.putextra用法 使用Intent传递对象的两种方式 - 电脑常识 - 服务器之家...相关推荐

  1. java json 对象如何对属性排序_Java对象集合、对象数组如何排序?你需要知道这两种方式...

    一.引子 在比较Java对象时,正常情况下,我们只能使用==或!=进行比较,而不能使用>或者<这样的运算符. 那么问题来了,开发过程中我们经常要对多个对象排序,排序必然需要比较,那么如何实 ...

  2. android数据回传多个页面_Android菜鸟起飞|使用Intent实现Activity跳转的两种方式(无回传数据和有回传数据)...

    使用Intent实现Activity跳转的两种方式 1. 使用startActivity(intnet)方法实现无回传数据的Activity跳转: 使用方法: 为实现跳转动作的控件绑定监听器,在点击事 ...

  3. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

  4. java提交数据到另一个页面_JS实现把一个页面层数据传递到另一个页面的两种方式...

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  5. 跨页数据传递的两种方式

    选择具有PostBackUrl属性的三个控件Button.LinkButton.ImageButton.PostBackUrl属性的值就是投递的页面URL. 要在接收页面按对象的方式接收投递页面的表单 ...

  6. ireport参数传递json_Json传递数据两种方式(json大全)

    1.Json传递数据两种方式(json大全) ----------------------------字符串 var list1 = ["number","name&qu ...

  7. fragment与activity之间的信息传递的两种方式

    因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. fragment与activity之间的信息传递的两种方式: 1.第一种方式,也是最常用的方 ...

  8. jvm两种方式获取对象所占用的内存

    在开发过程中,我们有时需要来获取某个对象的大小,以方便我们参考,来决定开发的技术方案.jvm中提供了两种方式来获取一个对象的大小. 通过Instrumentation来计算对象的大小 编写计算代码: ...

  9. Asp.net Web API 返回Json对象的两种方式

    这两种方式都是以HttpResponseMessage的形式返回, 方式一:以字符串的形式 var content = new StringContent("{\"FileName ...

最新文章

  1. 旧金山GDC2008见闻一
  2. 一起用C#做个五子棋的小游戏 增加了程序对战功能
  3. JS-copy到剪贴板
  4. vMware安装Ghost操作系统
  5. java communiframe_[Java教程]javascript iframe相关操作
  6. xuggler实现视频压缩_Xuggler视频处理简介
  7. LintCode 375. 克隆二叉树(深复制)
  8. 音视频编解码的一些源代码
  9. 志汇叮咚超级外卖小程序源码6.4.3
  10. 108_Power Pivot购物篮分析分组GENERATE之笛卡尔积、排列、组合
  11. pythongui做计算器_python GUI模拟实现计算器
  12. perl语言 入门(转)
  13. 交叉编译及交叉编译工具链的安装
  14. PHP实现微信小程序免密支付,微信免密支付,微信小程序实现微信支付功能!!!...
  15. server 2016备份还原
  16. python中inf_认识python中的inf和nan
  17. 批量ping多个IP地址
  18. AD软件自动安装部署
  19. 2022-2027年中国化纤行业市场调研及未来发展趋势预测报告
  20. 海思AI芯片(Hi35XX): 图像jpg转.bgr

热门文章

  1. cadence SPB17.4 - CIS数据库字段设计细节
  2. 工具类篇-03-BigDecimal金额转中文大写
  3. Linux | Ubuntu卸载QQ
  4. 计算机图学测试题及答,计算机图形学试卷
  5. 快速求素数表——埃氏筛法与欧拉筛法
  6. Proxy是什么意思?谁能解释一下
  7. 小学英语教学c语言,如何上好小学英语语音课 ——以修订版PEP四(上)Unit 5 Let’s spell为例...
  8. 聊天室 php ChatApi
  9. 达梦数据库守护集群安装
  10. MySQL安装以及客户端的使用