android Application使用见解

Application作为贯穿整个应用的必不可少的一个类,必须要知道它能做什么,有什么缺点。所以,这篇文章主要从Application 源码方面解读

一.Application和Dalvik的关系

一般情况下app只会有一个虚拟机,一个虚拟机只会有一个application,也就是说一个Application只会存在一个Dalvik

还有一个app多进程,就意味着app拥有多个Application,多个Dalvik,Application相互独立,在不同的进程里面,数据不能相互访问

二.Application 与Context的关系

说Application就是是一个Context也是正确的,   application 的父类是 ContextWrapper,  ContextWrapper 的父类是  Context,所以说Application就是context是正确的

三.Application能做什么?

1.因为本质是context,所以context能做得,它都能做,eg: 获取颜色 context.getResroucecontext.getColor等常见的资源获取操作

2.可以获取一个Looper对象,都知道Looper是和Handler有关联的,获取一个Looper对象,可直接通过上下文对象getMainLooper()获取,也就是说,在应用启动的时候,app就一直存在一个Looper对象
在Application父类ContextWrapper里面存在下面这样一个方法:
在这里插入图片描述

3.可以监听所有Activity的生命周期
在Application里面,我们能看到如下接口方法
在这里插入图片描述
是不是和我们的Activity周期一致呢,所以如果想要监听Acitivty生命周期,我们可以写一个MyApplication去继承Application,
如下图
在这里插入图片描述

在这里插入图片描述

4.可以获取内存使用情况
Application实现了一个接口ComponentCallbacks2,在ComponentCallbacks2里面封装了内存Level阈值定义和监听方法,如下

@IntDef(prefix = { "TRIM_MEMORY_" }, value = {
        TRIM_MEMORY_COMPLETE,
        TRIM_MEMORY_MODERATE,
        TRIM_MEMORY_BACKGROUND,
        TRIM_MEMORY_UI_HIDDEN,
        TRIM_MEMORY_RUNNING_CRITICAL,
        TRIM_MEMORY_RUNNING_LOW,
        TRIM_MEMORY_RUNNING_MODERATE,
})

@Retention(RetentionPolicy.SOURCE)
public @interface TrimMemoryLevel {}

static final int TRIM_MEMORY_COMPLETE = 80;
static final int TRIM_MEMORY_MODERATE = 60;
static final int TRIM_MEMORY_BACKGROUND = 40;
static final int TRIM_MEMORY_UI_HIDDEN = 20;
static final int TRIM_MEMORY_RUNNING_CRITICAL = 15;
static final int TRIM_MEMORY_RUNNING_LOW = 10;
static final int TRIM_MEMORY_RUNNING_MODERATE = 5;

void onTrimMemory(@TrimMemoryLevel int level);

在ComponentCallbacks2的父类ComponentCallbacks里面同样有一个低内存监控方法onLowMemory();

当App内存不足的时候,我们可以在Application的TrimMemoryLevel()和onLowMemory()方法中去保存一些我们需要保存的数据、回收一些资源释放内存等

注意:在保存数据的时候,可能Application已经被系统回收了,此时,我们需要做一个非空判断

5.上下文对象
application的生命周期是伴随这个app的,所以,如果有生命周期比较长、且又要引用上下文对象的,最好通过application获取,这样就不会发生内存泄漏等问题

application介绍完了,谢谢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章