android Parcelable 带有数组的对象如何序列化 String[] Long[] int[] Object[]
这个是Activity:
package com.example.demo_app.paracble;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
public class ParacbleActivity extends Activity{
FrameLayout mFrame ;
Button mButton ;
public static final String RECEIVER_PARCABLE = "android.paracble" ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mFrame = new FrameLayout(this);
setContentView(mFrame);
mButton = new Button(this);
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT);
mButton.setLayoutParams(lp);
mButton.setText("send");
mFrame.addView(mButton);
IntentFilter filter = new IntentFilter();
filter.addAction(RECEIVER_PARCABLE);
registerReceiver(mReceiver, filter);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(RECEIVER_PARCABLE);
Person p = new Person();
p.name = "wenxiang" ;
p.age = 40 ;
p.garde = 33 ;
Son son = new Son();
son.name = "myson" ;
p.son = son ;
String[] msg = new String[]{"msg1","msg2"};
p.msg = msg ;
intent.putExtra("value", p);
sendBroadcast(intent);
}
});
}
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver);
};
BroadcastReceiver mReceiver = new BroadcastReceiver(){
public void onReceive(Context context, Intent intent) {
String action = intent.getAction() ;
if(action.equals(RECEIVER_PARCABLE)){
Person p = (Person)intent.getParcelableExtra("value");
Log.d("Tag", "receiver person : "+p+" name : "+p.name+" , age : "+p.age+" , grade : "+p.garde+" , son "+p.son+" , msg : "+p.msg);
}
};
};
}
这个带有数组对象的Parcelable对象
package com.example.demo_app.paracble;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
public class Person implements Parcelable{
public String name ;
public int age ;
public String[] msg ;
public int garde ;
public Son son ;
@Override
public int describeContents() {
Log.v("Tag", " describeContents ");
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
Log.v("Tag", this+" ------> writeToParcel "+flags);
//这里是把对象的字段一个一个写到流里面,写的顺序要和下面读的顺序一摸一样
dest.writeInt(age);
dest.writeString(name);
//这几句话是写数组的,因为数组的长度不确定,所以先确定数组长度,如果为空就不写,但是要把0 给发过去
//让下面的好判断能不能读数组,也就是说下面如果读到的长度是0,那么就不读数组了,否则就创建相同长度的数组去读
if(msg==null){
dest.writeInt(0);
}else{
dest.writeInt(msg.length);
}
//如果数组为空,就可以不写
if(msg!=null){
dest.writeStringArray(msg);
}
dest.writeInt(garde);
dest.writeParcelable(son, flags);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
@Override
public Person[] newArray(int size) {
Log.w("Tag", " person new Array : "+size);
return new Person[size];
}
@Override
public Person createFromParcel(Parcel source) {
//开始读对象的流顺序要和上面写的一样
Log.w("Tag", " createFromParcel ");
int age = source.readInt();
String name = source.readString() ;
//开始读数组的长度
int length = source.readInt() ;
Log.v("Tag", " length : "+length);
String[] msg = null ;
//如果数组长度大于0,那么就读数组, 所有数组的操作都可以这样。
if(length>0){
msg = new String[length];
source.readStringArray(msg);
}
int grade = source.readInt() ;
Son son = source.readParcelable(Son.class.getClassLoader());
Log.i("Tag", " son : "+son);
Person p = new Person();
p.age = age ;
p.name = name ;
p.msg = msg ;
p.garde = grade ;
p.son = son ;
Log.d("Tag", p + " -- > name : "+p.name +" , age : "+p.age+" , garde : "+p.garde+" , son : "+p.son+" , msg : "+p.msg+" length : "+length);
return p ;
}
};
}
这个是普通的Parcelable对象
package com.example.demo_app.paracble;
import android.os.Parcel;
import android.os.Parcelable;
public class Son implements Parcelable{
public String name ;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
public static final Creator<Son> CREATOR = new Creator<Son>() {
@Override
public Son createFromParcel(Parcel source) {
Son s = new Son();
s.name = source.readString();
return s;
}
@Override
public Son[] newArray(int size) {
return new Son[size];
}
};
}