今天在查看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