onTrimMemory
是 Android 中的一个回调方法,用于帮助应用在系统内存紧张时进行内存管理和优化。这个方法定义在 ComponentCallbacks2
接口中,几乎所有的应用组件(如 Activity
、Service
、Application
)都实现了这个接口,因此你可以在这些组件中重写该方法。
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
方法,可以有效减少应用的内存占用,提升系统的整体性能和稳定性。