Android中各个Activity中数据的传递

本文详细介绍了在Android开发中如何通过Intent传递数据,包括基本类型、List<String>、List<Integer>、实现Serializable和Parcelable接口的对象,以及如何使用全局变量进行数据共享。提供了具体的操作步骤和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android开发中,有时候需要从一个Activity中传递数据到另外一个Activity中,通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte、byte[]、char、 char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、 float[]、double、double[]、String、String[],还有实现Serializable、Parcelable接口的类对 象。

这些方法可以查看:

http://developer.android.com/reference/android/content/Intent.html#putStringArrayListExtra(java.lang.String, java.util.ArrayList) http://developer.android.com/reference/android/content/Intent.html#putStringArrayListExtra(java.lang.String, java.util.ArrayList)

public Intent putStringArrayListExtra (String name, ArrayList<String> value)

Add extended data to the intent. The name must include a package prefix, for example the app com.android.contacts would use names like "com.android.contacts.ShowAll".

Parameters
name The name of the extra data, with package prefix.
value The ArrayList data value.
Returns
  • Returns the same Intent object, for chaining multiple calls into a single statement.

用于传递对象

 

传递对象的案例:

package com.example.one;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable{
	private String name;
	private int age;
	private String sex;
	private String address;
	
	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;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Person(String name, int age, String sex, String address) {
		super();
		this.name = name;
		this.age = age;
		this.sex=sex;
		this.address = address;
	}
	
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	@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(address);
		dest.writeString(sex);
		dest.writeInt(age);
	
	}
	
	public static final Parcelable.Creator<Person> CREATOR=new Creator<Person>() {
		@Override
		public Person[] newArray(int arg0) {
			// TODO Auto-generated method stub
			return new Person[arg0];
		}
		
		@Override
		public Person createFromParcel(Parcel arg0) {
			// TODO Auto-generated method stub
			//Person person=new Person("", 0, "", "");
			Person person=new Person();
			person.name=arg0.readString();
			person.address=arg0.readString();
			person.sex=arg0.readString();
			person.age=arg0.readInt();
			return person;
		}
	};
}


 

package com.example.one;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.os.Parcelable;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;

public class MainActivity extends Activity {

	private Button one111;
	private Button two222;
	
	private Button four111;
	private Button four222;
	
	ArrayList<Person> list=new 	ArrayList<Person>();
	Person person;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		one111=(Button) this.findViewById(R.id.five11);
		two222=(Button) this.findViewById(R.id.five22);
		list=new ArrayList<Person>();
		two222.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				list.add(new Person("刘明", 13, "男", "北京海淀"));
				/*for (int i = 0; i < 3; i++) {
					 person=new Person("王明",12, "男", "河南南阳");
					list.add(person);
				}*/
			}
		});
		one111.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent=new Intent(MainActivity.this,ainActivity.class);
				//Bundle bundle=new Bundle();	
				System.out.println(list.get(0).getAddress());
				intent.putParcelableArrayListExtra("perspn", list);
				startActivity(intent);
			
			
			}
		});
	}
}

 

 

package com.example.one;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;

public class ainActivity extends Activity {

	private TextView text123;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		text123=(TextView) this.findViewById(R.id.one11);
		ArrayList<Person> list=new ArrayList<Person>();
		list=getIntent().getParcelableArrayListExtra("perspn");
		StringBuffer sBuffer=new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			String name=list.get(i).getName();
			sBuffer.append(name);
			String address=list.get(i).getAddress();
			sBuffer.append(address);
			String sex=list.get(i).getSex();
			sBuffer.append(sex);
			int age=list.get(i).getAge();
			sBuffer.append(age);
		}
		text123.setText(sBuffer.toString());
	}
}



 

 

 

 

 

介绍了Intent是Activity与Activity之间,Activity与Service之间传递参数的介质,并有使用Intent和Bundle在组件之间传递数据的用法和例子,而这两种通常实现的是Java基本对象类型和String的传递。

在实际项目中,页面之间传值,除了以上几种,经常还有传递Object对象、List类型、List<Object>类型和全局变量等等的需求。本文就是介绍怎么传递这几种类型的参数。

一、传递List<String>和List<Integer>

以下以传递List<String>为例,发送List<String>语法为:

intent.putStringArrayListExtra(key, list);

接收List<String>的语法为:

list = (ArrayList<String>)getIntent().getStringArrayListExtra(key);

