开发过程中,Activity之间传递数据是必不可少的,android中使用Intent和Bundle作为数据载体,在Activity之间传递,对于基础数据类型,Bundle已经提供相关的put,get方法,而作为自定义的类型则需要有特别的要求.

自定义类型,想要使用Bundle传递时,需要满足特定条件。即该类型需要实现Serializable接口或者Parcelable接口

(注意:如果目标对象中包含其他对象,则被包含的对象也需要实现Serializable接口或者Parcelable接口)

(关于Serializable接口和Parcelable接口就不在此做记录了)


步骤:

1.定义类,实现相关接口

2.使用Intent和Bundle对应的方法set数据

3.startActivity传递Intent对象


使用Serializable

一.传递对象

a).定义类,实现Serializable接口

public class Student implements Serializable
{
// members
private String name; private String age; private int id; // getter setter
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getAge()
{
return age;
}
public void setAge(String age)
{
this.age = age;
} /**
* Serializable
*/
private static final long serialVersionUID = 1L;
}

Student

b).使用Intent传递对象

// 使用Serializable
Button btnSerializable = (Button)findViewById(R.id.btnSerializable);
btnSerializable.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub // create data
Student student = new Student();
student.setName("stephen lee");
student.setAge("12");
student.setId(1); // bundle
Bundle bundle = new Bundle();
bundle.putSerializable(MainActivity.StudentKey,student); // intent
Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
intent.putExtras(bundle); // navigate
startActivity(intent);
}
});

使用Serializable

c).获取传递的数据

Bundle bundle = this.getIntent().getExtras();
Student student = (Student)bundle.getSerializable(MainActivity.StudentKey);
if(student!=null)
textView.setText("name:" + student.getName() + "age:" + student.getAge() + "id:" + student.getId());

SecondActivity

二.传递对象集合

a).同上

b).同上(注意使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口)

        Button btnSerializableList = (Button)findViewById(R.id.btnSerializableList);
btnSerializableList.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub // create data
List<Student> students = new ArrayList<Student>(); Student student1 = new Student();
student1.setName("hellenism");
student1.setAge("12");
student1.setId(1); Student student2 = new Student();
student2.setName("stephen lee");
student2.setAge("12");
student2.setId(2); students.add(student1);
students.add(student2); // bundle , 注意:使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口
Bundle bundle = new Bundle();
bundle.putSerializable(MainActivity.StudentsKey,(Serializable)students); // intent
Intent intent = new Intent(v.getContext(),SecondActivity.class);
intent.putExtras(bundle); // navigate
startActivity(intent);
}
});

使用Serializable

c).同上(不足之处在于,由于获取数据时候,需要把Serializable强转成为对应的List<>,此处会有警告)

Bundle bundle = this.getIntent().getExtras();
List<Student> students = (List<Student>)bundle.getSerializable(MainActivity.StudentsKey);
if(students!=null)
textView.setText("name:" + students.get(1).getName() + "age:" + students.get(1).getAge() + "id:" + students.get(1).getId());

SecondActivity

使用Parcelable


一.传递对象

a).定义类,实现Parcelable接口

public class Person implements Parcelable
{
// members
private String name;
private String age;
private int id; // getter setter
public int getId()
{
return id;
} public void setId(int id)
{
this.id = id;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public String getAge()
{
return age;
} public void setAge(String age)
{
this.age = age;
} // Parcelable
@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.writeString(age);
dest.writeInt(id);
} public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() {
public Person createFromParcel(Parcel source) {
Person person = new Person();
person.age = source.readString();
person.name = source.readString();
person.id = source.readInt();
return person;
} public Person[] newArray(int size) {
return new Person[size];
}
};
}

Parcelable接口

b).使用Intent传递参数

// 使用Parcelable
Button btnParcelable = (Button)findViewById(R.id.btnParcelable);
btnParcelable.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
// TODO Auto-generated method stub // create data
Person person = new Person();
person.setName("i am person");
person.setAge("12");
person.setId(1); // bundle
Bundle bundle = new Bundle();
bundle.putParcelable(MainActivity.PersonKey,person); // intent
Intent intent = new Intent(arg0.getContext(),SecondActivity.class);
intent.putExtras(bundle); // navigate
startActivity(intent);
}
});

使用Intent

c).获取传递的参数

Bundle bundle = this.getIntent().getExtras();
Person person = (Person)bundle.getParcelable(MainActivity.PersonKey);
if(person!=null)
textView.setText("name:" + person.getName() + "age:" + person.getAge() + "id:" + person.getId());

获取传递的参数

二.传递数据类型

a).同上

b).同上

        Button btnParcelableList = (Button)findViewById(R.id.btnParcelableList);
btnParcelableList.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
// TODO Auto-generated method stub // create data
List<Person> persons = new ArrayList<Person>(); Person person1 = new Person();
person1.setAge("12");
person1.setName("stephen lee");
person1.setId(1); Person person2 = new Person();
person2.setAge("12");
person2.setName("hellenism");
person2.setId(2); persons.add(person1);
persons.add(person2); // bundle
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(MainActivity.PersonsKey, (ArrayList<? extends Parcelable>) persons); // intent
Intent intent = new Intent(v.getContext(),SecondActivity.class);
intent.putExtras(bundle); // navigate
startActivity(intent);
}
});

