探索 Android 内存优化方法( 八 )


/*
* 把所有能释放的资源都释放了
*/
}
// 应用从系统接收到一个无法识别的内存等级值 , 
// 跟一般的低内存消息提醒一样对待这个事件
else-> {
// 释放所有不重要的数据结构 。
}
}
}
}
12.2 ActivityManager.getMemoryInfo
Android 提供了一个 ActivityManager.getMemoryInfo 方法给我们查询内存信息 , 这个方法会返回一个 ActivityManager.MemoryInfo 对象 , 这个对象包含了系统当前内存状态 , 这些状态信息包括可用内存、总内存以及低杀内存阈值 。
MemoryInfo 中包含了一个 lowMemory 布尔值 , 这个布尔值用于表明系统是否处于低内存状态 。
fundoSomethingMemoryIntensive{
// 在做一些需要很多内存的任务前 , 
// 检查设备是否处于低内存状态、
if(!getAvailableMemory.lowMemory) {
// 做需要很多内存的任务
}
}
// 获取 MemoryInfo 对象
privatefungetAvailableMemory: ActivityManager.MemoryInfo {
valactivityManager = getSystemService(Context.ACTIVITY_SERVICE) asActivityManager
returnActivityManager.MemoryInfo.also { memoryInfo ->
activityManager.getMemoryInfo(memoryInfo)
}
}
13. 还有哪些内存优化技巧?13.1 使用更高效的代码结构13.1.1 谨慎使用 Service
(下面这些内容是我在 Andorid 官网上翻译的 , 从我们的应用角度来说 , 当然希望是应用一直运行 , 这样用户每次打开都不用重新走各种初始化流程 , 但是对于系统来说 , 我们的这种行为伤害挺大的 。)
让一个没用的 Service 在后台运行对于一个应用的内存管理来说是一件最糟糕的事情 。
要在 Service 的任务完成后停止它 , 不然 Service 占用的这块内存会泄漏 。
当你的应用中运行着一个 Service , 除非系统内存不足 , 否则它不会被干掉 。
这就导致对于系统来说 Service 的运行成本很高 , 因为 Service 占用的内存其他的进程是不能使用的 。
Android 有一个缓存进程列表 , 当可用内存减少时 , 这个列表也会随之缩小 , 这就会导致应用间的切换变得很慢 。
如果我们是用 Service 监听一些系统广播 , 可以考虑使用 JobScheduler 。
如果你真的要用 Service , 可以考虑使用 IntentService , IntentService 是 Service 的一个子类 , 在它的内部有一个工作线程来处理耗时任务 , 当任务执行完后 , IntentService 就会自动停止 。
13.1.2 选择优化后的数据容器
Java 提供的部分数据容器并不适合 Android , 比如 HashMap , HashMap 需要中存储每一个键值对都需要一个额外的 Entry 对象 。
Android 提供了几个优化后的数据容器 , 包括 SparseArray、SparseBooleanArray 以及 LongSparseArray 。
SparseArray 之所以更高效 , 是因为它的设计是只能使用整型作为 key , 这样就避免了自动装箱的开销 。
13.1.3 小心代码抽象
抽象可以优化代码的灵活性和可维护性 , 但是抽象也会带来其他成本 。
抽象会导致更多的代码需要被执行 , 也就是需要更多的时间和把更多的代码映射到内存中 。
如果某段抽象代码带来的好处不大 , 比如一个地方可以直接实现而不需要用到接口的 , 那就不用接口 。
13.1.4 使用 protobuf 作为序列化数据
Protocol buffers 是 google 设计的 , 它可以对结构化的数据序列化 , 与 XML 类似 , 不过比 XML 更小 , 更快 , 而且更简单 。
如果你决定使用 protobuf 作为序列化数据格式 , 那在客户端代码中应该使用轻量级的 protobuf 。
因为一般的 protobuf 会生成冗长的代码 , 这样会导致内存增加、APK 大小增加 , 执行速度变慢等问题 。
更多关于 protobuf 的信息可以查看 protobuf readme 中的 “轻量级版本”。
13.2 删除内存消耗大的资源和第三方库
有些资源和第三方库会在我们不知情的情况下大量消耗内存 。
APK 大小 , 第三方库和嵌入式资源 , 会影响我们应用的内存消耗 , 我们可以通过删除冗余和不必要的资源和第三方库来减少应用的内存消耗 。
13.2.1 Apk 瘦身
Bitmap 大小、资源、动画以及第三方库会影响到 APK 的大小 , Android Studio 提供了 R8 和 ProGuard 帮助我们缩小 Apk , 去掉不必要的资源 。


推荐阅读