Android 数据传递之Application、Intent、static

来源:互联网 发布:招聘网络总监 编辑:程序博客网 时间:2024/05/21 18:10

  小妹从事安卓开发一年多了,一直在CSDN上瞻仰各种大神的神作,今天也打算开始自己的博客之旅,写得不对的地方大家帮忙指正一下害羞

安卓开发总是离不开数据传递。之前一直使用Intent、static,最近开始使用Application实现数据传递。有一些感触,今天来总结一哈。

static:这个东西一看就觉得亲切是不是,大多数菜鸟程序员都对她爱不释手,因为——完全没有技术含量。在Activity A定义一个static变量,Activity B、C、D、、、都能用,直接引用,不要太爽了。但是这个便利后隐藏的是非常严重的隐患。首先,static只有在持有者销毁时才会被回收处理,即使没有用到,它还是在那,对于内存比较吃紧的机子来说,创建过多的静态常量并非明智之举。要知道,作为一个优秀的app,内存优化至关重要。

Intent:intent是官方推荐传递参数的工具,但是其传递参数的大小有限,一般不超过1M。超过时,会跑出TransactionTooLargeException异常,“The Binder transaction failed because it was too large.”即传输数据过大异常。所以,其只适用于传递一般类型的参数。如果是图片,较复杂的对象,则需要对其进行处理(序列化等)


Application:Application和Activity,Service一样是Android框架的一个系统组件,当android程序启动时系统会创建一个 application对象,用来存储系统的一些信息。当然也可以自定义一个Application类,然后在AndroidManifest.xml文件中,配置成自己的Application即可。

//配置自己的Application
 <application        android:name=".ApplicationListener"        android:icon="xxx        android:label="xxx        android:persistent="xxx"        android:theme="xxx"        tools:replace="xxx">
public class ApplicationListener extends MultiDexApplication {public string name;//获取一个Application实例public  static ApplicationListener  getInstance(Context context){return  (ApplicationListener)context.getApplicationContext();}public void setName(int arg){name = arg;}public int getName(){return name;}}



定义好这个类之后,我们调用其getinstance方法得到其实例,然后就可以在工程的任何地方对age进行get和set操作。从而实现数据的传递。看起来,这个Application似乎非常好用,既没有大小限制也不会引起内存泄漏。但是,它跟static有一个共同的缺点。可能会被内存回收机制(GC)回收,而再次创建的实例,相关信息已经丢失。在实际开发中如果不注意Application的使用,可能会引起严重的问题。举个栗子。

ApplicationListener.getInstance.getName.Trim();在正常情况下,不会有问题。但是当因内存回收而再次进入创建新的ApplicationListener实例时,getName得到的值将为null,这时候再去trim(),则会空指针异常。所以在用application进行数据传输时一定要注意对象的引用,非空判断总是保证安全性的利器。

这三者有理有弊,在实际开发中,结合使用。


0 0