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");
本节小结:





