Activity之間通過Intent傳遞值,支持基本數據類型和String對象及它們的數組對象byte、byte[]、char、char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、float[]、double、double[]、String、String[],還有實現Serializable、Parcelable接口的類對象。
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend = (Button)findViewById(R.id.send); btnSend.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { if(v.getId() == R.id.send){ Intent intent = new Intent(this, HomeActivity.class); Bundle bundle = new Bundle(); bundle.putString("Data", "hello......."); User user = new User(); user.setAge(11); user.setName("xiaosi"); bundle.putSerializable("User", user); intent.putExtras(bundle); startActivity(intent); } } }
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.widget.TextView; public class HomeActivity extends Activity { private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); String str=bundle.getString("Data"); User user = (User) bundle.getSerializable("User"); text=(TextView)findViewById(R.id.text); text.setText(str+"姓名:"+user.getName()+"年齡:"+user.getAge()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.home, menu); return true; } }
所以說activity之間傳遞自己定義數據,僅僅能實現implements Serializable或者Parcelable接口。
能夠用bundle putSerializable(String,Serizlizable)數據或者直接用intent putExtrr(String,Serizlizable)數據。我有一個需求須要傳遞多個自己定義類型數據,於是我寫了一個對象把我須要的那些自己定義數據封裝了起來,這個類實現了Serizlizable接口。可是在putExtra的時候出現了錯誤。
后來我發現要想在Activity之間傳遞數據必須全部的內容都實現serializable接口才行,而我的對象中封裝的一個自己定義類型數據沒有實現這個接口,所以出現了錯誤。
之后我讓那個自己定義類型實現了serializable接口就沒有問題了。
我自己定義了一個TransmitData對象,實現了serializable接口。
package com.sjf.model; import java.io.Serializable; import java.util.Date; /** * 傳輸的對象,直接通過Socket傳輸的最大對象 * @author XIAOSI * */ public class TransmitData implements Serializable{ /** * */ private static final long serialVersionUID = 1L; //發送的消息類型 private TransmitType type; // 來自哪個用戶 private String fromUser; // 發往哪個用戶 private String toUser; // 傳輸的內容 private User user; // 請求結果 private boolean isSucess; // 請求說明,反饋說明 private String description; // 請求或者反饋時間 private Date time; public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public boolean isSucess() { return isSucess; } public void setSucess(boolean isSucess) { this.isSucess = isSucess; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public TransmitType getType() { return type; } public void setType(TransmitType type) { this.type = type; } public String getFromUser() { return fromUser; } public void setFromUser(String fromUser) { this.fromUser = fromUser; } public String getToUser() { return toUser; } public void setToUser(String toUser) { this.toUser = toUser; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
然而TransmitData對象中自己定義數據類型User並沒有實現序列化接口。
就報錯出:Parcelable encountered IOException writing serializable object (name = xxx)