android 如何手动触发回收?

2023-02-02 11:33:28 +08:00
 jeesk

领导给个需求,要求应用在内存不足的时候,主动触发 activity 的回收。我们的应用是多窗口模式,类似与微信小程序的多窗口,打开 10 个可能导致内存不足, 这个时候领导非要提个需求,要求在内存不足的时候主动回收 activity, 研究了快 2 天了, 没有一点头绪。

8884 次点击
所在节点    Android
10 条回复
kyuuseiryuu
2023-02-02 11:37:49 +08:00
感觉和各种清理大师的释放内存功能差不多,能做也得 root 权限。
learningman
2023-02-02 11:38:46 +08:00
在应用里开一个 map ,存 activity 的弱引用。
开一个计时器,定时检查剩余的 Runtime freememory ,如果不够了,就用 lru 的淘汰算法从 map 里挑一个出来,finish 掉
jeesk
2023-02-02 11:43:02 +08:00
@learningman 老大并不想窗口关闭掉。 比如有 3 个窗口,现在内存不够用了, 暂时把后台的 2 个窗口先回收内存, 窗口得保留着,进去还得重新打开内容。
learningman
2023-02-02 12:08:42 +08:00
@jeesk 保存状态自动恢复呗
learningman
2023-02-02 12:12:28 +08:00
比如弄个空 activity 当 stub 用来保持窗口,显示内容用 fragment 来处理,内存不够就序列化一下存硬盘。
如果连 10 个空 activity 的内存都不够,那不可能保持窗口。
zhanglihow
2023-02-02 16:01:08 +08:00
主要看你 activity 用了什么东西,导致内存不足,bitmap 之类的?直接回收,要用再生成
yawenimy122
2023-02-02 16:10:47 +08:00
有用户用这么耗性能的 app 吗?
jeesk
2023-02-02 16:13:27 +08:00
@yawenimy122 这个你不用管? 反正内存绝对是不够用的。
ChenStyle
2023-02-02 16:35:18 +08:00
Android 系统自动都有 LRU 回收的,不用做特别的吧。
不然你就手动用 LRU 管理一下呗。在 application 里面做一个 Activity 的 List ,然后分配手机的部分内存,触发了就直接 Activity finish 就行了。
jeesk
2023-02-02 17:57:35 +08:00
@ChenStyle finish 早做了。 今天测试了一下,平均每个窗口 23m 的内存,节约不到多少。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/912517

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX