android Parcelable 带有数组的对象如何序列化 String[] Long[] int[] Object[]


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];
		}
		
	};

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值