Android 中的onTrimMemory

onTrimMemory 是 Android 中的一个回调方法,用于帮助应用在系统内存紧张时进行内存管理和优化。这个方法定义在 ComponentCallbacks2 接口中,几乎所有的应用组件(如 ActivityServiceApplication)都实现了这个接口,因此你可以在这些组件中重写该方法。

onTrimMemory 方法详解

方法定义
@Override
public void onTrimMemory(int level) {
    super.onTrimMemory(level);
    // 根据 level 处理内存优化逻辑
}
参数
  • level:一个整数,表示系统内存的紧张程度。可以是以下值之一:

内存级别常量

TRIM_MEMORY_COMPLETE
  • :15
  • 说明:系统处于低内存状态,正在运行的进程将被清理。应该尽可能释放所有不必要的资源。
TRIM_MEMORY_MODERATE
  • :10
  • 说明:系统内存不足,后台进程可能会被杀死。释放中等优先级的资源。
TRIM_MEMORY_BACKGROUND
  • :40
  • 说明:应用不在前台运行,应该释放容易恢复的资源。
TRIM_MEMORY_UI_HIDDEN
  • :20
  • 说明:应用的所有 UI 都不可见。释放与 UI 相关的资源。
TRIM_MEMORY_RUNNING_CRITICAL
  • :15
  • 说明:系统内存极低,正在运行的进程面临被杀死的风险。释放所有不必要的资源。
TRIM_MEMORY_RUNNING_LOW
  • :10
  • 说明:系统内存较低,释放一些非必要资源。
TRIM_MEMORY_RUNNING_MODERATE
  • :5
  • 说明:系统内存充足但不多。可以考虑释放一些资源。

优化策略

在不同的内存级别下,应用可以采取不同的优化策略,以减少内存使用:

1. TRIM_MEMORY_COMPLETE 和 TRIM_MEMORY_RUNNING_CRITICAL
  • 策略:释放所有不必要的内存,包括缓存、Bitmap、数据库连接等。

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
            clearCache();
            releaseBitmaps();
            closeDatabaseConnections();
        }
    }
    
    private void clearCache() {
        // 清理缓存
    }
    
    private void releaseBitmaps() {
        // 释放 Bitmap 资源
    }
    
    private void closeDatabaseConnections() {
        // 关闭数据库连接
    }
    
2. TRIM_MEMORY_MODERATE 和 TRIM_MEMORY_RUNNING_LOW
  • 策略:释放中等优先级的资源,如一些缓存数据、临时对象等。

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
            clearSomeCache();
        }
    }
    
    private void clearSomeCache() {
        // 清理部分缓存数据
    }
    
3. TRIM_MEMORY_BACKGROUND 和 TRIM_MEMORY_UI_HIDDEN
  • 策略:释放与 UI 相关的资源,如不再显示的 View、Activity 等。

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) {
            releaseUIResources();
        }
    }
    
    private void releaseUIResources() {
        // 释放 UI 相关资源
    }
    
4. TRIM_MEMORY_RUNNING_MODERATE
  • 策略:可以适当释放一些资源,但不必过于激进。

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE) {
            releaseModerateResources();
        }
    }
    
    private void releaseModerateResources() {
        // 释放中等程度的资源
    }
    

示例:在 Application 中实现 onTrimMemory

public class MyApp extends Application {
    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        
        switch (level) {
            case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN:
                // 释放与 UI 相关的资源
                releaseUIResources();
                break;

            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW:
            case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL:
                // 释放一些缓存资源
                clearCache();
                break;

            case ComponentCallbacks2.TRIM_MEMORY_COMPLETE:
                // 释放所有不必要的资源
                clearAllResources();
                break;

            default:
                // 其他级别的处理
                break;
        }
    }

    private void releaseUIResources() {
        // 释放与 UI 相关的资源
    }

    private void clearCache() {
        // 清理缓存
    }

    private void clearAllResources() {
        // 释放所有不必要的资源
    }
}

最佳实践

  • 优先释放缓存数据:缓存数据通常是容易恢复的,因此可以优先考虑释放缓存。
  • 避免不必要的对象持有:确保不再需要的对象能够被垃圾回收,避免长时间持有不必要的对象。
  • 延迟加载资源:对于一些大资源(如图片、视频),可以使用延迟加载的方式,仅在需要时加载,使用后尽早释放。

通过合理使用 onTrimMemory 方法,可以有效减少应用的内存占用,提升系统的整体性能和稳定性。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬_小彬

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值