Android :安卓学习笔记之 通过Intent传递类对象(实现Serializable和Parcelable接口)

Posted JMW1407

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android :安卓学习笔记之 通过Intent传递类对象(实现Serializable和Parcelable接口)相关的知识,希望对你有一定的参考价值。

Intent传递类对象

1、实现Serializable接口传递对象

Serializable 是序列化的意思,表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。至于序列化的方法也很简单,只需要让一个类去实现Serializable 这个接口就可以了。

比如说有一个Person 类,其中包含了name 和age 、id、sex这四个字段,想要将它序列化就可以这样写:

package com.example.daydemo.bean;

import java.io.Serializable;
//必须实现Serializable接口,此对象才有传递的资格
public class Person implements Serializable {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

第一个界面MainActivity代码如下:

package com.example.daydemo;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.daydemo.bean.Person;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn=findViewById(R.id.btn);

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,MainActivity2.class);
        Person person = new Person();
        person.setName("Android");
        person.setAge(30);
        intent.putExtra("person",person);
        startActivity(intent);
    }
}

第二个界面MainActivity2,接收MainActivity传递过来的对象,代码如下:

public class MainActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        //接收MainActivity传过来的对象
        Intent intent = getIntent();
        Person person = (Person) intent.getSerializableExtra("person");
        Toast.makeText(this, "姓名:"+person.getName()
                +" 年龄:"+person.getAge()
                , Toast.LENGTH_SHORT).show();
    }
}

2、通过实现Parcelable接口传递对象

第一步依然是创建一个对象:

package com.example.daydemo.bean;

import android.os.Parcel;
import android.os.Parcelable;
//此对象实现Parcelable接口,就具备传递的资格
public class Student implements Parcelable {
    //自定义成员变量
    private String name;
    private int age;

    public Student() {
    }
    //TODO 注意:读取,和写入的顺序,必须一致,否则会报错
    //从Parcel对象中读取出来,赋值给name,age
    public Student(Parcel in) {
        name = in.readString();
        age = in.readInt();
    }

    //把属性写入到Parcel对象里面去
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }

    //系统扩展用的,忽略
    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<Student> CREATOR = new Creator<Student>() {
        //创建Student对象,并且把Parcel构建好,传递给我们的Student(成员数据就可以从Parcel对象获取了)
        @Override
        public Student createFromParcel(Parcel in) {
            return new Student(in);
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

接下来的步骤跟方式一是一样的

FirstActivity代码如下:

public class FirstActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        btn=findViewById(R.id.btn);

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this,SecondActivity.class);
        Student student = new Student();
        student.setName("程序员");
        student.setAge(18);
        intent.putExtra("student",student);
        startActivity(intent);
    }
}


第二个页面SeconActivity代码如下:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        Student student = intent.getParcelableExtra("student");
        Toast.makeText(this, "姓名:"+student.getName()
                +" 年龄:"+student.getAge(), Toast.LENGTH_SHORT).show();
    }
}


效果跟方式一是一样的,就不再放图了。

这两种方式推荐使用Parcelable接口,传递对象。

因为这个是支持,兼容安卓虚拟机的,比Serializable性能高很多。

如果是JVM平台,做Java开发,可以选择使用这个方式Serializable。

以上是关于Android :安卓学习笔记之 通过Intent传递类对象(实现Serializable和Parcelable接口)的主要内容,如果未能解决你的问题,请参考以下文章

Android学习笔记之Intent

Android:安卓学习笔记之navigation的简单理解和使用

Android:安卓学习笔记之navigation的简单理解和使用

Android:安卓学习笔记之navigation的简单理解和使用

Android基础学习笔记

Android基础学习笔记