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

相关文章
|
缓存 JavaScript 前端开发
【axios】二次封装——避免重复发送请求
【axios】二次封装——避免重复发送请求
504 0
【axios】二次封装——避免重复发送请求
|
4月前
|
前端开发 JavaScript Java
java实现异步回调返回给前端
综上,Java中实现异步回调并将结果返回给前端是一项涉及后端异步处理和前端交互的综合任务。在实际项目中,开发人员需要根据应用需求和性能预期选择合适的异步模型与工具,并进行适当的配置和优化。
254 3
|
6月前
|
前端开发 开发工具 git
大事件项目15----axios响应拦截器,统一判断401做被动退出
大事件项目15----axios响应拦截器,统一判断401做被动退出
|
7月前
发送同步请求模块
发送同步请求模块
41 1
|
7月前
|
XML JSON 前端开发
学习Ajax使用异步对象发送请求
Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种用于创建更好、更快以及交互性更强的Web应用程序的技术。
75 3
|
7月前
|
前端开发 JavaScript
解决Ajax发送DELETE请求时后台无法接收到参数的问题(Restful风格)
解决Ajax发送DELETE请求时后台无法接收到参数的问题(Restful风格)
206 0
|
Dubbo Java 应用服务中间件
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
前些天,一个同事在使用Dubbo的参数回调时,骂骂咧咧的说,Dubbo的这个回调真是奇葩,居然会限制回调次数,自己不得不把callbacks属性值设置的非常大,但是还是会怕服务运行太久后超过回调次数限制,后续的回调就无法正常执行。
你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
|
前端开发 小程序 Java
小程序不同页面的异步回调,callback和promise的使用讲解
小程序不同页面的异步回调,callback和promise的使用讲解
207 0
|
前端开发
手写promise自定义封装异步任务回调的执行
手写promise自定义封装异步任务回调的执行