美文网首页
用意图传递对象序列化-- 实现Parcelable接口

用意图传递对象序列化-- 实现Parcelable接口

作者: 墨白1629 | 来源:发表于2018-05-23 18:39 被阅读20次

    我们都知道Intent是传递信息的介质,我们用他用的最多的就是从一个Activity转换到另一个Activity,并且顺带传递一些数据到下一个Activity中。但是如果我们传递过去的是一个包含很多信息的对象呢?这里就需要使用到Parcelable和Serializable这两个接口。 使用这两个接口的原因很简单,就是为了序列化对象!对象序列化有以下好处: 1.永久性保存对象,保存对象的字节序列到本地文件中 2.用过序列化对象在网络中传递对象 3.通过序列化对象在进程间传递对象 然后就是使用Parcelable接口的性能比Serializable的性能更好,而且Serizlizanble在对象序列化时会产生大量的临时变量,容易GC。推荐使用Parcelable接口。

    先是一个实例类,实现Parcelable接口,重写两个方法。然后就是添加一个常量CREATOR,并且实现内部接口Pracelable.Creator,实现里面的两个方法:

    public class Person implements Parcelable {

       public int age;// 年龄

       public String name;// 姓名

       @Override

       public String toString() {

          return "Person [age=" + age + ", name=" + name + "]";

       }

       public static final Parcelable.CreatorCREATOR = new Parcelable.Creator() {

          // 返回对象数组大小

          @Override public Person[] newArray(int size) {

             // TODO Auto-generated method stub

             return new Person[size];

           }

          // 读取信息

          @Override

          public Person createFromParcel(Parcel source) {

             // TODO Auto-generated method stub

             Person person = new Person();

             person.age = source.readInt();

             person.name = source.readString();

             return person;

          }

       };

       @Override

       public int describeContents() {

       // TODO Auto-generated method stub

       return 0;

       }

       // 写入信息

       @Override

       public void writeToParcel(Parcel dest, int flags) {

          // TODO Auto-generated method stub

          dest.writeInt(age);

          dest.writeString(name);

        }

    }

    然后就是MainActivity的代码了(这里注解的代码也是可以实现的,不需要bundle就直接传入Intent就可以传递对象。因为有这个方法Intent.putExtra(String name,Parcelable value)在,所以不用bundle也可以):

    button1.setOnClickListener(new OnClickListener() {

       @Override public void onClick(View v) {

          // TODO Auto-generated method stub

          Intent intent = new Intent(MainActivity.this, SecondActivity.class);

          // 携带对象参数

          Person person = new Person();

          person.age = 21;

          person.name = "sdf";

          Bundle bundle = new Bundle();

          bundle.putParcelable("person", person);

          // intent.putExtra("msg", person);

          intent.putExtras(bundle); startActivity(intent);

       }

    });

    然后就是跳转接收的Activity的代码,都很简单,一看就懂 :

    public class SecondActivity extends Activity {

       private TextView textView;

       @Override protected void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_second);

          textView = (TextView) findViewById(R.id.textview);

          Person person=new Person();

          Intent intent=getIntent();

          person=intent.getParcelableExtra("person");

          textView.setText(person.toString());

      }

    }

    相关文章

      网友评论

          本文标题:用意图传递对象序列化-- 实现Parcelable接口

          本文链接:https://www.haomeiwen.com/subject/lmprjftx.html