WorkManager 与 Low Memory Killer

本文探讨了在引入WorkManager后,如何理解Android的内存管理机制,尤其是Low Memory Killer。WorkManager简化了后台任务处理,但面对Android的Doze模式和电池优化,单纯使用WorkManager可能无法满足某些需求。文章通过分析Service的使用场景,建议在特定情况下结合Service以确保任务执行。同时提到了WorkManager的架构,以及在enqueue work时如何保存工作到数据库。
摘要由CSDN通过智能技术生成

今天在查看bugly的时候,发现了如下错误:

android.app.RemoteServiceException
Context.startForegroundService() did not then call Service.startForeground()

发现是由于WorkManager引起的,原因是由于我们刚刚引入了WorkManager,不想对原来的代码改动太大,所以只是将AlarmManager替换成了WorkManager,然而在启动Service的时候出了问题,虽然这个问题与WorkManager没有太大的关系。

但是我突然想到,既然已经使用了WorkManager,它能保证任务的执行,那为啥还要启动Service呢?不是多次一举吗!

现在我们来从头理一下,为啥我们需要在Service里面启动线程?

Android是基于linux内核的系统,但是它与其他基于linux内核的系统有一个不同之处,就是它没有“交换空间”。

交换空间的作用:当 RAM 满了之后,而系统还需要额外的内存空间,系统会将内存中的相对不经常使用的内存页放入到硬盘上,腾出位置给正在运行的应用程序。

取而代之的,它使用 OOM Killer 来管理内存。

在这里插入图片描述

OOM Killer 的目标是通过基于其“可见性状态”和消耗的内存量来杀死进程来释放内存。

ActivityManager 会给每个进程一个 oom_adj 值,这个值越大,表示该进程的优先级越低。比如,前台进程的优先级就是0。

# Define the oom_adj values for the classes of processes that can be
# killed by the kernel.  These are used in ActivityManagerService.
    setprop ro.FOREGROUND_APP_ADJ 0
    setprop ro.VISIBLE_APP_ADJ 1
    setprop ro.SECONDARY_SERVER_ADJ 2
    setprop ro.BACKUP_APP_ADJ 2
    setprop ro.HOME_APP_ADJ 4
    setprop ro.HIDDEN_APP_MIN_ADJ 7
    setprop ro.CONTENT_PROVIDER_ADJ 14
    setprop ro.EMPTY_APP_ADJ 15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值