作为用户,有没有办法让 app“休眠”在内存中,不占用 cpu 但又能快速打开?

2018-03-13 16:31:39 +08:00
 gdtv

为了省电,为了禁止 app 在后台活动,传统方法似乎是将 app 完全关闭,清出内存,包括绿色守护、黑域、冰箱等都是这样吧? 这样虽然可以达到目的,但下次启动的时候就慢了,有没有办法禁止 app 任何后台活动但又将 app 保留在内存中呢? 前提是内存够大。

8287 次点击
所在节点    Android
31 条回复
orangeade
2018-03-13 16:43:01 +08:00
绿色守护,浅度休眠
shihira
2018-03-13 16:43:37 +08:00
kill -SIGSTOP <pid>
creedowl
2018-03-13 18:18:36 +08:00
xposed 应用 应用控制器,设置后台墓碑
Wicked
2018-03-13 18:42:58 +08:00
iOS 好像就是这样?
esbackup
2018-03-13 19:10:53 +08:00
Xposed 模块 Per App Hacking
huclengyue
2018-03-13 19:35:04 +08:00
Android6.0 以上的浅度睡眠
honeycomb
2018-03-13 19:41:09 +08:00
Android8 (实际上是 7 )新加入的后台限制就是干这个的。
5/6 时候就有的 doze 也是干这个的。
iwtbauh
2018-03-13 20:00:48 +08:00
我认为没有必要
因为底层 Linux 内核会进行缓存。App 的字节码和数据启动一次后就会保存在高速缓存中,第二次打开就会直接从内存中使用。
反而使用上面说的“浅度休眠”之类方法,App 仍然会在收到 fcm 推送时被唤醒继续运行,而且在充电时也会保持唤醒
xrui
2018-03-13 20:20:53 +08:00
黑域调成只休眠,应该就可以了。就是激进的浅度休眠
fengleidongxi
2018-03-13 20:38:42 +08:00
安卓 6 以后系统自带
honeycomb
2018-03-14 10:18:35 +08:00
@iwtbauh 希望的是应用在不使用且无需杀进程时以“已缓存进程”的形式在内存里。

而 oreo 的后台限制的作用和这个目的最接近:它会停掉不需要运行的 service 并防止它重新启动,阻止 alarm 等。如此,一个应用的进程里就不会有 service,那么它就比较可能处于“已缓存进程”的状态
iwtbauh
2018-03-14 11:19:40 +08:00
@honeycomb 但是楼主说的是”禁止 app 任何后台活动“,是任何后台活动,据我所知这些限制不会在充电时有效,也不会禁止 fcm 推送
gdtv
2018-03-14 11:29:03 +08:00
@Wicked IOS 确实是的
gdtv
2018-03-14 11:29:17 +08:00
@orangeade 非常感谢,要的就是这个
gdtv
2018-03-14 11:30:00 +08:00
@huclengyue
@honeycomb
@fengleidongxi
我用的是 miui 系统,似乎没有原生系统自带的“浅度睡眠”
gdtv
2018-03-14 11:31:43 +08:00
@honeycomb 对,我想要的就是“以已缓存进程”的形式在内存里”
honeycomb
2018-03-14 11:33:08 +08:00
@iwtbauh

上述 7/8 加入的后台限制( AppOps.RUN_IN_BACKGROUND),用以限制应用进程处于 idle (和它相关的部分没有显示了一段时间,大约一分钟)时,阻止该应用的后台 service 的运行或再次启动。它不受是否处于充电状态的影响。

受充电影响的限制是 doze 与 app standby,其它相关的有:job 可以设定为充电时触发,处于后台白名单,临时白名单时不受(或减少受到) doze/app standby 的影响

接受 gcm 的 play service 在白名单中,所以 doze 是 gcm 也能收到,其中的高优先信息也能拉起其它因为 doze/app standby/RUN_IN_BACKGROUND 应用
honeycomb
2018-03-14 11:35:06 +08:00
@gdtv
miui 的内地版本在编译时就通过一个编译选项禁用了 doze 机制,app standby 机制应该也同时被这个选项所禁用了。
iwtbauh
2018-03-14 11:45:59 +08:00
iwtbauh
2018-03-14 11:49:08 +08:00
@iwtbauh 手抖,接上文

RUN_IN_BACKGROUND 使 manifest 中的广播失效,也就是说**不能**禁止显式注册的广播,也就是说仍然可能会出现后台活动

RUN_IN_BACKGROUND 禁止后台服务,但如果 app 霸占任务栏把服务固定到前台就是无效的。例如 QQ

因此我仍然认为要想达到完全禁止后台运行,必须完全停止 App。

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

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

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

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

© 2021 V2EX