首页 > 代码库 > Android学习之路——Android四大组件之activity(二)

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递

activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据。还有一种数据类型是parcelable和serialable

用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下。

一、利用bundle传递基本数据类型

1、启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(intent)就可以将数据到底到目标activity中去

AActivity中传递数据:

Intent intent = new Intent(AActivity.this, BActivity.class);
intent.putExtra("name", "android");
intent.putExtra("age", 20);
intent.putExtra("isStudent", true);
startActivity(intent);
BActivity中接收数据: 目标activity中通过getIntent()方法获取Intent 对象,然后就可以通过getString getInt getBoolean等方法获取到传递过来的基本数据类型的数据

String name = getIntent().getStringExtra("name");
int age = getIntent().getIntExtra("age", 0);
Boolean isStudent = getIntent().getBooleanExtra("isStudent", false);

运行结果:




2、关闭时返回数据

AActivity中启动activity

Intent intent = new Intent(AActivity.this, BActivity.class);
startActivityForResult(intent, 1);
BActivity中关闭activity并返回数据到AActivity

B中要做的工作有将要返回的数据放入intent中,然后设置返回结果码setResult(resultCode)一般结果码都是Activity.RESULT_OK,然后调用finish方法,关闭activity,返回到之前的activity

Intent intent = new Intent();
intent.putExtra("name", "这是bactivity关闭传递的数据");
setResult(Activity.RESULT_OK,intent);
finish();

接下来要在启动前的activity中接收返回的数据,重写ActivityResult方法即可,第三个参数就是带数据的intent

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == Activity.RESULT_OK) {
			switch (requestCode) {
			case 100:
				resultTxt.setText(data.getStringExtra("result"));
				break;
			default:
				break;
			}
		}
		
	}

二、利用parcelabel和serializable传递复杂数据类型

1、parcelable传递数据

如果要传递自定义的数据类型,那么将自定义数据类型实现parcelbale接口即可。传递方法如下:

Person p = new Person("赵六", 24);
intent.putExtra("p", p); // 把Person当作Parcelable传递
		
startActivity(intent);		

在BActivity中取出数据:

Person p = intent.getParcelableExtra("p");
otherTV.setText(p.toString());


2、serializable传递数据

如果要传递自定义的数据类型,那么将自定义数据类型实现serializable接口即可。传递方法如下:在要传递的对象类中实现两个方法describeContents writeToParcel

@Override
	public int describeContents() {
		return 0;
	}

	@Override
	public void writeToParcel(Parcel dest, int flags) {		// 怎么把Person写到Parcel
		dest.writeString(name);								// 把成员变量写进去
		dest.writeInt(age);
	}
	
	public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
		public Person createFromParcel(Parcel source) {					// 怎么从Parcel还原Person
			return new Person(source.readString(), source.readInt());	// 从Parcel中读取数据, 创建Person
		}
		public Person[] newArray(int size) {	// 怎么获取数组
			return new Person[size];
		}
	};
	
	// 绑定服务的时候, 传递参数时, 只能用Parcelable