使用Intent传递参数

c).同上

Bundle bundle = this.getIntent().getExtras();
List<Person> persons = bundle.getParcelableArrayList(MainActivity.PersonsKey);
if(persons!=null)
textView.setText("name:" + persons.get(1).getName() + "age:" + persons.get(1).getAge() + "id:" + persons.get(1).getId());

获取参数

注意:

使用以上方法传递对象时,都是创建了新的实例,而非传递对象的引用,如果是传递引用,也就无需序列化了。

完整例子:

http://pan.baidu.com/s/1dDf5p8d

[Android学习]Activity之间传递对象和对象集合的更多相关文章

  1. Android之Activity之间传递对象

    在非常多时候,我们须要在Activity之间传递对象,比方当你点击了某列表的item,须要传递给下一个Activity该对象,那我们须要该怎么做呢? Android支持两种传递对象的方式.一种是bun ...

  2. Android基础 -- Activity之间传递数据(bitmap和map对象)

    原文:http://blog.csdn.net/xueerfei008/article/details/23046341 做项目的时候需要用到在2个activity之间传递一些数据,之前做的都是些字符 ...

  3. 大叔也说Xamarin~Android篇~Activity之间传递数组

    回到目录 我们在开发应用程序时,不可能只使用一个Layout或者一个Activity,比如你个管理系统,要求用户先登陆然后再使用,这时你至少要有两个activity吧,先登陆一个,然后成功后需要跳到别 ...

  4. Android学习总结——Activity之间传递参数

    核心内容:一.在 Activity 之间传递简单数据二.在 Activity 之间传递复杂数据 三.在 Activity 之间传递自定义值对象   软件环境:Android Studio   一.在 ...

  5. Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]

    http://blog.csdn.net/cjjky/article/details/6441104 在Android中的不同Activity之间传递对象,我们可以考虑采用Bundle.putSeri ...

  6. Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口

    package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...

  7. Activity 之间 传递 List 封装的对象或者对象

    项目中遇到 从也个页面向还有一个页面跳转传递一个List 封装的对象 .按网上查的资料 须要把 对象 实现 Serializable接口. 写了一下.可是跳转直接崩溃.一直看错误之日找不到原因后来自习 ...

  8. Android 笔记-Fragment 与 Activity之间传递数据

    Fragment 与 Activity之间传递数据有两种方法.一种是使用setArgument,一种是使用接口回调.以下先学习第一种方法. (1)使用setArgument方法: 为了便于理解,我在这 ...

  9. 【Android 复习】 : Activity之间传递数据的几种方式

    在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...

随机推荐

  1. SAP 金税接口介绍

    一.金税发票与SAP系统发票的税额差异分析 1.1 金税系统中的税额说明 国内企业销售产品给国内客户时,正常产品须要缴纳17%的增值税,而金税(Golden Tax)系统就是用来出具纸面的增值税发票的 ...

  2. SQL 教程

    SQL 教程 http://www.w3school.com.cn/sql/

  3. jquery 中获取URL参数的方法

    今天写项目需要获取url后面的参数ref参数来判断是否开启计时器来刷新页面,之前一直都是用JS写的,今天在查资料的时候看到了一款JQ的插件 项目地址:https://github.com/allmar ...

  4. Ajax Post提交事例及SpringMVC注解@RequestMapping取不到参数值解决办法

    var xmlHttp; //定义变量,用来创建xmlHttp对象 function ajaxfunction(url,onreadystatechangMethod,param){ // 创建xml ...

  5. Android UI 之WaterFall瀑布流效果

        所谓瀑布流效果,简单说就是宽度相同但是高度不同的一大堆图片,分成几列,然后像水流一样向下排列,并随着用户的上下滑动自动加载更多的图片内容.     语言描述比较抽象,具体效果看下面的截图:   ...

  6. __sleep和__wakeup

    魔术方法__sleep和__wakeup 串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. ...

  7. 关于innodb purge thread和master thread

    由innodb_purge_threads控制purge线程数. (>= 5.6.5)的版本号中该值默觉得1.最大值为32.默认值1表示innodb的purge操作被分离到purge线程中,ma ...

  8. Swift初体验 (一)

    // 声明一个常量 let maxNumberOfStudents: Int = 47 // 声明一个变量,假设没有在声明的时候初始化,须要显示的标注其类型 var currentNumberOfSt ...

  9. U盘只剩下快捷方式

    原理: 其实,这个是一种叫1KB病毒(也称之为快捷方式病毒.风暴一号)惹的祸,它是一种恶意的蠕虫病毒,执行以下恶意操作:1.当你的U盘放到一个已经被感染 的主机上时,主机(我的电脑)上的病毒体进程首先 ...

  10. QT中的pro文件的编写

    原地址:http://blog.csdn.net/fjb2080/article/details/4833666 我们在编译QT的工程的时候,一般都会让qmake自动生成,但有时我们需要定制我们的工程 ...