發這篇博客主要講一下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