通过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

相关文章
|
3月前
|
JavaScript 前端开发 数据安全/隐私保护
如何使用request-promise在发送请求时使用代理?
以上方法演示了如何在发送请求时使用 `request-promise`结合代理服务,适用于需要通过代理访问网络资源的场景。
66 0
|
5月前
|
存储 前端开发 JavaScript
中间件回调和Promise
【6月更文挑战第18天】
36 1
|
Dubbo Java 应用服务中间件
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
前些天,一个同事在使用Dubbo的参数回调时,骂骂咧咧的说,Dubbo的这个回调真是奇葩,居然会限制回调次数,自己不得不把callbacks属性值设置的非常大,但是还是会怕服务运行太久后超过回调次数限制,后续的回调就无法正常执行。
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
|
前端开发 小程序 Java
小程序不同页面的异步回调,callback和promise的使用讲解
小程序不同页面的异步回调,callback和promise的使用讲解
203 0
|
前端开发
封装axios实现自动重试
因为之前写的一个 Node 程序有点小问题,使用的 axios 通过代理请求数据,代理服务器(阿布云)时不时抽风(407、413、503)。 因为第一次写的时候当做一个 DEMO 去实现的,写的挺简陋,只能说大体功能对,但是没有容错机制。 这里我们先算一笔帐啊,一次请求等于 1+100 次,因为我内部还会请求好多数据。 如果只是第一次失败了,那么无关紧要,大不了重发一次。 但是如果是后面 100 次中有极个别暴雷了,那么就会导致整个101次请求全部作废。 好了,为什么实现这个功能说了,那么我们要我们要开始实现了。
720 0
封装axios实现自动重试
|
前端开发
模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
172 0
|
Java
【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
194 0
【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
【EventBus】事件通信框架 ( 发送事件 | 根据事件类型获取订阅者 | 调用订阅方法 )
136 0
|
Java API 开发工具
测试离线消息的接收以及回调的注册
1. 离线消息接收需要哪些条件. 2. 为什么有时候离线消息不能进全局回调.
319 0
测试离线消息的接收以及回调的注册