发这篇博客主要讲一下Android中Intent中如何传值的几种方法:

1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本
2:八种数据类新对应数组和CharSequece文本数组

3:Bundle传值

4:ArrayList集合 

5:Serializable传递对象

6:Parcelable传递对象

在 main.xml 布局文件中添加六个Button控件,分别是六种传值方式。

Activity代码如下:

 package com.example.transmittingdata;

 import java.util.ArrayList;

 import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener; /***
*
* Intent传值包含
* 1:基本数据类型,包含了Java八种基本数据类型和CharSequece文本
* 2:八种数据类新对应数组和CharSequece文本数组
* 3:Bundle
* 4:ArrayList集合 5:Serializable传递对象
* 6:Parcelable传递对象
*
* @author zq
*
*/
public class MainActivity extends Activity implements OnClickListener { private String[] str = new String[] { "八种数据类新对应数组和CharSequece文本数组", "123" };
private ArrayList<String> list; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
} private void initView() {
// TODO Auto-generated method stub
findViewById(R.id.button1).setOnClickListener(this);
findViewById(R.id.button2).setOnClickListener(this);
findViewById(R.id.button3).setOnClickListener(this);
findViewById(R.id.button4).setOnClickListener(this);
findViewById(R.id.button5).setOnClickListener(this);
findViewById(R.id.button6).setOnClickListener(this);
list = new ArrayList<String>();
list.add("List集合");
list.add("Value"); } @Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(MainActivity.this, IntentData.class);
switch (v.getId()) {
case R.id.button1:
intent.putExtra("i", 1);
intent.putExtra("key", "基本数据类型,包含了Java八种基本数据类型和CharSequece文本");
break;
case R.id.button2:
intent.putExtra("i", 2);
intent.putExtra("key", str);
break;
case R.id.button3:
Bundle bundle = new Bundle();
bundle.putString("key", "Bundle传值");
intent.putExtra("i", 3);
intent.putExtra("bundle", bundle);
break;
case R.id.button4:
intent.putExtra("i", 4);
intent.putStringArrayListExtra("key", list);
break;
case R.id.button5:
UserInfo user = new UserInfo();
user.setSex("男");
user.setUserName("白子画");
intent.putExtra("i", 5);
intent.putExtra("key", user);
break; case R.id.button6:
intent.putExtra("i", 6);
UserBean userBean = new UserBean();
userBean.setSex("女");
userBean.setUserName("花千骨");
intent.putExtra("key", userBean);
break; default:
break;
}
startActivity(intent);
} }

接收值的Activity类:

 public class IntentData extends Activity {

     private TextView text1, text2;
private int position = 1;
private String data = ""; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.data);
initView();
initData(); } @SuppressLint("NewApi")
private void initData() {
// TODO Auto-generated method stub
if (getIntent() != null) {
position = getIntent().getIntExtra("i", 1);
if (position == 1) {
data = getIntent().getStringExtra("key");
text1.setText("基本数据类型");
text2.setText(data);
return;
}
if (position == 2) {
String[] data1 = getIntent().getStringArrayExtra("key");
text1.setText("数组");
text2.setText(data1[0] + "----" + data1[1]);
return;
}
if (position == 3) {
Bundle bundle = getIntent().getBundleExtra("bundle");
text1.setText("Bundle");
text2.setText(bundle.getString("key", "默认为空是的值"));
return;
}
if (position == 4) {
ArrayList<String> array;
text1.setText("List<object> 集合");
array = getIntent().getStringArrayListExtra("key");
text2.setText(array.get(0));
return;
}
if (position == 5) {
UserInfo user;
text1.setText("Serializable传递对象");
user = (UserInfo) getIntent().getSerializableExtra("key");
text2.setText(user.getUserName() + "---" + user.getSex());
return;
}
if (position == 6) {
UserBean userBean;
text1.setText("Parcelable传递对象");
userBean = (UserBean) getIntent().getParcelableExtra("key");
text2.setText(userBean.getUserName() + "---"
+ userBean.getSex());
return;
} }
} private void initView() {
// TODO Auto-generated method stub
text1 = (TextView) findViewById(R.id.textView1);
text2 = (TextView) findViewById(R.id.textView2); } }

Serializable传递对象

Serializable:是序列化的意思,表示将一个对象转换成可储存或可传输的状态,对象进行Serializable序列化之后就可以通过Intent来进行Activity之间的传输了。

 public class UserInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String sex;
private String userName; public UserInfo() {
// TODO Auto-generated constructor stub
} public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
} }

这里面的serialVersionUID需要注意一下,它的作用是序列化和反序列化时保持版本的兼容性,如果你未指定,运行时也会默认生成,在进行反序列化时只有数据和当前类的serialVersionUID相同是才能够正常的反序列化,你不指定serialVersionUID一般情况下也不会出问题,但是如果当前类发生了改变例如删掉了某个成员变量那么当前类的serialVersionUID也会出现改变,之后你对数据进行反序列化就会出现错误,这里我指定为1L,L为Long数据类型。

