美文网首页
通过ComponentCallbacks2来接收onTrimMe

通过ComponentCallbacks2来接收onTrimMe

作者: tinyvampirepudg | 来源:发表于2021-04-30 15:05 被阅读0次

我们在做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

相关文章

  • 通过ComponentCallbacks2来接收onTrimMe

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

  • android 监听SD卡状态变化

    监听SD卡状态变化 通过广播接收者来实现 一个广播可以接收多个

  • ComponentCallbacks2接口简介

    ComponentCallbacks2接口扩展自ComponentCallbacks回调接口,用以实现更细粒度的内...

  • Redis集群-消息

    集群中的各个节点通过发送和接收消息(message)来进行通信,我们称发送消息的节点为发送者(sender),接收...

  • iptables学习(2)

    端口 各主机之间通过TCP/IP传送接收数据包,目的主机把接收到的数据包传送给特定的进程就是通过端口来实现。一台拥...

  • Glide总结

    Glide中实现了ComponentCallbacks2,并注册,所以glide可以在系统内存紧张时,回调appl...

  • 后台数据传输校验

    接收数据 提倡使用restful风格的url。 通过提交的方式和资源来确定你要执行的功能;通过返回的状态码来确定执...

  • 四 组件间的通讯

    组件都是独立封闭的props主要的作用和功能就是接收传递给组件的数据,只读不能修改传递数据都是通过属性来传递 接收...

  • 【Android】广播的原理及实现步骤

    1. 广播 1.1 原理 发送方和接收方通过 AMS(Activity Manager Service) 来进行交...

  • Android Broadcast

    广播的发送:通过intent; 广播的接收:通过广播接收者(Broadcast Receiver) 广播的分类:无...

网友评论

      本文标题:通过ComponentCallbacks2来接收onTrimMe

      本文链接:https://www.haomeiwen.com/subject/qzbnrltx.html