首页 > 其他分享 >Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象

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

时间:2022-11-17 10:38:00浏览次数:56  
标签:name Parcelable age 传递 Intent void Student Override public

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

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

效果图:

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


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

先创建一个对象:

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。


标签:name,Parcelable,age,传递,Intent,void,Student,Override,public
From: https://blog.51cto.com/u_15880918/5860063

相关文章

  • mvc视图类中向Js传递动态参数
     使用APS.NET MVC编写页面,在Html中为javascript函数传入的参数为动态数据时,要注意将动态参数放在引号中,如下面代码中@item.FeeDeptName。@foreach(variteminModel......
  • Java引用类型参数传递
    结论:1)当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值2)当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,则会对实......
  • 指针的指针,以及指针传递
     1#include<cstddef>2#include<cstdlib>3#include<iostream>4#include"string.h"5usingnamespacestd;678voidGetMemory(char**p,intnu......
  • 关于Intent.setDataAndType参数问题
    关于Intent.setDataAndType参数问题install取设置属于和类型,数据就是获取到的uri,更具文件类型不同,type参数也不相同,具体参考下表{后缀名,MIME类型}​{".3gp","vi......
  • 方法和传递
    1packagecom.Lucky.base;23publicclassmethod{4//方法java是值传递56//main主方法78//值传递:是指在调用函数时将实际......
  • Feign 实现 GET 方法传递 POJO
    Feign实现GET方法传递POJO作者:Grey原文地址:博客园:Feign实现GET方法传递POJOCSDN:Feign实现GET方法传递POJO需求SpringMVC支持GET方法直接绑定POJO......
  • Vue2.x下的各组件如何传递信息?(不使用Vuex)
    Vue2(选项式)一,父组件向子组件传递数据:介绍:在引用的子组件中定义自定义属性msg与user.可以通过v-bind绑定要发送的数据。  在子组件中使用props接收自定义属性msg......
  • Android Service学习之AIDL, Parcelable和远程服务
    AIDL的作用由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象。在Android平台,一个进程通常不能访问另......
  • Vue通过事件交互将数据从子组件传递到父组件
    首先有两个组件:父组件:App.vue子组件:ComponentForOne.vue<template><imgalt="Vuelogo"src="./assets/logo.png"><!--下面使用组件:组件标签名--><......
  • python 中实现在命令行中传递参数
     001、[root@pc1test1]#lsa.fatest.py[root@pc1test1]#cata.fa##测试fasta文件>chr1kkkaatttttcccc>chr2yyyttttuuuuddfff>chr3eeeuuuuukkss......