通过ComponentCallbacks2来接收onTrimMemory等回调,并mock对应的场景

简介: 通过ComponentCallbacks2来接收onTrimMemory等回调,并mock对应的场景

我们在做app内存不足时,需要做一些内存释放的操作,以避免app卡顿,或者尽可能的延迟app存活时间,减少被系统回收的概率。

如何监听ComponentCallbacks

那么如何监听这些时机呢?系统的Application、Activity、Service和ContentProvider均实现了ComponentCallbacks2接口,我们可以很方便的获取这些时机。除了这些时机之外,我们还可以通过Context#registerComponentCallbacks)来添加自己的监听器。

一般而言我们添加ComponentCallbacks2即可,ComponentCallbacks2不仅有onTrimMemory(@TrimMemoryLevel int level))方法,,它还继承了ComponentCallbacks接口,所以也能监听到系统的onConfigurationChanged(@NonNull Configuration newConfig))和onLowMemory())回调。

在这些回调中,我们可以针对性的做一些释放内存和资源的操作。

ComponentCallbacks2源码:

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 {}

    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);
}

ComponentCallbacks源码:

public interface ComponentCallbacks {

    void onConfigurationChanged(@NonNull Configuration newConfig);

    void onLowMemory();
}

如何mock这些时机呢?

网上那些杀掉进程的操作千篇一律,而且也不能mock所有的时机,所以这里不予采纳。

经过不懈的查找,我找到一个可以mockonTrimMemory(@TrimMemoryLevel int level))方法中所有level的命令,具体格式如下:

adb shell am send-trim-memory <package-name> <level>

e.g.: level可以是常量字符串也可以是对应的数字,跟ComponentCallbacks2.TrimMemoryLevel中的值一一对应

adb shell am send-trim-memory com.tinytongtong.androidstudy MODERATE

或者:

adb shell am send-trim-memory com.tinytongtong.androidstudy 5

level具体映射关系如表格所示:

TrimMemoryLevel level对应的字符串常量 level对应的数字
TRIM_MEMORY_COMPLETE COMPLETE 80
TRIM_MEMORY_MODERATE MODERATE 60
TRIM_MEMORY_BACKGROUND BACKGROUND 40
TRIM_MEMORY_UI_HIDDEN HIDDEN 20
TRIM_MEMORY_RUNNING_CRITICAL RUNNING_CRITICAL 15
TRIM_MEMORY_RUNNING_LOW RUNNING_LOW 10
TRIM_MEMORY_RUNNING_MODERATE RUNNING_MODERATE 5

全部命令的示例:

adb shell am send-trim-memory com.tinytongtong.androidstudy COMPLETE

adb shell am send-trim-memory com.tinytongtong.androidstudy MODERATE

adb shell am send-trim-memory com.tinytongtong.androidstudy BACKGROUND

adb shell am send-trim-memory com.tinytongtong.androidstudy HIDDEN

adb shell am send-trim-memory com.tinytongtong.androidstudy RUNNING_CRITICAL

adb shell am send-trim-memory com.tinytongtong.androidstudy RUNNING_LOW

adb shell am send-trim-memory com.tinytongtong.androidstudy RUNNING_MODERATE

参考

https://stackoverflow.com/questions/3656594/simulate-low-battery-low-memory-in-android

相关文章
|
6天前
|
存储 算法 JavaScript
< 今日小技巧:Axios封装,接口请求增加防抖功能 >
今天这篇文章,主要是讲述对axios封装的请求,由于部分请求可能存在延时的情况。使得接口可能存在会被持续点击(即:接口未响应的时间内,被持续请求),导致重复请求的问题,容易降低前后端服务的性能!故提出给axios封装的配置里面,新增一个防抖函数,用来限制全局请求的防抖。
< 今日小技巧:Axios封装,接口请求增加防抖功能 >
|
10月前
|
前端开发
ajax实战案例:$.when .done .fail实现多接口数据回调
ajax实战案例:$.when .done .fail实现多接口数据回调
33 0
|
6月前
|
前端开发
前端传递参数后端接收不到的坑
前端传递参数后端接收不到的坑
107 0
|
9月前
|
设计模式 Java API
基于Guava API实现异步通知和事件回调
当小伙伴们在社区提问时,如果有设置指定用户回答,则对应的用户就会收到邮件通知,这就是观察者模式的一种应用场景。有些小伙伴可能会想到MQ、异步队列等,其实JDK本身就提供这样的API。我们用代码来还原这样一个应用场景,首先创建GPer类。
76 0
|
12月前
|
前端开发 小程序 Java
小程序不同页面的异步回调,callback和promise的使用讲解
小程序不同页面的异步回调,callback和promise的使用讲解
162 0
|
Dubbo Java 应用服务中间件
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
前些天,一个同事在使用Dubbo的参数回调时,骂骂咧咧的说,Dubbo的这个回调真是奇葩,居然会限制回调次数,自己不得不把callbacks属性值设置的非常大,但是还是会怕服务运行太久后超过回调次数限制,后续的回调就无法正常执行。
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
|
前端开发
模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
154 0
|
前端开发
手写promise自定义封装异步任务回调的执行
手写promise自定义封装异步任务回调的执行