Android Intent 传递对象
Android 使用 Intent
传递对象有两种方式:
- 将对象转换为
JSON
字符串 - 通过
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 序列化对象
-
业务
Bean
实现Serializable
接口,写上getter
和setter
方法 -
Intent
通过调用putExtra(String name, Serializable value)
传入对象实例如果对象有很多个,我们可以先使用
Bundle.putSerializable(x,x);
-
新
Activity
调用getSerializableExtra()
方法获得对象实例Product pd = (Product) getIntent().getSerializableExtra("Product");
-
调用对象
get
方法获得相应参数
使用 Parcelable 序列化对象
-
业务
Bean
继承Parcelable
接口,重写writeToParcel()
方法将对象序列化为一个Parcel
对象 -
重写
describeContents()
方法,内容接口描述,返回0
即可 -
实例化静态内部对象
CREATOR
实现接口Parcelable.Creator
-
同样式通过
Intent
的putExtra()
方法传入对象实例如果有多个对象的话,可以先放到
Bundle
里Bundle.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; } };