Intent在Activity之間傳值的幾種方式

發這篇博客主要講一下Android中Intent中如何傳值的幾種方法:java

1:基本數據類型,包含了Java八種基本數據類型和CharSequece文本
2:八種數據類新對應數組和CharSequece文本數組android

3:Bundle傳值git

4:ArrayList集合 github

5:Serializable傳遞對象數組

6:Parcelable傳遞對象app

在 main.xml 佈局文件中添加六個Button控件,分別是六種傳值方式。ide

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類:this

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傳遞對象spa

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

相關文章
相關標籤/搜索