美文网首页
不分类知识-Application类解析

不分类知识-Application类解析

作者: 唔笛plk | 来源:发表于2019-08-02 13:52 被阅读0次

    1、概念:

    Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享,数据缓存等操作。

    2、作用:

    • Application是一个基类,这个基类的作用是获取整个App的状态,我们需要自己定义一个类来继承这个基类。
    • 定义一些全局的和一些上下文都要用到的变量和方法。

    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、Application类的方法:

    • onCreate()方法
      在Application创建的时候调用,一般用于初始化一些东西,如全局的对象,环境的配置等。
    • onConfigurationChanged(Configuration newConfig)方法
      重写此方法可以监听APP一些配置信息的改变事件(如屏幕旋转等),当配置信息改变的时候会调用这个方法。在Manifest文件下的Activity标签(注意是Activity)里配置android:configChanges属性相应的配置属性,会使Activity在配置改变时候不会重启,只会执行onConfigurationChanged()方法。如:android:configChanges="keyboardHidden|orientation|screenSize"属性可以使Activity旋转时不重启。
      -onLowMemory()方法
      重写此方法可以监听Android系统整体内存较低时候的事件。按我的理解就是,当APP处于前台时,但是所有后台程序都被kill光了,但是还是内存不足时,系统就会调用这个方法告诉APP,兄弟轮到你了。我们可以在这个方法里面释放一些不重要的资源,来保证到时候内存足够而让APP进程不被系统杀掉,或者提醒用户清一下垃圾,让内存清一点空位出来,我的手机老是这样提示我,不知道是不是这个方法惹的祸。
    • onTrimMemory(int level)方法
      传入level等级,等级越高内存需求越紧张
    • onTerminate()方法
      这个方法在程序结束的时候会调用。但是这个方法只用于Android仿真机测试的时候,在Android产品机是不会调用的。所以这个方法并没什么用。
    • registerActivityLifecycleCallbacks()和unregisterActivityLifecycleCallbacks()
      这两个方法用于注册或者注销对APP内所有Activity的生命周期监听,当APP内Activity的生命周期发生变化的时候就会调用ActivityLizfecycleCallbacks里面的方法:
    • registerComponentCallbacks()和unregisterComponentCallbacks()方法
      用于注册和注销ComponentCallbacks2回调接口,里面的方法前面已经介绍过,看名字就知道:

    6、Android应用中内存泄漏问题:

    (1).对Context持有一个过长的引用。对Context的引用超过它本身的生命周期。Android应用程序限制使用的堆内存是16M
    (2).静态变量拥有了更多的对象引用,内存仍然不会被销毁。

    7、总结一下:避免Context泄漏应该注意的问题:

    1.使用Application这种Context类型
    2.注意对Context的引用不要超过它本身的生命周期
    3.谨慎使用static关键字
    4.Context里如果有线程,一定要在onDestory()里及时停掉。

    相关文章

      网友评论

          本文标题:不分类知识-Application类解析

          本文链接:https://www.haomeiwen.com/subject/hyqirctx.html