待机模式下,前台应用程序在约1小时后被操作系统杀死。

7
我有一个应用程序,用户被要求登录后会看到一个活动页面。在登录时还会启动一个服务,该服务使用位置管理器跟踪用户的当前位置。一切都很完美,直到应用程序处于待机模式(屏幕关闭并且应用程序在后台超过约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);
        }

我在activity和service的destroy函数中添加了日志记录,以便检测其何时被销毁,但是当出现这种情况时,日志从未被写入(当然,在销毁应用程序时会进入正常情况)。

请查看以下链接:https://forums.androidcentral.com/samsung-galaxy-s5/574211-android-silently-killing-my-apps-how-do-i-stop.html - Jitesh Mohite
此外,请提供您的设备和设备版本。此外,请提供您的设备和设备版本。 - Jitesh Mohite
使用 startForegroundService 适用于 API 26 及以上版本,更多信息请查看此处,https://developer.android.com/reference/android/content/Context#startForegroundService(android.content.Intent)。 - Jeel Vankhede
@JeelVankhede 我已经尝试过使用这个方法,但是由于我在服务的oncreate中使用了startForground,所以它具有相同的行为。 - Rashad.Z
@jiteshmohite 我测试的设备是华为Y7价格和三星S8。 - Rashad.Z
2个回答

7
根据Android进程和应用程序生命周期文档, Android 的一个不寻常且基本的特点是应用程序进程的生命周期并非由应用程序本身直接控制。相反,它是通过系统通过应用程序的一些部分(系统知道正在运行的这些部分)、这些部分对用户的重要性以及系统中可用的总内存的组合来确定的。 前台服务应该处于重要性层次结构的顶部,决定在内存不足时应该杀死哪些进程。
然而,
长时间运行的服务(例如30分钟或更长时间)可能会降低其重要性,以允许其进程降级到下面描述的缓存 LRU 列表。这有助于避免非常长时间运行的服务具有内存泄漏或其他问题,消耗了太多的 RAM,从而阻止系统有效地使用缓存进程。 因此,您不能确定进程不会被操作系统杀死。

以下是我采取的一些预防措施:

  • 将应用程序添加到“受保护应用程序”列表中(某些手机如华为等可用)。
  • 限制前台服务中资源的使用。例如,执行定期蓝牙扫描的进程比强烈使用 GPS 的进程更不容易被杀死。
  • 避免向用户发送过多通知,尤其是不要使用 PowerManager.Wake Lock。

感谢您的回答。我使用的服务定期检索GPS和网络位置,所以我猜这是一些重活,操作系统在一段时间后会杀死它。但令我困惑的是,即使在背景中运行了一个小时,音乐应用程序也没有被操作系统销毁。这不也被认为是重活吗? - Rashad.Z
1
很遗憾,我没有答案。我曾经开发过一个同时使用蓝牙和GPS的应用程序。禁用本地化功能后,服务从未被杀死。否则,启用GPS并禁用蓝牙扫描后,服务将在几个小时后被杀死。我认为使用GPS对服务分类有负面影响。我只在一些设备上发现了这种行为(例如Huawei、小米)。在其他设备上(例如三星、Nexus),服务始终正常工作。 - Andrea Scalabrini

0

如果您有一个活动服务,您不应该遇到这个问题。

请参见此处

前台进程是指用户当前正在使用的必需进程。各种应用程序组件可以以不同的方式使其所在的进程被视为前台进程。如果满足以下任一条件,则将进程视为前台进程:

它正在运行屏幕顶部的 Activity,并且用户正在与之交互(已调用其 onResume() 方法)。 它具有当前正在运行的 BroadcastReceiver(其 BroadcastReceiver.onReceive() 方法正在执行)。 它具有当前正在执行代码的 Service 中的回调之一(Service.onCreate()、Service.onStart() 或 Service.onDestroy())。

系统中只会有少数这样的进程,只有在内存非常低且甚至这些进程也无法继续运行时,才会最后采取杀死它们的措施。通常,在这一点上,设备已经达到了内存分页状态,因此需要采取此操作以保持用户界面的响应性。

看一下这个答案。在杀死时检测是否在前台。


我已经完成了这个任务,并且还在该活动的销毁函数中添加了日志记录,但是当此问题发生时,该函数从未被执行(当然,在正常情况下关闭应用程序时会执行)。 - Rashad.Z
这是发生在特定手机上还是多个手机上?您能监视和记录手机内存使用情况,以查看在您被杀死之前手机的状态吗? - Itamar Kerbel
我将使用分析器监视内存使用情况。 - Rashad.Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接