Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象

简介: Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象

方式一:通过实现Serializable接口传递对象

用一个小的Demo去理解,通过实现Serializable接口传递对象。

效果图:

具体讲解在代码注释中已经写出

先创建一个对象:

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();
    }
}

方式二:通过实现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。


目录
相关文章
|
1月前
|
JSON 调度 数据库
Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点。文章详细解析了Kotlin中的协程、扩展函数、高阶函数、密封类及`inline`和`reified`关键字在Android开发中的应用,帮助读者更好地理解和使用这些特性。
25 1
|
18天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
28 0
|
1月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
21 2
|
1月前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
68 0
|
3月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
29 0
|
3月前
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
下一篇
无影云桌面