Intent 传数据
Intent作为android重要的组件其重要性不言而喻,这里说说他是怎么传递简单数据和对象
Intent的具体概念就不讲解了!网上有很多的
- 传递简单的数据(例如String,float等)
- 传递对象(利用Serializable接口)
- 传递对象(利用Parcelable接口)
传对象时候至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类。
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议你用Serializable
下面就通过一个简单的例子来进行传值:
MainActivity包含了三个按钮分别用来传递简单数据和对象和另外的对象。XML文件就是三个Button就不贴出来了
1 public class MainActivity extends Activity implements OnClickListener { 2 3 Button btn1 = null; 4 Button btn2 = null; 5 Button btn3 = null; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_main); 11 12 btn1 = (Button) findViewById(R.id.button1); 13 btn2 = (Button) findViewById(R.id.button2); 14 btn3 = (Button) findViewById(R.id.button3); 15 16 btn1.setOnClickListener(this); 17 btn2.setOnClickListener(this); 18 btn3.setOnClickListener(this); 19 } 20 21 @Override 22 public boolean onCreateOptionsMenu(Menu menu) { 23 getMenuInflater().inflate(R.menu.main, menu); 24 return true; 25 } 26 27 @Override 28 public void onClick(View v) { 29 switch (v.getId()) { 30 case R.id.button1: 31 Intent intent1 = new Intent(); 32 intent1.putExtra("name", "西瓜"); 33 intent1.putExtra("color", "红加绿"); 34 intent1.putExtra("price", 10); 35 intent1.setClass(MainActivity.this, MessageActivity.class); 36 startActivity(intent1); 37 break; 38 case R.id.button2: 39 Intent intent2 = new Intent(); 40 Bundle bundle = new Bundle(); 41 apple ap = new apple(); 42 ap.setColor("红色"); 43 ap.setName("苹果"); 44 ap.setPrice(15); 45 bundle.putSerializable("fruit", ap); 46 intent2.putExtras(bundle); 47 intent2.setClass(MainActivity.this, AppleActivity.class); 48 startActivity(intent2); 49 break; 50 case R.id.button3: 51 Intent intent3 = new Intent(); 52 Bundle bundle2 = new Bundle(); 53 orange or = new orange(); 54 or.setFruitColor("橘黄色"); 55 or.setName("橘子"); 56 or.setPrice(12); 57 bundle2.putParcelable("orange", or); 58 intent3.putExtras(bundle2); 59 intent3.setClass(MainActivity.this, OrangeActivity.class); 60 startActivity(intent3); 61 break; 62 default: 63 break; 64 65 } 66 67 } 68 69 }
每个Button转向的Activity
简单数据的Activity是MessageActivity,利用Serializable传对的Activity是AppleActivity ,利用Parcelable传对的Activity是OrangeActivity
他们XML文件当中都是有三个TextView 就不贴出来了
MessageActivity:
1 public class MessageActivity extends Activity { 2 3 TextView text1 = null; 4 TextView text2 = null; 5 TextView text3 = null; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_message); 11 12 text1 = (TextView) findViewById(R.id.Name); 13 text2 = (TextView) findViewById(R.id.Price); 14 text3 = (TextView) findViewById(R.id.Color); 15 16 Intent intent = getIntent(); 17 text1.setText(intent.getStringExtra("name")); 18 text2.setText(intent.getFloatExtra("price", 5)+""); 19 text3.setText(intent.getStringExtra("color")); 20 21 22 } 23 24 @Override 25 public boolean onCreateOptionsMenu(Menu menu) { 26 getMenuInflater().inflate(R.menu.message, menu); 27 return true; 28 } 29 30 }
AppleActivity:
1 public class AppleActivity extends Activity { 2 3 TextView text1 = null; 4 TextView text2 = null; 5 TextView text3 = null; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_apple); 11 text1 = (TextView) findViewById(R.id.appleName); 12 text2 = (TextView) findViewById(R.id.applePrice); 13 text3 = (TextView) findViewById(R.id.appleColor); 14 15 apple ap = (apple) getIntent().getSerializableExtra("fruit"); 16 text1.setText(ap.getName()); 17 text2.setText(ap.getPrice() + ""); 18 text3.setText(ap.getColor()); 19 } 20 21 @Override 22 public boolean onCreateOptionsMenu(Menu menu) { 23 getMenuInflater().inflate(R.menu.apple, menu); 24 return true; 25 } 26 27 }
OrangeActivity:
1 public class OrangeActivity extends Activity { 2 3 TextView text1 = null; 4 TextView text2 = null; 5 TextView text3 = null; 6 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.activity_orange); 11 12 text1 = (TextView) findViewById(R.id.orangeName); 13 text2 = (TextView) findViewById(R.id.orangePrice); 14 text3 = (TextView) findViewById(R.id.orangeColor); 15 16 orange or = (orange) getIntent().getParcelableExtra("orange"); 17 18 text1.setText(or.getName()); 19 text2.setText(or.getPrice() + ""); 20 text3.setText(or.getFruitColor()); 21 22 } 23 24 @Override 25 public boolean onCreateOptionsMenu(Menu menu) { 26 getMenuInflater().inflate(R.menu.orange, menu); 27 return true; 28 } 29 30 }
继承Serializable来创建实体类:
1 public class apple implements Serializable { 2 3 public apple() { 4 } 5 6 private String color; 7 private String name; 8 private float price; 9 10 /** 11 * @return the color 12 */ 13 public String getColor() { 14 return color; 15 } 16 17 /** 18 * @param color 19 * the color to set 20 */ 21 public void setColor(String color) { 22 this.color = color; 23 } 24 25 /** 26 * @return the name 27 */ 28 public String getName() { 29 return name; 30 } 31 32 /** 33 * @param name 34 * the name to set 35 */ 36 public void setName(String name) { 37 this.name = name; 38 } 39 40 /** 41 * @return the price 42 */ 43 public float getPrice() { 44 return price; 45 } 46 47 /** 48 * @param price 49 * the price to set 50 */ 51 public void setPrice(float price) { 52 this.price = price; 53 } 54 55 /* 56 * (non-Javadoc) 57 * 58 * @see java.lang.Object#toString() 59 */ 60 @Override 61 public String toString() { 62 return "apple [color=" + color + ", name=" + name + "]"; 63 } 64 65 /* 66 * (non-Javadoc) 67 * 68 * @see java.lang.Object#hashCode() 69 */ 70 @Override 71 public int hashCode() { 72 final int prime = 31; 73 int result = 1; 74 result = prime * result + ((color == null) ? 0 : color.hashCode()); 75 result = prime * result + ((name == null) ? 0 : name.hashCode()); 76 return result; 77 } 78 79 /* 80 * (non-Javadoc) 81 * 82 * @see java.lang.Object#equals(java.lang.Object) 83 */ 84 @Override 85 public boolean equals(Object obj) { 86 if (this == obj) 87 return true; 88 if (obj == null) 89 return false; 90 if (getClass() != obj.getClass()) 91 return false; 92 apple other = (apple) obj; 93 if (color == null) { 94 if (other.color != null) 95 return false; 96 } else if (!color.equals(other.color)) 97 return false; 98 if (name == null) { 99 if (other.name != null) 100 return false; 101 } else if (!name.equals(other.name)) 102 return false; 103 return true; 104 } 105 106 }
继承Parcelable来创建实体类: 在继承Parcelor创建实体类的时候一定要复杂一些,要注意CREATOR 一定要大写,写小写会报错
1 public class orange implements Parcelable { 2 3 private String fruitColor; 4 private String name; 5 private float price; 6 7 public orange() { 8 } 9 10 public orange(String fruitColor, String name, float price) { 11 this.fruitColor = fruitColor; 12 this.name = name; 13 this.price = price; 14 } 15 16 @Override 17 public int describeContents() { 18 return 0; 19 } 20 21 // 将实体的属性,也就是成员变量保存到parcel当中去 22 @Override 23 public void writeToParcel(Parcel parcel, int flags) { 24 parcel.writeString(fruitColor); 25 parcel.writeString(name); 26 parcel.writeFloat(price); 27 } 28 29 public static final Parcelable.Creator<orange> CREATOR = new Creator<orange>() { 30 31 @Override 32 public orange[] newArray(int size) { 33 return new orange[size]; 34 } 35 36 // 从parcel当中恢复实体 37 @Override 38 public orange createFromParcel(Parcel parcel) { 39 // 注意要和成员变量顺序一样 40 orange or = new orange(); 41 or.setFruitColor(parcel.readString()); 42 or.setName(parcel.readString()); 43 or.setPrice(parcel.readFloat()); 44 return or; 45 } 46 }; 47 48 /** 49 * @return the fruitColor 50 */ 51 public String getFruitColor() { 52 return fruitColor; 53 } 54 55 /** 56 * @param fruitColor 57 * the fruitColor to set 58 */ 59 public void setFruitColor(String fruitColor) { 60 this.fruitColor = fruitColor; 61 } 62 63 /** 64 * @return the name 65 */ 66 public String getName() { 67 return name; 68 } 69 70 /** 71 * @param name 72 * the name to set 73 */ 74 public void setName(String name) { 75 this.name = name; 76 } 77 78 /** 79 * @return the price 80 */ 81 public float getPrice() { 82 return price; 83 } 84 85 /** 86 * @param price 87 * the price to set 88 */ 89 public void setPrice(float price) { 90 this.price = price; 91 } 92 93 /* 94 * (non-Javadoc) 95 * 96 * @see java.lang.Object#toString() 97 */ 98 @Override 99 public String toString() { 100 return "orange [fruitColor=" + fruitColor + ", name=" + name + "]"; 101 } 102 103 /* 104 * (non-Javadoc) 105 * 106 * @see java.lang.Object#hashCode() 107 */ 108 @Override 109 public int hashCode() { 110 final int prime = 31; 111 int result = 1; 112 result = prime * result 113 + ((fruitColor == null) ? 0 : fruitColor.hashCode()); 114 result = prime * result + ((name == null) ? 0 : name.hashCode()); 115 return result; 116 } 117 118 /* 119 * (non-Javadoc) 120 * 121 * @see java.lang.Object#equals(java.lang.Object) 122 */ 123 @Override 124 public boolean equals(Object obj) { 125 if (this == obj) 126 return true; 127 if (obj == null) 128 return false; 129 if (getClass() != obj.getClass()) 130 return false; 131 orange other = (orange) obj; 132 if (fruitColor == null) { 133 if (other.fruitColor != null) 134 return false; 135 } else if (!fruitColor.equals(other.fruitColor)) 136 return false; 137 if (name == null) { 138 if (other.name != null) 139 return false; 140 } else if (!name.equals(other.name)) 141 return false; 142 return true; 143 } 144 145 }
运行后的效果: