Android中的Parcelable序列化对象

下面是详细讲解“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日

相关文章

  • win10怎么设置为文件/夹右键菜单添加Windows Defender扫描选项?

    要将Windows Defender扫描选项添加到Win10的文件或文件夹右键菜单中,需要完成以下几个步骤: 打开“注册表编辑器” 在Win10中可以使用“Win+R”组合键打开“运行”对话框,输入“regedit”命令并点击“确定”打开“注册表编辑器”。 导航到Windows Defender注册表路径 在“注册表编辑器”中,使用左侧的导航窗格浏览到以下路…

    other 2023年6月27日
    00
  • apache中的rewritecond、rewriterule

    在Apache中,RewriteCond和RewriteRule是用于URL重写的两个重要指令。以下是一个完整攻略,介绍了如何在Apache中使用RewriteCond和RewriteRule。 步骤1:启用mod_rewrite模块 首先,我们需要启用Apache的mod_rewrite模块。我们可以使用以下命令来启用它: sudo a2enmod rew…

    other 2023年5月6日
    00
  • Springboot如何优雅地进行字段校验

    下面是关于如何优雅地进行字段校验的 Spring Boot 攻略。 1. 配置实体类字段校验 首先,在实体类中使用 JSR303 验证为我们提供了强大的约束形式,可通过添加适当的注释来轻松验证诸如是否为空或字符串长度是否满足要求等逻辑。 例如,下面的实体类注释了一个用户名字段,这个字段不能为空,并且长度在 6 到 16 个字符之间: @Data public…

    other 2023年6月25日
    00
  • 使用Linux五年积累的一些经验技巧

    使用Linux五年积累的一些经验技巧攻略 1. 熟悉基本命令行操作 熟悉基本的命令行操作是使用Linux的关键。以下是一些常用的命令和技巧: ls:列出当前目录下的文件和文件夹。 cd:切换目录。 mkdir:创建新的文件夹。 rm:删除文件或文件夹。 cp:复制文件或文件夹。 mv:移动文件或文件夹。 grep:在文件中搜索指定的字符串。 chmod:修改…

    other 2023年8月15日
    00
  • unityplugins的使用方法

    以下是“UnityPlugins的使用方法的完整攻略”的详细说明,包括过程中的两个示例说明。 UnityPlugins的使用方法 UnityPlugins是一种Unity插件,可以用于扩展Unity的功能。以下是一份关于UnityPlugins的使用方法的攻略。 1. UnityPlugins基础知识 在开始使用UnityPlugins之前,我们需要掌握一些…

    other 2023年5月10日
    00
  • tcp socket客户端和服务端示例分享

    TCP Socket 客户端和服务端示例分享 本文是关于如何使用 Python 编写 TCP Socket 客户端和服务端的攻略。TCP (Transmission Control Protocol) 是一种传输层协议,它保证数据能够在两个应用进程之间可靠的传输。 客户端示例 以下是 Python 编写的简单 TCP Socket 客户端示例: import…

    other 2023年6月27日
    00
  • Shell脚本批量添加扩展名的两种方法分享

    Shell脚本批量添加扩展名的两种方法分享 在Shell脚本中,我们可以使用不同的方法来批量添加文件的扩展名。下面将介绍两种常用的方法,并提供示例说明。 方法一:使用循环遍历文件并添加扩展名 这种方法使用循环遍历文件,并在文件名后添加所需的扩展名。 #!/bin/bash # 设置扩展名 extension=\".txt\" # 遍历当前…

    other 2023年8月5日
    00
  • ASP.NET中 Panel 控件的使用方法

    下面我将详细讲解ASP.NET中Panel控件的使用方法。 一、Panel控件的基本介绍 Panel控件是ASP.NET中常用的容器控件。它可以用来包含其他控件,并且可以通过设置其属性来控制所包含控件的可见性、位置和大小等属性。 二、Panel控件的使用方法 1.创建Panel控件 在ASP.NET页面中,创建Panel控件的方法非常简单,只需要在页面中添加…

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