源码先锋

源码先锋

Intent之复杂数据的传递

admin 119 170

1.Intent传递简单数据

2.Intent传递数组

写入数组:

("StringArray",newString[]{"呵呵","哈哈"});

//可把StringArray换成其他数据类型,比如int,float等等

读取数组:

String[]str=("StringArray")

3.Intent传递集合

1)List基本数据类型或String

写入集合:

(name,value)

(name,value)

读取集合:

(name)

(name)

2)ListObject

将list强转成Serializable类型,然后传入(可用Bundle做媒介)

写入集合:

putExtras(key,(Serializable)list)

读取集合:

(ListObject)getIntent().getSerializable(key)

PS:Object类需要实现Serializable接口

3)MapString,Object,或更复杂的

解决方法是:外层套个List

//传递复杂些的参数

MapString,Objectmap1=newHashMapString,Object();

("key1","value1");

("key2","value2");

ListMapString,Objectlist=newArrayListMapString,Object();

(map1);

Intentintent=newIntent();

(,);

Bundlebundle=newBundle();

//须定义一个list用于在budnle中传递需要传递的ArrayListObject,这个是必须要的

ArrayListbundlelist=newArrayList();

(list);

("list",bundlelist);

(bundle);

startActivity(intent);

4.Intent传递对象

传递对象的方式有两种:将对象转换为Json字符串或者通过Serializable,Parcelable序列化不建议使用Android内置的抠脚Json解析器,可使用fastjson或者Gson第三方库!

1)将对象转换为Json字符串

Gson解析的例子:

Model:

publicclassBook{

privateintid;

privateStringtitle;

//

}

publicclassAuthor{

privateintid;

privateStringname;

//

}

写入数据:

Bookbook=newBook();

("Java编程思想");

Authorauthor=newAuthor();

(1);

("BruceEckel");

(author);

Intentintent=newIntent(this,);

("book",newGson().toJson(book));

startActivity(intent);

读取数据:

StringbookJson=getIntent().getStringExtra("book");

Bookbook=newGson().fromJson(bookJson,);

(TAG,"booktitle-"+());

(TAG,"bookauthorname-"+().getName());

2)使用Serializable,Parcelable序列化对象

1.Serializable实现:

2.Parcelable实现:

一般流程:

一些解释:

实现Parcelable接口的代码示例:

//InternalDescriptionInterface,Youdonotneedtomanage

@Override

publicintdescribeContents(){

return0;

}

@Override

publicvoidwriteToParcel(Parcelparcel,intflags){

(bookName);

(author);

(publishTime);

}

=newCreatorBook(){

@Override

publicBook[]newArray(intsize){

returnnewBook[size];

}

@Override

publicBookcreateFromParcel(Parcelsource){

BookmBook=newBook();

=();

=();

=();

returnmBook;

}

};

AndroidStudio生成Parcleable插件:

Intellij/AndriodStudio插件android-parcelable-intellij-plugin只要ALT+Insert,即可直接生成Parcleable接口代码。

另外:Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的,可以用到第三方的开源框架:Parceler,因为Maven的问题,暂时还没试。

参考地址:[Android的Parcelable自动生成]

3.两种序列化方式的比较:

两者的比较:

1)在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。

2)Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。

3)Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable。

5.Intent传递Bitmap

bitmap默认实现Parcelable接口,直接传递即可

实现代码:

Bitmapbitmap=null;

Intentintent=newIntent();

Bundlebundle=newBundle();

("bitmap",bitmap);

("bundle",bundle);

6.传来传去不方便,直接定义全局数据

关键部分代码:

1)自定义Application类:

classMyAppextsApplication{

privateStringmyState;

publicStringgetState(){

returnmyState;

}

publicvoidsetState(Strings){

myState=s;

}

}

2)中声明:

applicationandroid:name=".MyApp"android:icon="@drawable/icon"

android:label="@string/app_name"

3)在需要的地方调用:

classBlahextsActivity{

@Override

publicvoidonCreate(Bundleb){

MyAppappState=((MyApp)getApplicationContext());

Stringstate=();

}

}

高逼格写法

:在任何位置都能获取到Application全局对象。Applicaiton是系统的一个组件,他也有自己的一个生命周期,我们可以在onCraete里获得这个Application对象。贴下修改后的代码吧!

classMyAppextsApplication{

privateStringmyState;

privatestaticMyAppinstance;

publicstaticMyAppgetInstance(){

returninstance;

}

publicStringgetState(){

returnmyState;

}

publicvoidsetState(Strings){

myState=s;

}

@Override

publicvoidonCreate(){

onCreate();

instance=this;

}

}

然后在任意地方我们就可以直接调用:()来获得Application的全局对象!

注意事项:

7.单例模式传参

范例代码:(代码来自于网上~)

①定义一个单例类:

publicclassXclSingleton

{

//单例模式实例

privatestaticXclSingletoninstance=null;

//synchronized用于线程安全,防止多线程同时创建实例

publicsynchronizedstaticXclSingletongetInstance(){

if(instance==null){

instance=newXclSingleton();

}

returninstance;

}

finalHashMapString,ObjectmMap;

privateXclSingleton()

{

mMap=newHashMapString,Object();

}

publicvoidput(Stringkey,Objectvalue){

(key,value);

}

publicObjectget(Stringkey)

{

(key);

}

}

②设置参数:

().put("key1","value1");

().put("key2","value2");

本节小结: