Android内存监听的方法

Android 系统提供了 ComponentCallbacksComponentCallbacks2 这两个接口让开发者去监听 App 的内存变化 ,其中 ComponentCallbacks2 仅可用于 Api 14 以上的版本。
我们可以在 ApplicationActiviyServiceContentProvider 中重写接口方法来实现内存变化的监听。

ComponentCallbacks2

该接口仅支持 Api 14 以上的版本,是 ComponentCallbacks 的子类,它里面就一个方法和一个源码注解:

public interface ComponentCallbacks2 extends ComponentCallbacks {

    /** @hide */
    @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 {}
    ..........
    void onTrimMemory(@TrimMemoryLevel int level);

onTrimMemory 可以拿到当前内存状态的数据,而 TrimMemoryLevel 注解给内存状态设置了详情的等级,我们来一个一个说明这些等级含义:
App在后台运行时的 level:

TRIM_MEMORY_COMPLETE(80):App 位于后台AppLRU队列尾端,如果app不释放更多内存将会给系统杀死
TRIM_MEMORY_MODERATE(60):App 位于后台AppLRU队列中间位置,应该合理释放更多内存降低给系统杀死的风险
TRIM_MEMORY_BACKGROUND(40):App 刚进入后台AppLRU队列,应该合理释放更多内存降低给系统杀死的风险
TRIM_MEMORY_UI_HIDDEN(20):App 已经切换到后台,用户已经看不到 app 的 UI ,建议释放一些 UI 资源

App 切换到后台后,如果长时间不唤醒就会进入到后台运行的 LRU 队列中,直到最后给系统杀死。

App在前台运行时的 level:

TRIM_MEMORY_RUNNING_CRITICAL(15):App 在前台运行,但是内存紧张,应合理去释放资源避免 OOM
TRIM_MEMORY_RUNNING_LOW(10):App 在前台运行,但是内存很紧张,应合理去释放资源避免 OOM
TRIM_MEMORY_RUNNING_MODERATE(5):App 在前台运行,但是内存非常紧张,,应合理去释放资源避免 OOM

通过 onTrimMemory 方法了解内存的情况就可以及时释放一些不必要的资源,让 App 存活时间更长。

ComponentCallbacks

public interface ComponentCallbacks {

    void onConfigurationChanged(Configuration newConfig);

    void onLowMemory();
}

该接口里面有两个方法,不过现在我们来重点关注里面的 onLowMemory .
onLowMemory 在 App 切换到后台,内存紧张时的回调(此时内存状态等级为 TRIM_MEMORY_COMPLETE ),对比上面的 onTrimMemory 方法,它并没有那么多的具体的等级数据,但是这个方法可以兼容到 Api 14 以下,建议最好在这两个方法里面都写上释放资源的方法。

猜你喜欢

转载自blog.csdn.net/f409031mn/article/details/80726265