Parcelable传递对象

Parcelable的序列化原理是将一个对象进行分解,而分解后的每一部分都是Intent所支持的数据类型,因此实现了传递对象的功能。

 public class UserBean implements Parcelable {

     private String sex;
private String userName; public UserBean() {
// TODO Auto-generated constructor stub
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} @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(userName);
dest.writeString(sex);
} protected UserBean(Parcel in) {
userName = in.readString();
sex = in.readString();
} public static final Creator<UserBean> CREATOR = new Creator<UserBean>() { @Override
public UserBean createFromParcel(Parcel in) {
return new UserBean(in);
} @Override
public UserBean[] newArray(int size) {
return new UserBean[size];
} };

可以看到通过Parcelable的实现方式是要复杂很多的,实现Parcelable接口后,需要重写writeToParcel和describeContents方法,describeContents方法直接返回0就可以了,writeToParcel方法我们需要调用Parcel对象进行数据写入,例如dest.writeString(name),注意如果name是字符串类型就调用writeString,如果是Int类型就调用writeInt 等等。

源码下载:  https://github.com/DickyQie/android-data-type/

Intent在Activity之间传值的几种方式的更多相关文章

  1. ASP.NET 页面之间传值的几种方式

    开篇概述 对于任何一个初学者来说,页面之间传值可谓是必经之路,却又是他们的难点.其实,对大部分高手来说,未必不是难点. 回想2016年面试的将近300人中,有实习生,有应届毕业生,有1-3年经验的,有 ...

  2. 【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  3. 安卓--使用Intent实现Activity之间传值与跳转

    http://blog.csdn.net/cjjky/article/details/6337447 在一个Android的应用程序中,很少只存在一个Activity,一般都有多个Activity,如 ...

  4. 使用Intent实现Activity之间传值与跳转(转)

    转:http://blog.csdn.net/cjjky/article/details/6337447 在一个Android的应用程序中,很少只存在一个Activity,一般都有多个Activity ...

  5. Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...

  6. ASP.NET页面之间传值的几种方式

    1.  QueryString 当页面上的form以get方式向页面发送请求数据时,web server将请求数据放入一名为QEURY_STRING的环境变量中,QeueryString方法从这个变量 ...

  7. java前后台之间传值的几种方式

    自己写的代码太少,有时候前后台传值还写的不是很熟练,现在总结一下,加深下印象. 1.jquery的Ajax传值 ---->前台到后台 期望功能:把前台用户输入的信息保存在数据库里. 前台jsp代 ...

  8. android fragment传递参数_fragment之间传值的两种方法

    在Activity中加载Fragment的时候.有时候要使用多个Fragment切换.并传值到另外一个Fragment.也就是说两个Fragment之间进行参数的传递.查了很多资料.找到两种方法.一种 ...

  9. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

随机推荐

  1. linux常用命令:df 命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  2. jQuery 遍历 - eq() 方法 查找当前元素

    jQuery 遍历 - eq() 方法 if(data[i].status !='已送达'){ $('.w-beget').eq(i).attr('disabled','disabled'); }

  3. linux 中的定时任务crontab使用方法

    linux 中的定时任务crontab使用方法: 切换到root用户,sudo su root (可以设置成不需要输入密码) sudo su - (需要输入当前帐号的密码才能进入.) crontab ...

  4. Maximum execution time of 30 seconds exceeded解决错误方法

    Maximum execution time of 30 seconds exceeded解决错误方法Fatal error: Maximum execution time of 30 seconds ...

  5. C/C++之extern "C"的用法解析

    extern "C"的用法解析 http://blog.sina.com.cn/u/494a1ebc010004g5 C++中extern “C”含义深层探索 1.引言 C++语言 ...

  6. 在Linux 中进入单用户模式的技巧

    在这篇简短的文章中,我们将向你介绍在 SUSE 12 Linux 中进入单用户模式的步骤.在排除系统主要问题时,单用户模式始终是首选.单用户模式禁用网络并且没有其他用户登录,你可以排除许多多用户系统的 ...

  7. Django 搭建后台 favicon.ico 文件操作

    Django 搭建后台 favicon.ico 文件操作 使用 django 搭建后台服务器,我用的是 django 1.8 版本以上的,就是路由不是 url 而是 path 的,这里有一个关于fav ...

  8. CodeForces 76A Gift - 最小生成树

    The kingdom of Olympia consists of N cities and M bidirectional roads. Each road connects exactly tw ...

  9. C语言预处理器命令详解【转】

    本文转载自:http://www.cnblogs.com/clover-toeic/p/3851102.html 一  前言 预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所 ...

  10. Nlog、elasticsearch、Kibana以及logstash在项目中的应用(一)

    前言 最近在做文档管理中,需要记录每个管理员以及用户在使用过程中的所有操作记录,本来是通过EF直接将操作数据记录在数据库中,在查询的时候直接从数据库中读取,但是这样太蠢了,于是在网上找到了logsta ...