在待机模式下约1小时后,OS会杀死前台应用程序

Ras*_*d.Z 7 service android android-8.0-oreo

我有一个应用程序,要求用户登录然后呈现活动.还在登录上启动服务,该服务使用位置管理器来跟踪其当前位置.一切都运行正常,直到应用程序处于待机模式(在背景中关闭应用程序超过约1小时)

我怎么能阻止这个?

据我所知,如果我有一个前台服务运行,操作系统不应该杀死应用程序..所以我做错了什么?我正在测试的操作系统是奥利奥

登录时启动服务:

startService(intent);
Run Code Online (Sandbox Code Playgroud)

服务:

public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

@Override
    public void onCreate() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification notification = updateNotificationContent(); // the service notification
            if (notification == null)
                stopSelf();
            startForeground(id, notification);
        }
Run Code Online (Sandbox Code Playgroud)

我添加了日志记录来销毁活动和服务的功能以检测何时发生这种情况但是当这种行为发生时从未写入日志(当然,当我销毁应用程序时它会进入正常情况)

And*_*ini 7

根据Android进程和应用程序生命周期文档

[...] Android的一个不寻常的基本特征是应用程序进程的生命周期不是由应用程序本身直接控制的.相反,它由系统通过系统知道正在运行的应用程序部分的组合,这些事物对用户的重要性以及系统中可用的总体内存量来确定.

前台服务应位于重要性层次结构的顶部,以确定在内存不足时应该杀死哪些进程.

然而,

[...]已经运行了很长时间(例如30分钟或更长时间)的服务可能会降级,以允许其进程下降到下面描述的缓存LRU列表.这有助于避免出现内存泄漏或其他问题的长时间运行服务占用大量RAM而导致系统无法有效使用缓存进程的情况.

因此您无法确定该进程是否未被操作系统杀死.

一些对我有用的预防措施:

  • 将应用程序添加到"受保护的应用程序"列表中(在某些手机中可用,如Huaweii).
  • 限制前台服务中资源的使用.例如,执行周期性蓝牙扫描的过程比使用gps的过程更不容易被杀死.
  • 避免向用户发送过多通知,最重要的是不要使用PowerManager.Wake Lock