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日

相关文章

  • [c/c++]stringreverse字符串反转

    C/C++中字符串反转的完整攻略 在C/C++中,字符串反转是一个常见的操作。本文将提供一个完整的攻略,介绍如在C/C++中实现字符串反转,并提供两个示例说明。 方法1:使用库函数 C/C++中提供了库函数可以方便地实现字符串反转。可以按照以下步骤使用库函数进行字符串反转: 使用库函数strrev()进行字符串反转。 #include <stdio.h…

    other 2023年5月8日
    00
  • 跟我学Laravel之请求(Request)的生命周期

    下面就为你详细讲解“跟我学Laravel之请求(Request)的生命周期”的完整攻略。 请求生命周期 在Laravel中,请求生命周期主要由以下7个步骤组成: 入口文件:在Laravel入口文件public/index.php中,Laravel会实例化Illuminate\Foundation\Application这个类,然后将请求交给它处理。 服务提供…

    other 2023年6月27日
    00
  • Java11中基于嵌套关系的访问控制优化详解

    Java11中基于嵌套关系的访问控制优化详解 Java 11引入了一项新的特性,即基于嵌套关系的访问控制优化。这个特性可以帮助开发者更好地管理类和接口之间的访问权限,提高代码的可读性和安全性。 1. 嵌套关系的概念 在Java中,一个类或接口可以被定义在另一个类或接口的内部,形成嵌套关系。嵌套关系可以分为两种类型:静态嵌套和非静态嵌套。 静态嵌套:一个类或接…

    other 2023年7月27日
    00
  • java对象克隆实现方法详解

    Java对象克隆实现方法详解 对象克隆是指创建一个与原始对象具有相同状态的新对象。在Java中,可以使用不同的方法实现对象克隆。以下是关于Java对象克隆的详细攻略。 方法一:实现Cloneable接口 在需要克隆的类中实现Cloneable接口,该接口是一个标记接口,没有任何方法。 重写Object类的clone()方法,并将访问修饰符改为public。 …

    other 2023年10月15日
    00
  • 开机系统准备工具如何关闭

    当然,我很乐意为您提供有关“开机系统准备工具如何关闭”的完整攻略。以下是详细的步骤和两个示例: 1 关闭开机系统准备工具 开机系统准备工具是操作系统的一个功能,它可以帮助您在计算机启动时进行故障排除和修复。如果您不需要使用此功能,可以通过步骤关闭它: 1.1 使用系统配置工具 可以使用系统配置工具来关闭开机系统准备工具。以下是步骤: 打开“运行”对话框,方法…

    other 2023年5月6日
    00
  • Python实现基本Socket服务端与客户端通信的完整代码

    下面是关于“Python实现基本Socket服务端与客户端通信的完整代码”的完整攻略: 一、Socket基本概念 Socket是一种通信机制,它使得网络上的两个进程可以进行双向通信。一个进程可以向Socket写入信息,另一个进程可以从该Socket读取信息。在建立Socket连接之前,需要指定两端的IP地址和端口号。而在Python中,我们可以使用socke…

    other 2023年6月27日
    00
  • npoi教程-2.1单元格合并

    npoi教程-2.1 单元格合并 在NPOI库中,提供了合并单元格的功能。合并单元格是指将多个单元格合并成一个单元格,这样可以获得更加美观的表格布局。 1. 调用合并单元格的方法 使用NPOI库合并单元格非常简单,只需要调用单元格的Merge方法即可。 ICellRange mergedCell = sheet.AddMergedRegion(new Cel…

    其他 2023年3月29日
    00
  • 全盘搜索指定文件并拷贝到指定位置[自动重命名]的批处理

    全盘搜索指定文件并拷贝到指定位置[自动重命名]的批处理,可以通过以下几个步骤实现: 第一步: 创建批处理文件 首先需要在电脑上创建一个批处理文件,也就是后缀名为 .bat 的文件,可以使用记事本或其他编辑器来创建这个文件。在批处理文件中编写代码,用于搜索指定的文件并复制到指定位置。建议保存批处理文件时,文件名与代码中的路径一致,避免出现路径错误。 第二步: …

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