Android中的Parcelable序列化对象

yizhihongxing

下面是详细讲解“Android中的Parcelable序列化对象”的完整攻略:

什么是Parcelable

Parcelable是一个序列化对象的接口,在Android中,如果我们想让一个Java对象能够在不同的组件或者进程间传递,那么这个Java对象必须去实现Parcelable接口从而达到序列化的目的。与Serializable相比,Parcelable更适用于Android,主要是因为Parcelable更加高效,可以更快的序列化和反序列化对象。

相比强制类型转换,Parcelable的最大优势在于能减少序列化后数据的大小,提高传递效率。

Parcelable 接口的使用

Parcelable接口的使用需要实现以下步骤:

  1. 在要传递的Java类中,实现Parcelable接口,并在实现中重写两个方法:

```
public class User implements Parcelable {
...
@Override
public int describeContents() {
return 0;
}

   @Override
   public void writeToParcel(Parcel dest, int flags) {
       dest.writeString(this.userName);
       dest.writeInt(this.userId);
       dest.writeString(this.userGender);
       dest.writeInt(this.age);
   }
}

```

describeContents()只需要返回0即可。

writeToParcel()方法需要将需要传递的Java类中的每个属性都写入到Parcel中,调用dest.writeXX()方法进行写入。其中XX代表你需要写入的属性数据类型。
  1. 我们需要在类中提供一个静态的Parcelable.Creator接口对象,并创建一个同名的Creator实现Parcelable.Creator接口,这个接口将在接下来的步骤中用到。

```
public static final Creator CREATOR = new Creator() {
@Override
public User createFromParcel(Parcel in) {
User user = new User();
user.userName = in.readString();
user.userId = in.readInt();
user.userGender = in.readString();
user.age = in.readInt();
return user;
}

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

};
```

这个Creator<User>系列化对象需要反序列化时使用。
  1. 序列化对象

在想要将数据传输到另一个组件或者进程时,将序列化对象写入Parcel中。

User user = new User();
...
Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("user", user);
intent.putExtras(bundle);
startActivity(intent);

  1. 反序列化

在另一个组件或者进程中,需要去读取已序列化的对象:

Intent intent = getIntent();
Bundle bundle = intent.getExtras();
User user = bundle.getParcelable("user");

示例1:用户类User实现Parcelable

我们创建一个用户类User,用来展示Parcelable的用法。

public class User implements Parcelable {
    private String userName;
    private int userId;
    private String userGender;
    private int age;

    public User() {}

    public User(String userName, int userId, String userGender, int age) {
        this.userName = userName;
        this.userId = userId;
        this.userGender = userGender;
        this.age = age;
    }

    protected User(Parcel in) {
        userName = in.readString();
        userId = in.readInt();
        userGender = in.readString();
        age = in.readInt();
    }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) {
            return new User(in);
        }

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.userName);
        dest.writeInt(this.userId);
        dest.writeString(this.userGender);
        dest.writeInt(this.age);
    }
}

同样我们也可以创建新类来展现如何使用Parcelable

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        User user = new User("John Smith", 120, "Male", 28);

        Intent intent = new Intent(this, SecondActivity.class);
        Bundle bundle = new Bundle();
        bundle.putParcelable("user", user);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

我们在MainActivity里面创建了一个用户对象User,将User序列化后传递给SecondActivity。SecondActivity示例代码:

public class SecondActivity extends AppCompatActivity {

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

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        User user = bundle.getParcelable("user");

        if (user != null) {
            Log.d("Parcelable", user.getUserName() + " " + user.getUserId() + " " +
                    user.getUserGender() + " " + user.getAge());
        }
    }
}

我们在SecondActivity里面去反序列化对象,并打印出用户信息。

示例2:活动类Activity实现Parcelable

我们创建一个活动类Activity,重写Parcelable的方法,并尝试序列化注册生命周期中的变量。

public class ActivityTest extends AppCompatActivity implements Parcelable {
    private int mActivityId;
    private String mActivityName;
    private int mLifecycleCount = 1;

    public ActivityTest() {
        mActivityId = 0;
        mActivityName = "UnknownActivity";
    }

    public ActivityTest(int activityId, String activityName) {
        mActivityId = activityId;
        mActivityName = activityName;
    }

    protected ActivityTest(Parcel in) {
        mActivityId = in.readInt();
        mActivityName = in.readString();
        mLifecycleCount = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mActivityId);
        dest.writeString(mActivityName);
        dest.writeInt(mLifecycleCount);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    public static final Creator<ActivityTest> CREATOR = new Creator<ActivityTest>() {
        @Override
        public ActivityTest createFromParcel(Parcel in) {
            return new ActivityTest(in);
        }

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

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

    @Override
    public void onStart() {
        super.onStart();
        mLifecycleCount++;
    }

    @Override
    public void onResume() {
        super.onResume();
        mLifecycleCount++;
    }

    @Override
    public void onPause() {
        super.onPause();
        mLifecycleCount++;
    }

    @Override
    public void onStop() {
        super.onStop();
        mLifecycleCount++;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mLifecycleCount++;
    }
}

同样我们也可以创建新类来展现如何使用Parcelable

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ActivityTest mActivity = new ActivityTest(1, "Main");

