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

前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候可能会遇到需要传值的需要。Activity之间传值是通过Bundle来实现的。

一、通过Bundle传值介绍

Intent提供了多个重载方法来携带数据

putExtras(Bundle data):向Intent中放入需要的数据包

Bundle getExtras():取出Intent所携带的数据

putExtras(String name, Xxx value):向Intent中按照key-value形式传值

getXxxExtra(String name):从Intent中按key取值

从上面方法中可以看到Bundle就像一个数据包一样,Bundle中存取数据的方法如下:

pubXxx(String key, Xxx data):向Bundle中放入数据

pubSerializable(String key, Serializable data):向Bundle中放入一个可序列化的对象。

getXxx(Strign key):从Bundle中取出数据

getSerializable(String key, Serializable data):从Bundle中取出一个可序列化的对象。

Bundle对象是由系统需要时自动创建的,我们不需要管。

二、通过Bundle传值例子

MainActivity.java中的核心代码

Intent intent = new Intent();
intent.setAction("com.example.intent.action.TEST_ACTION");
				
intent.putExtra("test1", 1);
				
Bundle bundle = new Bundle();
bundle.putBoolean("test2", false);
bundle.putSerializable("test3", new Person("大碗干拌", 2));
intent.putExtras(bundle);
				
startActivity(intent);
Person.java类

package com.example.testintent;

import java.io.Serializable;

public class Person implements Serializable{
	private String name;
	private int age;
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "姓名:" + name +", " + "年龄:" + age;
	}
}
SecondActivity.java

public class SecondActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
		Intent intent = getIntent();
		Bundle bundle = intent.getExtras();
		
		System.out.println(bundle.getInt("test1"));
		System.out.println(bundle.getBoolean("test2"));
		System.out.println(intent.getSerializableExtra("test3"));
	}
}
运行结果

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

三、通过Bundle返回结果

前面已经提到过了,Activity还提供了一个startActivityForResult(Intent intent, int requestCode)方法来启动其他Activity。这样就需要如下两个条件:

1、当前Activity需要重写onActivityResult(int requestCode, int resultCode, Intent intent)方法来获取返回的数据。

2、被启动的Activty需要调用setResult方法设置处理结果。

四、通过Bundle返回处理结果例子

将上面的代码中startActivity改成startActivityForResult

Bundle bundle = new Bundle();
bundle.putBoolean("test2", false);
bundle.putSerializable("test3", new Person("大碗干拌", 2));
intent.putExtras(bundle);
				
startActivityForResult(intent, 0);
SecondActivity.java

package com.example.testintent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class SecondActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
	
		super.onCreate(savedInstanceState);
		Intent intent = getIntent();
		Bundle bundle = intent.getExtras();
		
		System.out.println(bundle.getInt("test1"));
		System.out.println(bundle.getBoolean("test2"));
		System.out.println(intent.getSerializableExtra("test3"));
		
		intent.putExtra("test4", "返回值");
		setResult(0, intent);
		finish();
	}
}
在MainActivity中重写onActivityResult方法

	@Override
	protected void onActivityResult(
			int requestCode, int resultCode, Intent intent) {
		if(requestCode == 0 && resultCode == 0){
			Bundle data = intent.getExtras();
			System.out.println(data.getString("test4"));
		}
	}
执行结果

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










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

上一篇:Android中关于ListView的使用(再上)ArrayAdapter


下一篇:TOJ 2018 SPF / 割点&&双联通分量