以下是一个运用实例:

// =============发送List<String>=============   
ArrayList<String> stringList = new ArrayList<String>();  
stringList.add("string1");  
stringList.add("string2");  
stringList.add("string3");  
Intent intent = new Intent();  
intent.setClass(ListDemoActivity.this, StringListActivity.class);  
intent.putStringArrayListExtra("ListString", stringList);  
startActivity(intent);  
// ====================接收List<String>======================   
ArrayList<String> stringList = (ArrayList<String>) getIntent().getStringArrayListExtra("ListString"); 
List<Integer>类似以上的操作调用下面的方法也可以实现发送和接收:

intent.putIntegerArrayListExtra(key, list);

list =(ArrayList<Integer>) getIntent().getIntegerArrayListExtra(key);

 

二、使用Serializable和Parcelable两种方式传递Object

Android的Intent之间传递对象有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key,Object)。方法中的Object要满足一定的条件,前者实现了Serializable接口,而后者实现了Parcelable接口。

以下是实现了Serializable接口的User类,命名为SerializableUser纯粹是从类名方便区分实现了Parcelable接口的User类,实际开发中不建议这么命名:

public class SerializableUser implements Serializable {  
    private String userName;  
    private String password;  
    public SerializableUser() {  
    }  
    public SerializableUser(String userName, String password) {  
        this.userName = userName;  
        this.password = password;  
    }  
    public String getUserName() {  
        return userName;  
    }  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
    public String getPassword() {  
        return password;  
    }  
    public void setPassword(String password) {  
        this.password = password;  
    }  

以下是实现了Parcelable接口的User类:

public class ParcelableUser implements Parcelable {  
    private String userName;  
    private String password;  
    public ParcelableUser() {  
    }  
    public ParcelableUser(String userName, String password) {  
        this.userName = userName;  
        this.password = password;  
    }  
    public String getUserName() {  
        return userName;  
    }  
    public void setUserName(String userName) {  
        this.userName = userName;  
    }  
    public String getPassword() {  
        return password;  
    }  
    public void setPassword(String password) {  
        this.password = password;  
    }  
    public static final Parcelable.Creator<ParcelableUser> CREATOR = new Creator<ParcelableUser>() {  
        @Override  
        public ParcelableUser createFromParcel(Parcel source) {  
            ParcelableUser parcelableUser = new ParcelableUser();  
            parcelableUser.userName = source.readString();  
            parcelableUser.password = source.readString();  
            return parcelableUser;  
        }  
        @Override  
        public ParcelableUser[] newArray(int size) {  
            return new ParcelableUser[size];  
        }  
    };  
    @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(password);  
    }  

使用两种方式传递的语法分别为:

bundle.putSerializable(key,object);

bundle.putParcelable(key,object);

使用两种方式接收的语法分别为:

object=(Object) getIntent().getSerializableExtra(key);

object=(Object) getIntent().getParcelableExtra(key);

// ==========分别使用Serializable和Parcelable发送Object===============   
SerializableUser serializableUser = new SerializableUser("user1", "123456");  
ParcelableUser parcelableUser = new ParcelableUser("user2","654321");  
Intent intent = new Intent();  
Bundle bundle = new Bundle();  
bundle.putSerializable("serializableUser", serializableUser);  
bundle.putParcelable("parcelableUser", parcelableUser);  
intent.setClass(ListDemoActivity.this,ObjectActivity.class);  
intent.putExtras(bundle);  
startActivity(intent);  
// ====================接收Object======================   
SerializableUser serializableUser = (SerializableUser) getIntent().getSerializableExtra("serializableUser");  
ParcelableUser parcelableUser = (ParcelableUser) getIntent().getParcelableExtra("parcelableUser"); 
可能有人注意到,实现Serializable接口就是把对象序列化,然后再传输,和Java的常用编程没什么明显区别,而且User不需要明显改变,比较简单。我也推荐用这种方式。

然而,后一种实现Parcelable接口的类比较复杂,Parcelable是个什么东西呢?

Android提供了一种新的类型:Parcel,被用作封装数据的容器,封装后的数据可以通过Intent或IPC传递。 除了基本类型以外,只有实现了Parcelable接口的类才能被放入Parcel中。

实现Parcelable接口需要实现三个方法:

 


1)writeToParcel 方法。该方法将类的数据写入外部提供的Parcel中。

声明:writeToParcel (Parcel dest, int flags)。

 


