Android Intent 传递对象

Android 使用 Intent 传递对象有两种方式:

  1. 将对象转换为 JSON 字符串
  2. 通过 Serializable, Parcelable 序列化

将对象转换为 JSON 字符串

不建议使用 Android 内置的抠脚 JSON 解析器,可使用 fastjson 或者 Gson 第三方库

gradle 添加 Gson

打开 build.gradle 文件,添加 Gson

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

    implementation 'com.google.code.gson:gson:2.8.2'
}

点击 sync 然后等待同步完成

使用

定义几个 Bean

public class Book{
    private int id;
    private String title;
    //...
}
public class Author{
    private int id;
    private String name;
    //...
}

写入数据

Book book=new Book();
book.setTitle("Java编程思想");

Author author=new Author();
author.setId(1);
author.setName("Bruce Eckel");

book.setAuthor(author);

Intent intent=new Intent(this,SecondActivity.class);
intent.putExtra("book",new Gson().toJson(book));
startActivity(intent);

读取数据:

String bookJson=getIntent().getStringExtra("book");
Book book=new Gson().fromJson(bookJson,Book.class);

Log.d(TAG,"book title->"+book.getTitle());

Log.d(TAG,"book author name->"+book.getAuthor().getName());

使用 Serializable 序列化对象

  1. 业务 Bean 实现 Serializable 接口,写上 gettersetter 方法

  2. Intent 通过调用 putExtra(String name, Serializable value) 传入对象实例

    如果对象有很多个,我们可以先使用 Bundle.putSerializable(x,x);

  3. Activity 调用 getSerializableExtra() 方法获得对象实例

    Product pd = (Product) getIntent().getSerializableExtra("Product");
    
  4. 调用对象 get 方法获得相应参数

使用 Parcelable 序列化对象

  1. 业务 Bean 继承 Parcelable 接口,重写 writeToParcel() 方法将对象序列化为一个 Parcel对象

  2. 重写 describeContents() 方法,内容接口描述,返回 0 即可

  3. 实例化静态内部对象 CREATOR 实现接口 Parcelable.Creator

  4. 同样式通过 IntentputExtra() 方法传入对象实例

    如果有多个对象的话,可以先放到 BundleBundle.putParcelable(x,x),再 Intent.putExtras()

示例: Parcelable 接口

//Internal Description Interface,You do not need to manage  
@Override  
public int describeContents() {  
     return 0;  
}  



@Override  
public void writeToParcel(Parcel parcel, int flags){  
    parcel.writeString(bookName);  
    parcel.writeString(author);  
    parcel.writeInt(publishTime);  
}  


public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {  
    @Override  
    public Book[] newArray(int size) {  
        return new Book[size];  
    }  

    @Override  
    public Book createFromParcel(Parcel source) {  
        Book mBook = new Book();    
        mBook.bookName = source.readString();   
        mBook.author = source.readString();    
        mBook.publishTime = source.readInt();   
        return mBook;  
    }  
};

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.