在2011年做的一个iptv项目中就接触了这个Application类,虽用起来简单,但还是有些需要注意的地方。空闲之余,总结如下:
android系统为每个程序运行时创建一个Application类的对象,且application对象的生命周期就等于这个程序的生命周期。因为它是全局的,单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。
通常我们不需要指定一个Application,系统会自动帮我们创建。如果需要创建自己的Application,只需创建一个类继承 Application并在manifest的application标签中进行注册(在Application标签增加个name属性,并赋值自定义的 Application类的名字)。
Activity间的数据传递,通常的作法是使用Intent.putExtra(),让Intent携带,或者有一个Bundle把信息加入Bundle让Intent推荐Bundle对象,实现传递。但这样作有一个问题,Intent和Bundle所能携带的数据类型都是一些基本的数据类型,如果想实现复杂的数据传递就比较麻烦了,通常需要实现 Serializable或者Parcellable接口。这其实是Android的一种IPC数据传递的方法。如果两个Activity在同一个进程当中,为什么还要这么麻烦呢?只要把需要传递的对象的引用传递过去就可以了。那用什么办法把对象的引用传递过去呢?
这时使用自定义的Application类就是一个非常不错的选择。在Application类中定义一个Object类的引用,把对象赋值给这个引用,这样在整个进程中就能得到该对象的引用了,使用的时候向下转型就行了。
需要注意的地方:
Application如果保存了一些不该保存的对象将导致内存泄漏,最好在使用完之后把相应的引用赋值为空。
通常使用application分以下几个步骤:
1.定义一个类去继承系统的Application
public class MyApplication extendsApplication{
}
在onCreat中做一些初始化工作,设置全局中要使用到的成员变量(一般都会设置对应的get和set方法)
2.在AndroidManifest.xml中进行配置
在 application节点:
<application
android:name="xxx.MyApplication" //类的全路径即完整的包名+类名
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
3.在需要的地方直接使用(Activity、Service等)
MyApplication application;
application = (MyApplication)getApplication(); //将当前的上下文拆箱转为我们自定义的application
这个时候我们就可以使用MyApplication中我们定义的属性了
例如在service我们不断的去定位,此时的location我们既需要最新的数据同时其它的
组件要能及时获取最新的location,我们在sevice中 application.setLastLocation(l);,通过这句话我们设置好了一个全局的location,每当location定位变化的时候,都会重新设置该值。在其它组件,我们通过application.getLastLocaton()即可获取了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)