2)describeContents方法。直接返回0就可以。

 


3)静态的Parcelable.Creator<T>接口,本接口有两个方法:

 


createFromParcel(Parcel in) 实现从in中创建出类的实例的功能。

newArray(int size) 创建一个类型为T,长度为size的数组, returnnew T[size];即可。本方法是供外部类反序列化本类数组使用。

通过log测试输出可知程序的运行情况,在bundle.putParcelable(“parcelableUser”, parcelableUser);时,调用了ParcelableUser类中的publicvoid writeToParcel(Parcel dest, int flags)方法,并向dest写数据,在 ParcelableUserparcelableUser= (ParcelableUser)getIntent().getParcelableExtra(“parcelableUser”);的时候,调用了ParcelableUser类中的public ParcelableUsercreateFromParcel(Parcel source) 方法,创建了一个ParcelableUser对象,并给这个对象的属性赋值,这里的Parcel source和Parcel dest是相同的,然后返回这个ParcelableUser对象。最后就可以打印出parcelableUser的属性信息了。

 

三、传递List<Object>

如果我们要传递的是Object组成的List列表,即List<Object>,该怎么办呢?首先需要将Object对象实现Serializable接口,然后把list强制类型转换成Serializable类型,最后通过:

Intent.putExtra(key, (Serializable)objectList);

这样的语法来传递,接收方在接收的时候也需要强制类型转换成List<Object>,接收 List<Object>使用的语法是:

objectList= (List<Object>) getIntent().getSerializableExtra(key);

以下是一个应用实例,这里使用的SerializableUser类在上一步有给出,这里就不再重复给出。

// ==============发送List<Object>===========   
SerializableUser user1 = new SerializableUser("user1", "123456");  
SerializableUser user2 = new SerializableUser("user2", "654321");  
List<SerializableUser> objectList = new ArrayList<SerializableUser>();  
objectList.add(user1);  
objectList.add(user2);  
Intent intent = new Intent();  
intent.setClass(ListDemoActivity.this, ObjectListActivity.class);  
intent.putExtra("ListObject", (Serializable) objectList);  
startActivity(intent);  
// ====================接收List<Object>======================   
List<SerializableUser> objectList = (List<SerializableUser>) getIntent().getSerializableExtra("ListObject"); 
 

四、全局变量

如果一些特殊的应用级别的参数,不方便使用intent来传递参数,我们很容易想到是不是有全局变量或静态变量可以使用?Java中的静态变量在这里是适合的,但其值在Activity调用了System.exit(0)或finish()后就丢失了。

而在android中有个更优雅的方式是使用ApplicationContext。这种全局变量方法相对静态类更有保障,直到应用的所有Activity全部被destory掉之后才会被释放掉。

Android的SDK中有说道,Application是用来保存全局变量的,并且是在package创建的时候就存在了。所以当我们需要创建全局变量的时候,不需要再像J2SE那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的 getApplicationContext或者Activity的getApplication方法来获得一个Application对象,就可以设置或读取全局变量的值。

启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变。

用法:

1.        创建一个属于你自己的android.app.Application的子类,为想要共享的private全局变量增加setter和getter方法。

public class MyApp extends Application{  
    private String globalVariable;  
    public String getGlobalVariable() {  
        return globalVariable;  
    }  
    public void setGlobalVariable(String globalVariable) {  
        this.globalVariable = globalVariable;  
    }  
}  

2.        在manifest中申明一下这个类,这时Android就为此建立一个全局可用的实例。

其实就是在原来仅有的一个application标签上为application制定一个名字为这个全局实例。

<application android:name=".MyApp" android:icon="@drawable/icon" android:label="@string/app_name">

3.        可以在其他任何地方使用Context.getApplicationContext()方法获取这个实例,进而获取其中的状态(变量)。

// ============使用全局变量传递参数==============   
MyApp myApp = ((MyApp) getApplicationContext());//获得我们的应用程序MyApp   
myApp.setGlobalVariable("全局变量");  
Intent intent = new Intent();  
intent.setClass(ListDemoActivity.this, GlobalActivity.class);  
startActivity(intent);  
// ============接收全局变量的参数==============   
MyApp myApp = ((MyApp) getApplicationContext());  
String globalVariable = myApp.getGlobalVariable(); 
通过上述关于传递Object对象、List类型、List<Object>类型和全局变量等的介绍,希望能够给大家提供一些帮助。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值