文档章节

Intent在Activity之间传值的几种方式

切切歆语
 切切歆语
发布于 2016/11/08 12:04
字数 1151
阅读 53
收藏 1

发这篇博客主要讲一下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/tree/intent

© 著作权归作者所有

共有 人打赏支持
切切歆语
粉丝 18
博文 319
码字总数 222816
作品 0
杭州
程序员
私信 提问
【Android基础】页面跳转与传值(Activity跳转与传值)

一个Android应用程序很少会只有一个Activity对象,如何在多个Activity之间进行跳转,而且能够互相传值是一个很基本的要求。 本次我们就讲一下,Android中页面跳转以及传值的几种方式! Acti...

晨曦之光
2012/03/01
5.9K
0
Android面经总结

Basic: 1. 基本的UI控件和布局文件 2. UI配套的Adapter的使用 3. Activity, Intent,Service,broadCast Receiver他们的生命周期管理熟悉一下 4. 操作手机上的数据库SQLite应用 Advanced_1(这是...

晨曦之光
2012/03/09
212
0
Android面经总结

Basic: 1. 基本的UI控件和布局文件 2. UI配套的Adapter的使用 3. Activity, Intent,Service,broadCast Receiver他们的生命周期管理熟悉一下 4. 操作手机上的数据库SQLite应用 Advanced_1(这是...

晨曦之光
2012/03/07
478
0
Android startActivity()和onActivityResult()使用总结

有三个Activity: A.java ,B.java ,C.java Activity之间的跳转常用方法: 1. startActivity(Intent intent); 该方法只用于启动新的Activity 2.startActivityForResult(Intent intent, int re......

mengyrlind
2014/09/10
0
0
Android的Notification研究

Android的Notification研究 最近在研究Android,遇到了一些Notification(通知)的问题: 1、Notification如何传递参数 2、Notification如何区别化 3、从Intent(意图)寻找Activity(活动)说起,...

天下杰论
2013/03/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

区块链安全 - 以太坊短地址攻击

1 基础知识 EVM虚拟机在解析合约的字节码时,依赖的是ABI的定义,从而去识别各个字段位于字节码的什么地方。关于ABI,可以阅读这个文档: https://github.com/ethereum/wiki/wiki/Ethereum-C...

HiBlock
18分钟前
0
0
自定义函数及内部函数

变量的作用域 局部变量 global $Global及其他超全局数组 静态变量 仅初始化赋值 保留于内存直到response才销毁 global和static变量的区别 global:局部变量全局话 static:定义静态局部变量 函...

关元
19分钟前
0
0

中国龙-扬科
31分钟前
1
0
python包

https://www.lfd.uci.edu/~gohlke/pythonlibs/

陆朋
41分钟前
1
0
一文弄懂“分布式锁”,一直以来你的选择依据正确吗?

本文主要会关注的问题是“分布式锁”的问题。 多线程情况下对共享资源的操作需要加锁,避免数据被写乱,在分布式系统中,这个问题也是存在的,此时就需要一个分布式锁服务。 常见的分布式锁实...

Java干货分享
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部