1. 程式人生 > >Android中Intent傳遞類物件的方法一(Serializable)

Android中Intent傳遞類物件的方法一(Serializable)

Activity之間通過Intent傳遞值,支援基本資料型別和String物件及它們的陣列物件byte、byte[]、char、char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、float[]、double、double[]、String、String[],還有實現了Serializable、Parcelable介面的類物件。

實現Serializable介面和實現Parcelable介面傳遞類物件的方法分別是:
(1)Bundle.putSerializable(Key,Object);
(2)Bundle.putParcelable(Key, Object);

實際上Serializable和Parcelable介面都是可以完成物件的序列化過程,所以當我們需要通過Intent或者Binder傳輸資料的時候就需要使用Parcelable或者Serialization。還有一些時候我們需要把物件持久化到儲存裝置上或者通過網路傳輸給其他客戶端等都需要使用到Serialization來完成物件的持久化。

我們簡單看一下第一種方法:Serialization介面

我新建了一個UserModel.java類實現了Serializable介面,使用Serialization實現序列化特別簡單,只需要這個類實現Serialization介面並宣告一個serialVersionUID 即可。

package com.xiaolijuan.serializabledome.model;

import java.io.Serializable;

/**
 * @author: xiaolijuan
 * @description:
 * @date: 2016-04-03
 * @time: 21:23
 */
public class UserModel implements Serializable{

    private static final long serialVersionUID = 6465198351058235015L;
    public int userId;
    public
String userName; public boolean isMale; public UserModel(int userId, String userName, boolean isMale) { this.userId = userId; this.userName = userName; this.isMale = isMale; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public boolean isMale() { return isMale; } public void setIsMale(boolean isMale) { this.isMale = isMale; } }

實際上,serialVersionUID 也不是必需的,我們不宣告這個serialVersionUID 同樣也可以實現序列化,但是這個會對反序列化過程造成影響,具體就不詳細介紹了。

接著我們在MainActivity.java中傳遞實現了Serializeable介面的UserModel物件

 //序列化過程
        UserModel userModel = new UserModel(0, "lijuan", true);
        Intent intent = new Intent(MainActivity.this,
                SecondActivity.class);
        intent.putExtra("userModel", userModel);
        startActivity(intent);

現在在SecondActivity.java中就可以接收到從MainActivity.java傳遞過來的UserModel啦

 //反序列化過程
        UserModel userModel = (UserModel) getIntent()
                .getSerializableExtra("userModel");
        Log.e("TAG", "使用者Id:" + userModel.getUserId() + ",使用者名稱:" + userModel.getUserName() + ",男生?" + userModel.isMale());

此時在日誌中就會打印出我們這行資訊啦

04-03 23:38:56.020  10596-10596/com.xiaolijuan.serializabledome E/TAG﹕ 使用者Id:0,使用者名稱:lijuan,男生?true

插入一個話題,如果我們要宣告serialVersionUID,那麼serialVersionUID後面那一長串數字又是怎麼來的呢?
在Android Studio中,我們可以設定自動生成 serialVersionUID,接下來看一下吧
File -> Settings->Editor -> Inspections -> Serialization issues -> Serializable class without ‘serialVersionUID’(此時記得打勾哦),然後點選OK就可以了

這裡寫圖片描述
找不到的話可以直接在Preference中搜索Serialization issues

這裡寫圖片描述
回到需要實現Serialization介面的類中,選中類名就直接Alt+enter就會提示了
現在就會多出這一行啦

private static final long serialVersionUID = 6465198351058235015L;

本篇部落格在這裡就結束了,有不足的地方還望各路大神指導 ,謝謝!