intent

更新时间:2023-01-04 04:12:36 阅读: 评论:0


2023年1月4日发(作者:英文培训)

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)getIntent().getSerializable(key)

PS:Object类需要实现Serializable接⼝

3)Map,或更复杂的

解决⽅法是:外层套个List

//传递复杂些的参数

Mapmap1=newHashMap();

("key1","value1");

("key2","value2");

List>list=newArrayList>();

(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);

}

rCREATOR=newCreator(){

@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;

}

finalHashMapmMap;

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小时内删除。

上一篇:taisha
下一篇:ransom
标签:intent
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图
  • 我要关灯
    我要开灯
  • 返回顶部