標籤:android intent
Activity之間通過Intent傳遞值,支援基礎資料型別 (Elementary Data Type)和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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnSend = (Button)findViewById(R.id.send);btnSend.setOnClickListener(this);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic 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;@Overrideprotected 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()); }@Overridepublic 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)
[Android]Parcelable encountered IOException writing serializable object (name = xxx)