当前位置:K88软件开发文章中心编程语言APP编程Android01 → 文章内容

4.5.2 Intent之复杂数据的传递

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-12 6:26:24

本节引言:上一节中我们学习了Intent的一些基本使用,知道了Intent的七个属性,显式Intent以及隐式Intent,以及如何自定义隐式Intent,最后还给大家提供了一些常用的系统Intent!而本节跟大家讲解的是Intent传递数据的问题~好的,开始本节内容~1.Intent传递简单数据还记得我们在Activity那里学过如何在两个Activity中互相传递简单数据的方法吗?就是可以直接通过调用Intent的putExtra()方法存入数据,然后在获得Intent后调用getXxxExtra获得对应类型的数据;传递多个的话,可以使用Bundle对象作为容器,通过调用Bundle的putXxx先将数据存储到Bundle中,然后调用Intent的putExtras()方法将Bundle存入Intent中,然后获得Intent以后,调用getExtras()获得Bundle容器,然后调用其getXXX获取对应的数据!另外数据存储有点类似于Map的<键,值>!2.Intent传递数组嘿嘿,普通类型倒没问题,但是如果是数组咧?解决方法如下:写入数组:bd.putStringArray("StringArray", new String[]{"呵呵","哈哈"});//可把StringArray换成其他数据类型,比如int,float等等...读取数组:String[] str = bd.getStringArray("StringArray")3.Intent传递集合嗯,数组很简单吧,那我们再来传下集合~这个就稍微复杂点了,分情况处理:1)List<基本数据类型或String>写入集合:intent.putStringArrayListExtra(name, value)intent.putIntegerArrayListExtra(name, value)读取集合:intent.getStringArrayListExtra(name)intent.getIntegerArrayListExtra(name)2)List< Object>将list强转成Serializable类型,然后传入(可用Bundle做媒介)写入集合:putExtras(key, (Serializable)list)读取集合:(List<Object>) getIntent().getSerializable(key)PS:Object类需要实现Serializable接口3)Map<String, Object>,或更复杂的解决方法是:外层套个List//传递复杂些的参数 Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("key1", "value1"); map1.put("key2", "value2"); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); list.add(map1); Intent intent = new Intent(); intent.setClass(MainActivity.this,ComplexActivity.class); Bundle bundle = new Bundle(); //须定义一个list用于在budnle中传递需要传递的ArrayList<Object>,这个是必须要的 ArrayList bundlelist = new ArrayList(); bundlelist.add(list); bundle.putParcelableArrayList("list",bundlelist); intent.putExtras(bundle); startActivity(intent); 4.Intent传递对象传递对象的方式有两种:将对象转换为Json字符串或者通过Serializable,Parcelable序列化不建议使用Android内置的抠脚Json解析器,可使用fastjson或者Gson第三方库! 1)将对象转换为Json字符串Gson解析的例子:Model: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());2)使用Serializable,Parcelable序列化对象1.Serializable实现:①业务Bean实现:Serializable接口,写上getter和setter方法②Intent通过调用putExtra(String name, Serializable value)传入对象实例当然对象有多个的话多个的话,我们也可以先Bundle.putSerializable(x,x);③新Activity调用getSerializableExtra()方法获得对象实例:eg:Product pd = (Product) getIntent().getSerializableExtra("Product");④调用对象get方法获得相应参数2.Parcelable实现:一般流程:①业务Bean继承Parcelable接口,重写writeToParcel方法,将你的对象序列化为一个Parcel对象;②重写describeContents方法,内容接口描述,默认返回0就可以③实例化静态内部对象CREATOR实现接口Parcelable.Creator④同样式通过Intent的putExtra()方法传入对象实例,当然多个对象的话,我们可以先放到Bundle里Bundle.putParcelable(x,x),再Intent.putExtras()即可一些解释:通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成是一个流,通过writeToParcel把对象写到流里面,在通过createFromParcel从流里读取对象,只不过这个过程需要你来实现,因此写的顺序和读的顺序必须一致。实现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 Studio生成Parcleable插件:Intellij/Andriod Studio插件android-parcelable-intellij-plugin只要ALT+Insert,即可直接生成Parcleable接口代码。另外:Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的,可以用到第三方的开源框架:Parcele

[1] [2]  下一页


4.5.2 Intent之复杂数据的传递