Presentation is loading. Please wait.

Presentation is loading. Please wait.

Activity之间的数据传递.

Similar presentations


Presentation on theme: "Activity之间的数据传递."— Presentation transcript:

1 Activity之间的数据传递

2 Activity之间的数据传递 在实际的应用开发中,不同的Activity之间进行切换的时候不可避免的进行数据传递,下面我们来介绍4种最常用的数据传递方法: 通过Intent传递数据 通过静态变量传递数据 通过剪切板传递数据 通过全局对象传递数据

3 Intent传递数据 什么是Intent Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来请求。 Intent负责对应用中一次操作的动作(动作涉及数据、附加数据)进行描述,Android根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。 因此,Intent起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。 使用Intent传递数据 这是最常用的一种数据传递的方法。通过Intent类中的putExtra方法可以将简单类型的数据或序列化的对象保存到Intent对象中,然后在目标的Activity中使用getXxx(getInt、getString等)方法取出对应的数据。

4 Intent传递数据 将数据保存到Intent对象的代码如下: 在OtherActivity类中获取上面保存的3个值的代码如下:

5 Intent传递数据 Intent传递对象时只能是可序列化的对象,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable。 Java中使用的是Serializable,而Android使用自定义的Parcelable。Parcelable定位为针对内存受限的设备,对性能要求更高,另外android系统中采用了新的IPC(进程间通信)机制,必然要求使用性能更出色的对象传输方式。它们的区别是: 在使用内存的时候,Parcelable比Serializable性能高 Serializable序列化的时候会产生大量的临时变量,从而引起频繁的GC Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下,这种情况建议使用Serializable

6 Intent传递数据 使用Serializable:

7 Intent传递数据 使用Parcelable:

8 静态变量传递数据 使用Intent可以很方便在不同的Activity之间传递数据,这也是官方推荐的方式,但是也有一定的局限性,就是Intent无法传递不能序列化的对象,也就是没有实现java.io.Serializable接口的类的对象。而静态变量就是一种非常方便、易用的的传递数据的方法。 代码如下:

9 静态变量传递数据 想要在OtherActivity中获取这些静态变量的值,需要在显示OtherActivity之前(startActivity方法之前)为这些变量赋值 代码如下:

10 剪切板传递数据 在Activity之间数据传递还可以利用一些技巧,不管是Windows还是Linux,都会支持一种叫剪切板的技术,也就是某一个程序将一些数据复制到剪切板上,然后其他的程序都可以从剪切板中获取这些数据。因此在Activity之间传递数据也可以利用这种技术。代码如下: 从剪切板中获得这个字符串的代码如下:

11 剪切板传递数据 ClipboardManager对象只支持向剪切板读写字符串,并不支持其他类型的数据。那么如何传递这些数据呢,其实也很简单,比如int、bool等可以转换为字符串进行传递,而对象类型则必须是可序列化的对象才可传递。以Base64编码格式传递可序列化的对象为例:

12 剪切板传递数据 将Base64编码的字符串进行解码:

13 全局对象传递数据 虽然使用静态变量可传递任何类型数据,但官方并不建议这样做。
大量使用静态变量可能造成内存溢出异常 静态变量在很多类中出现会造成代码难以维护和混乱 全局对象这种优雅的数据传递方式可解决以上的问题,并能完全取代静态变量。 Android中的全局对象类似于Java Web中的Application域,如果没有将应用程序从内存中彻底清除,那么全局对象将一直可以访问。编写时需注意以下几点: 全局对象所对应的类必须是android.app.Application的子类 全局类中不需定义静态变量,只定义成员变量即可 全局类中必须有一个无参数的构造方法或不编写任何代码的构造方法

14 全局对象传递数据 另外只编写一个全局类是不会自动创建全局类对象,需要在配置文件AndroidManifest.xml中通过<application>标签的android:name属性指定这个类,否则系统不知道哪个类是全局类。指定全局类后,在程序运行后全局对象就会被自动创建,而且会一直在内存中驻留,直到应用程序彻底退出内存。

15 全局对象传递数据 获取MyApp对象,并为对象中字段赋值,代码如下: 显示修改后的MyApp对象中字段的值,代码如下:

16 从Activity中返回数据 在实际应用中,我们不仅要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,也可以采用前面4种方法,但是一般建议采用Intent对象的方式来返回数据,使用这种方式返回数据,需要使用startActivityForResult方法来显示Activity。 代码如下: 其中startActivityForResult方法第二个参数是一个int类型的请求码,可以是任意的整数,只是为了区分请求的来源,以便处理返回结果。

17 从Activity中返回数据 在打开的Activity中设置返回数据,代码如下:
从OtherActivity返回后,需要覆盖onActivityResult方法来处理返回的结果,如下:


Download ppt "Activity之间的数据传递."

Similar presentations


Ads by Google