Android Application类的详细介绍
android application类详解:
android中application类的详细解释:
我们在平时的开发中,有时候可能会需要一些全局数据,来让应用中的所有activity和view都能访问到,大家在遇到这种情况时,可能首先会想到自己定义一个类,然后创建很多静态成员。
但是这种方法不符合android的框架架构,不过andorid已经为我们提供了这种情况的解决方案:在android中,有一个名为application的类,我们可以在activity中使用getapplication(),方法来获得,它是代表我们的应用程序的类,使用它可以获得当前应用的主题,资源文件中的内容等,这个类更灵活的一个特性就是可以被我们继承,来添加我们自己的全局属性。让整个app的activity和view都能访问到。
1.概念:
android系统会为每个程序运行时创建一个application类的对象且仅创建一个,所以application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的activity,service中获得的对象都是同一个对象。所以通过application来进行一些,数据传递,数据共享,数据缓存等操作。
2.作用:
(1).application是一个基类,这个基类的作用是获取整个app的状态,我们需要自己定义一个类来继承这个基类。
(2).定义一些全局的和一些上下文都要用到的变量和方法。
3.优点:
(1).继承的方式:
生命周期随着应用程序的销毁而销毁。
(2).静态类或静态方法:
程序退出后该类或者变量不能立刻被gc回收。
当你再次进入后会发现该静态类保存的信息状态是之前的。有可能会导致程序不是你想要的初始化状态。
(3).app的进程被创建时,这个类就会被实例化,oncreate()方法就会被执行,给所有全局变量赋初期值。这样,所有的activity就共同拥有这个类里面的变量了。
4.getcontext()、getapplication()、getapplicationcontext()、getactivity()的区别:
(1).getcontext():获取到当前对象的上下文。
(2).getapplication():获得application的对象
(3).getapplicationcontext():获得应用程序的上下文。有且仅有一个相同的对象。生命周期随着应用程序的摧毁而销毁。就像是社会,所有的都发生在这个社会上,仅且只有一个社会。每个activity都有自己的上下文,而整个应用只有一个上下文
(4)getactivity():获得fragment依附的activity对象。fragment里边的getactivity()不推荐使用原因如下:这个方法会返回当前fragment所附加的activity,当fragment生命周期结束并销毁时,getactivity()返回的是null,所以在使用时要注意判断null或者捕获空指针异常。所以只要判断getactivity()为空,就可以不再执行下面的代码,这完全不影响业务的使用。
5.应用程序创建context实例的情况有如下几种情况:
(1).创建application对象时,而且整个app共一个application对象
(2).创建service对象时
(3).创建activity对象时。
activity service application都是context的子类。context是一个抽象类,具体的实现是在contextimpl类中。因此应用程序app共有的context数目公式为:
总context实例个数=service个数+activity个数+1(application对应的context实例)
6.android应用中内存泄漏问题:
(1).对context持有一个过长的引用。对context的引用超过它本身的生命周期。android应用程序限制使用的堆内存是16m
(2).静态变量拥有了更多的对象引用,内存仍然不会被销毁。
总结一下:避免context泄漏应该注意的问题:
1.使用application这种context类型
2.注意对context的引用不要超过它本身的生命周期
3.谨慎使用static关键字
4.context里如果有线程,一定要在ondestory()里及时停掉。
感谢阅读,希望能帮助到大家谢谢大家对本站的支持!
推荐阅读
-
Android Application类的详细介绍
-
详细介绍基于MySQL的搜索引擎MySQL-Fullltext
-
Android 通过Intent使用Bundle传递对象详细介绍
-
Android开发中类加载器DexClassLoader的简单使用讲解
-
详解Android中用于线程处理的AsyncTask类的用法及源码
-
Android应用中使用SharedPreferences类存储数据的方法
-
ADO.NET无连接模式的详细介绍
-
Android中通过AsyncTask类来制作炫酷进度条的实例教程
-
Android基础总结篇之三:Activity的task相关介绍
-
ANDROID中使用VIEWFLIPPER类实现屏幕切换(关于坐标轴的问题已补充更改)