        Intent intent = new Intent(this, SecondActivity.class);
        Bundle bundle = new Bundle();
        bundle.putParcelable("activityTest", mActivity);
        intent.putExtras(bundle);
        startActivity(intent);
    }
}

我们在MainActivity里面创建了一个活动类ActivityTest,将ActivityTest对象序列化后传递给SecondActivity。SecondActivity示例代码:

public class SecondActivity extends AppCompatActivity {

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

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        ActivityTest mActivity = bundle.getParcelable("activityTest");

        if (mActivity != null) {
            Log.d("Parcelable", mActivity.mActivityName + " " + mActivity.mLifecycleCount);
        }
    }
}

我们在SecondActivity里面将传递过来的变量都打印出来。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中的Parcelable序列化对象 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Android程序版本更新之通知栏更新下载安装

    Android程序版本更新之通知栏更新下载安装攻略 在Android应用程序中,实现版本更新的一种常见方式是通过通知栏进行下载和安装。这种方法可以提供给用户一个方便的方式来更新应用程序,并且可以在后台进行下载和安装,而不会打断用户的操作。下面是一个详细的攻略,介绍如何实现这一功能。 步骤一:创建通知栏 首先,我们需要创建一个通知栏,用于显示下载进度和安装状态…

    other 2023年8月3日
    00
  • 剑指Offer之Java算法习题精讲链表与二叉树专项训练

    剑指Offer之Java算法习题精讲链表与二叉树专项训练攻略 1. 确定题目类型 本专项训练主要包含链表与二叉树两种数据结构,因此在解题过程中需要先确定题目属于哪种类型。对于链表题目,需要掌握链表的基本操作,比如遍历、插入、删除等。对于二叉树题目,需要掌握二叉树的遍历方式、求最大深度、判断是否为平衡二叉树等基本操作。 2. 制定解题计划 在确定题目类型后,需…

    other 2023年6月27日
    00
  • 解决lombok 父类和子类builder不兼容的问题

    当使用Lombok框架时,有时会遇到使用父类的Builder创建子类实例时出现兼容性问题的情况。这是因为父类和子类在使用Lombok注解生成的Builder时,使用的是不同的构造器和setter方法。 要解决这个问题,我们可以使用下面的步骤来解决: 1. 使用 @SuperBuilder 注解 在父类和子类中都添加 @SuperBuilder 注解,这个注解…

    other 2023年6月26日
    00
  • 苹果电脑的Mac系统安装应用程序(软件)的方法(图文教程)

    苹果电脑的Mac系统安装应用程序(软件)的方法(图文教程) 1. 从App Store下载安装 步骤如下: 打开App Store 在搜索框中输入软件名称或关键字 找到相应的软件,然后点击“获取”或“安装”按钮 输入Apple ID和密码进行确认 下载完成后,在“启动台”中找到并打开软件 示例说明1:下载并安装“Pages” 打开App Store 在搜索框…

    other 2023年6月25日
    00
  • javacc从入门到出门

    以下是关于JavaCC从入门到出门的完整攻略: JavaCC从入门到出门 JavaCC是一个用于生成Java解析器的工具,它可以根据语法规则生成Java代码,用于解析输入的文本。以下是JavaCC的入门教程。 1. 安装JavaCC 首先,您需要安装JavaCC。您可以从JavaCC的官方网站下载最新版本JavaCC。 2. 编写语法规则 接下来,您需要编写…

    other 2023年5月6日
    00
  • 如何分析hprof文件

    如何分析hprof文件 背景 hprof文件是Java虚拟机(JVM)生成的一种堆转储文件(heap dump),它记录了 JVM 中各个对象在堆中的分布情况以及各个对象的属性情况。在排除Java应用程序内存问题时,hprof文件是一个重要的工具。本文将探讨如何分析hprof文件以解决Java应用程序的内存问题。 步骤 1. 生成hprof文件 在Java应…

    其他 2023年3月28日
    00
  • android ndk程序获取外置SD沙盒目录的方法讲解

    Android NDK程序获取外置SD沙盒目录的方法讲解 在Android NDK程序中,要获取外置SD卡的沙盒目录,可以按照以下步骤进行: 首先,确保你的应用已经声明了读取外部存储的权限。在AndroidManifest.xml文件中添加以下权限声明: <uses-permission android:name=\"android.perm…

    other 2023年9月7日
    00
  • Java中@Autowired和@Resource区别

    当我们开发Java应用程序时, Spring框架是一个受欢迎的选择。 该框架提供了许多功能,用于管理应用程序中的各种组件。其中,依赖注入(Dependency Injection)是Spring框架中非常常见的一种技术,大大简化了组件之间的交互。Spring框架提供了许多注释,方便我们在类中进行注入。 在Spring中,我们可以使用@Autowired和@R…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部