android之Intent之复杂数据的传递
传递简单数据
还记得我们在Activity那⾥学过如何在两个Activity中互相传递简单数据的⽅法吗?
就是可以直接通过调⽤Intent的putExtra()⽅法存⼊数据,然后在获得Intent后调⽤getXxxExtra获得对应类型的数据;传递多个的
话,可以使⽤Bundle对象作为容器,通过调⽤Bundle的putXxx先将数据存储到Bundle中,然后调⽤Intent的putExtras()⽅法将
Bundle存⼊Intent中,然后获得Intent以后,调⽤getExtras()获得Bundle容器,然后调⽤其getXXX获取对应的数据!另外数据存
储有点类似于Map的<键,值>!
传递数组
写⼊数组:
ingArray("StringArray",newString[]{"呵呵","哈哈"});
//可把StringArray换成其他数据类型,⽐如int,float等等...
读取数组:
读取数组:
String[]str=ingArray("StringArray")
传递集合
1)List<基本数据类型或String>
写⼊集合:
ingArrayListExtra(name,value)
egerArrayListExtra(name,value)
读取集合:
ingArrayListExtra(name)
egerArrayListExtra(name)
2)List
将list强转成Serializable类型,然后传⼊(可⽤Bundle做媒介)
写⼊集合:
putExtras(key,(Serializable)list)
读取集合:
(List
PS:Object类需要实现Serializable接⼝
3)Map
解决⽅法是:外层套个List
//传递复杂些的参数
Map
("key1","value1");
("key2","value2");
List
(map1);
Intentintent=newIntent();
ss(,);
Bundlebundle=newBundle();
//须定义⼀个list⽤于在budnle中传递需要传递的ArrayList
ArrayListbundlelist=newArrayList();
(list);
celableArrayList("list",bundlelist);
ras(bundle);
startActivity(intent);
传递对象
1)将对象转换为Json字符串
Gson解析的例⼦:
Model:
publicclassBook{
privateintid;
privateStringtitle;
//...
}
publicclassAuthor{
privateintid;
privateStringname;
//...
}
写⼊数据:
Bookbook=newBook();
le("Java编程思想");
Authorauthor=newAuthor();
(1);
e("BruceEckel");
hor(author);
Intentintent=newIntent(this,);
ra("book",newGson().toJson(book));
startActivity(intent);
读取数据:
StringbookJson=getIntent().getStringExtra("book");
Bookbook=newGson().fromJson(bookJson,);
Log.d(TAG,"booktitle->"+le());
Log.d(TAG,"bookauthorname->"+hor().getName());
2)使⽤Serializable,Parcelable序列化对象
izable实现:
①业务Bean实现:Serializable接⼝,写上getter和tter⽅法
②Intent通过调⽤putExtra(Stringname,Serializablevalue)传⼊对象实例当然对象有多个的话多个的话,我们也可以先
ializable(x,x);
③新Activity调⽤getSerializableExtra()⽅法获得对象实例:eg:Productpd=(Product)
getIntent().getSerializableExtra("Product");
④调⽤对象get⽅法获得相应参数
able实现:
⼀般流程:
①业务Bean继承Parcelable接⼝,重写writeToParcel⽅法,将你的对象序列化为⼀个Parcel对象;
②重写describeContents⽅法,内容接⼝描述,默认返回0就可以
③实例化静态内部对象CREATOR实现接⼝r
④同样式通过Intent的putExtra()⽅法传⼊对象实例,当然多个对象的话,我们可以先放到Bundle⾥celable(x,x),再
ras()即可
⼀些解释:
通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象。也可以将Parcel看成
是⼀个流,通过writeToParcel把对象写到流⾥⾯,在通过createFromParcel从流⾥读取对象,只不过这个过程需要你来实现,因此
写的顺序和读的顺序必须⼀致。
实现Parcelable接⼝的代码⽰例:
//InternalDescriptionInterface,Youdonotneedtomanage
@Override
publicintdescribeContents(){
return0;
}
@Override
publicvoidwriteToParcel(Parcelparcel,intflags){
tring(bookName);
tring(author);
nt(publishTime);
}
r
@Override
publicBook[]newArray(intsize){
returnnewBook[size];
}
@Override
publicBookcreateFromParcel(Parcelsource){
BookmBook=newBook();
me=ring();
=ring();
hTime=t();
returnmBook;
}
};
传递Bitmap
bitmap默认实现Parcelable接⼝,直接传递即可
实现代码:
Bitmapbitmap=null;
Intentintent=newIntent();
Bundlebundle=newBundle();
celable("bitmap",bitmap);
ra("bundle",bundle);
6.传来传去不⽅便,直接定义全局数据
如果是传递简单的数据,有这样的需求,Activity1->Activity2->Activity3->Activity4,你想在Activity中传递某个数据到
Activity4中,怎么破,⼀个个页⾯传么?
显然不科学是吧,如果你想某个数据可以在任何地⽅都能获取到,你就可以考虑使⽤Application全局对象了!
Android系统在每个程序运⾏的时候创建⼀个Application对象,⽽且只会创建⼀个,所以Application是单例(singleton)模式的⼀个
类,⽽且Application对象的⽣命周期是整个程序中最长的,他的⽣命周期等于这个程序的⽣命周期。如果想存储⼀些⽐静态的值(固
定不改变的,也可以变),如果你想使⽤Application就需要⾃定义类实现Application类,并且告诉系统实例化的是我们⾃定义的
Application⽽⾮系统默认的,⽽这⼀步,就是在中卫我们的application标签添加:name属性!
关键部分代码:
1)⾃定义Application类:
classMyAppextendsApplication{
privateStringmyState;
publicStringgetState(){
returnmyState;
}
publicvoidtState(Strings){
myState=s;
}
}
2)中声明:
android:label="@string/app_name">
3)在需要的地⽅调⽤:
classBlahextendsActivity{
@Override
publicvoidonCreate(Bundleb){
...
MyAppappState=((MyApp)getApplicationContext());
Stringstate=te();
...
}
}
⾼逼格写法
:在任何位置都能获取到Application全局对象。
Applicaiton是系统的⼀个组件,他也有⾃⼰的⼀个⽣命周期,我们可以在onCraete⾥获得这个Application对象。贴下修改后的代码吧!
classMyAppextendsApplication{
privateStringmyState;
privatestaticMyAppinstance;
publicstaticMyAppgetInstance(){
returninstance;
}
publicStringgetState(){
returnmyState;
}
publicvoidtState(Strings){
myState=s;
}
@Override
publicvoidonCreate(){
onCreate();
instance=this;
}
}
然后在任意地⽅我们就可以直接调⽤:tance()来获得Application的全局对象!
注意事项:
Application对象是存在于内存中的,也就有它可能会被系统杀死,⽐如这样的场景:
我们在Activity1中往application中存储了⽤户账号,然后在Activity2中获取到⽤户账号,并且显⽰!
如果我们点击home键,然后过了N久候,系统为了回收内存kill掉了我们的app。这个时候,我们重新打开这个app,这个时候很神奇
的,回到了Activity2的页⾯,但是如果这个时候你再去获取Application⾥的⽤户账号,程序就会报NullPointerException,然后
crash掉~
之所以会发⽣上述crash,是因为这个Application对象是全新创建的,可能你以为App是重新启动的,其实并不是,仅仅是创建⼀个
新的Application,然后启动上次⽤户离开时的Activity,从⽽创造App并没有被杀死的假象!所以如果是⽐较重要的数据的话,建议
你还是进⾏本地化,另外在使⽤数据的时候要对变量的值进⾏⾮空检查!还有⼀点就是:不⽌是Application变量会这样,单例对象
以及公共静态变量也会这样~
7.单例模式传参
①定义⼀个单例类:
publicclassXclSingleton
{
//单例模式实例
privatestaticXclSingletoninstance=null;
//synchronized⽤于线程安全,防⽌多线程同时创建实例
publicsynchronizedstaticXclSingletongetInstance(){
if(instance==null){
instance=newXclSingleton();
}
returninstance;
}
finalHashMap
privateXclSingleton()
{
mMap=newHashMap
}
publicvoidput(Stringkey,Objectvalue){
(key,value);
}
publicObjectget(Stringkey)
{
(key);
}
}
②设置参数:
tance().put("key1","value1");
tance().put("key2","value2");
本文发布于:2023-01-04 04:12:36,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/88543.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |