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

时间:2018-10-04 13:05:23

标签: android service android-8.0-oreo

我有一个应用程序,要求用户登录并显示活动。还会在标牌上启动一项服务,该服务使用位置管理器来跟踪其当前位置。 一切正常,直到应用程序处于待机状态(在后台关闭应用程序超过1小时)

如何防止这种情况?

据我了解,如果我正在运行前台服务,则操作系统不应终止该应用程序。那么,我在做什么错呢? 我正在测试的操作系统是Oreo

在登录时启动服务:

startService(intent);

服务:

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);
        }

我添加了关于销毁活动和服务功能的日志记录,以检测何时发生这种情况,但是这种情况发生时永远不会写入日志(当然,在销毁应用程序的情况下通常会进入日志记录)

2 个答案:

答案 0 :(得分:6)

根据Android Processes and Application Lifecycle Documentation

  

[...] Android的一个不寻常的基本特征是应用程序   流程的生命周期不受应用程序直接控制   本身。而是由系统通过组合确定   系统知道正在运行的应用程序部分,如何   这些东西对用户很重要,总的内存是多少   在系统中可用。

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

但是

  

[...]长时间运行的服务(例如30   分钟或更长的时间)可能会被降级,以允许其处理程序   放到下面描述的缓存的LRU列表中。这有助于避免   长时间运行的服务带有内存泄漏或其他情况   问题消耗了太多的内存,以至于阻止了系统   有效使用缓存的进程。

,所以您不能确定该进程不会被操作系统杀死。

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

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

答案 1 :(得分:0)

如果您有活动的服务,则应该不会遇到此问题。

请参见here

  

前台流程是用户所需的流程   正在做。各种应用程序组件可能导致其   包含过程以不同方式被视为前台。一种   如果出现以下任何情况,则认为该过程处于前台   条件成立:

     

它正在与用户进行交互的屏幕顶部运行一个Activity(已调用其onResume()方法)。   它具有当前正在运行的BroadcastReceiver(正在执行其BroadcastReceiver.onReceive()方法)。   它具有一个服务,该服务当前正在其回调之一(Service.onCreate(),Service.onStart()或   Service.onDestroy())。

     

系统中只会有一些这样的过程,而这些   如果内存不足以至于没有   这些过程可以继续运行。通常,在这一点上,   设备已达到内存分页状态,因此需要执行此操作   为了使用户界面保持响应状态。

看看这个answer。 在杀死时检测是否在前台。