1.记得关闭启动的服务
当服务中的任务完成后,要记得停止该服务,可以考虑使用IntentService,
因为IntentService 在完成任务后会自动停止
2.UI不可见时释放资源
①在onStop()中关闭网络连接、注销广播接收器、释放传感器等资源
②在onTrimMemory() 回调方法中监听TRIM_MEMORY_UI_HIDDEN 级别的信
号,此时可在 Activity 中释放 UI 使用的资源,大符减少应用占用的内存
从而避免被系统清除出内存
3.内存紧张时释放资源
运行中的程序,如果内存紧张,会在 onTrimMemory(int level) 回调方法
中接收到以下级别的信号:
TRIM_MEMORY_RUNNING_MODERATE:系统可用内存较低,正在杀掉 LRU缓
存中的进程,你的进程正在运行,没有被杀掉的危险
TRIM_MEMORY_RUNNING_LOW:系统可用内存更加紧张,程序虽然暂没有被
杀死的危险,但是应该尽量释放一些资源,以提升系统的性能(这也会直接
影响你程序的性能)
TRIM_MEMORY_RUNNING_CRITICAL:系统内存极度紧张,而LRU缓存中的
大部分进程已被杀死,如果仍然无法获得足够的资源的话,接下来会清理掉
LRU 中的所有进程,并且开始杀死一些系统通常会保留的进程,比如后台运
行的服务等
当程序未在运行,保留在 LRU 缓存中时, onTrimMemory(int level) 中
会返回以下级别的信号:
TRIM_MEMORY_BACKGROUND:系统可用内存低,而你的程序处在LRU的顶端
端因此暂时不会被杀死,但是此时应释放一些程序再次打开时比较容易恢复
的UI资源
TRIM_MEMORY_MODERATE:系统可用内存低,程序处于 LRU的中部位置,
如果内存状态得不到缓解,程序会有被杀死的可能
TRIM_MEMORY_COMPLETE:系统可用内存低,你的程序处于LRU尾部,如果
系统仍然无法回收足够的内存资源,你的程序将首先被杀死。此时应释放无
助于恢复程序状态的所有资源
注:该API在版本 14 中加入。旧版本的onLowMemory()方法,大致相当于
onTrimMemory(int level)中接收到 TRIM_MEMORY_COMPLETE 级别的
信号。
另:尽管系统主要按照 LRU 中顺序来杀进程,不过系统也会考虑程序占用
的内存多少,那些占用内存高的进程有更高的可能性会被首先杀死。
4.确定你的程序应该占用多少内存
可以通过getMemoryClass()来获取你的程序被分配的可用内存,以M为单位
可以通过在 <application> 标签下将 largeHeap 属性设为 true 来要求
更多的内存,这时通过 getLargeMemoryClass() 方法来获取可用内存
大部分应用程序不需要使用此功能,因此使用该标签前,确认你的程序是否真
的需要更多内存。使用更多内存会对整个系统的性能产生影响,而且当程序进
入LRU时会更容易首先被系统清理掉
5.正确使用 Bipmap,避免浪费内存
6.使用ProGuard
使用 ProGuard 移除无用的代码并重命名一些类、字段、方法等,使你的代码
更紧凑,节省内存空间
7.使用 zipalign
zipaligned 对最终打包的 apk进行字节对齐
注:Google Play 不接受未对齐过的apk
当服务中的任务完成后,要记得停止该服务,可以考虑使用IntentService,
因为IntentService 在完成任务后会自动停止
2.UI不可见时释放资源
①在onStop()中关闭网络连接、注销广播接收器、释放传感器等资源
②在onTrimMemory() 回调方法中监听TRIM_MEMORY_UI_HIDDEN 级别的信
号,此时可在 Activity 中释放 UI 使用的资源,大符减少应用占用的内存
从而避免被系统清除出内存
3.内存紧张时释放资源
运行中的程序,如果内存紧张,会在 onTrimMemory(int level) 回调方法
中接收到以下级别的信号:
TRIM_MEMORY_RUNNING_MODERATE:系统可用内存较低,正在杀掉 LRU缓
存中的进程,你的进程正在运行,没有被杀掉的危险
TRIM_MEMORY_RUNNING_LOW:系统可用内存更加紧张,程序虽然暂没有被
杀死的危险,但是应该尽量释放一些资源,以提升系统的性能(这也会直接
影响你程序的性能)
TRIM_MEMORY_RUNNING_CRITICAL:系统内存极度紧张,而LRU缓存中的
大部分进程已被杀死,如果仍然无法获得足够的资源的话,接下来会清理掉
LRU 中的所有进程,并且开始杀死一些系统通常会保留的进程,比如后台运
行的服务等
当程序未在运行,保留在 LRU 缓存中时, onTrimMemory(int level) 中
会返回以下级别的信号:
TRIM_MEMORY_BACKGROUND:系统可用内存低,而你的程序处在LRU的顶端
端因此暂时不会被杀死,但是此时应释放一些程序再次打开时比较容易恢复
的UI资源
TRIM_MEMORY_MODERATE:系统可用内存低,程序处于 LRU的中部位置,
如果内存状态得不到缓解,程序会有被杀死的可能
TRIM_MEMORY_COMPLETE:系统可用内存低,你的程序处于LRU尾部,如果
系统仍然无法回收足够的内存资源,你的程序将首先被杀死。此时应释放无
助于恢复程序状态的所有资源
注:该API在版本 14 中加入。旧版本的onLowMemory()方法,大致相当于
onTrimMemory(int level)中接收到 TRIM_MEMORY_COMPLETE 级别的
信号。
另:尽管系统主要按照 LRU 中顺序来杀进程,不过系统也会考虑程序占用
的内存多少,那些占用内存高的进程有更高的可能性会被首先杀死。
4.确定你的程序应该占用多少内存
可以通过getMemoryClass()来获取你的程序被分配的可用内存,以M为单位
可以通过在 <application> 标签下将 largeHeap 属性设为 true 来要求
更多的内存,这时通过 getLargeMemoryClass() 方法来获取可用内存
大部分应用程序不需要使用此功能,因此使用该标签前,确认你的程序是否真
的需要更多内存。使用更多内存会对整个系统的性能产生影响,而且当程序进
入LRU时会更容易首先被系统清理掉
5.正确使用 Bipmap,避免浪费内存
6.使用ProGuard
使用 ProGuard 移除无用的代码并重命名一些类、字段、方法等,使你的代码
更紧凑,节省内存空间
7.使用 zipalign
zipaligned 对最终打包的 apk进行字节对齐
注:Google Play 不接受未对齐过的apk