代码之家  ›  专栏  ›  技术社区  ›  Rashad.Z

前台应用在待机状态下约1小时后被操作系统杀死

  •  6
  • Rashad.Z  · 技术社区  · 6 年前

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

    据我所知,如果我有一个前台服务运行,操作系统不应该杀死应用程序。。那我做错什么了?

    登录时启动服务:

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

    我添加了loggin-on-destroy活动和服务的功能来检测何时发生这种情况,但是当这种行为发生时,日志永远不会被写入(当然,在正常情况下,当我销毁应用程序时,它会进入)

    2 回复  |  直到 6 年前
        1
  •  7
  •   Andrea Scalabrini    6 年前

    根据 Android Processes and Application Lifecycle Documentation

    进程的生存期不受应用程序的直接控制 它自己。相反,它是由系统通过组合来确定的 在系统知道的应用程序正在运行的部分中,如何 在系统中可用。

    前台服务 重要性层次 ,确定内存不足时应终止哪些进程。

    分钟或更多)的重要性可能会降低,以允许其进程 拖放到下面描述的缓存LRU列表。这有助于避免 存在内存泄漏或其他问题的长时间运行服务的情况 缓存进程的有效使用。

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

    • 限制前台服务中资源的使用。例如,执行周期性蓝牙扫描的进程比密集使用gps的进程被杀死的可能性要小得多。
        2
  •  0
  •   Itamar Kerbel    6 年前

    如果你有现役军人,你不应该有这个问题。

    看到了吗 here .

    前台进程是用户所需要的进程 包含以不同方式被视为前景的进程。A

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

    在这个系统中,这样的过程只有少数几个,而这些 只有在内存太少甚至 这些进程可以继续运行。一般来说,在这一点上 设备已达到内存分页状态,因此需要执行此操作 以保持用户界面的响应性。

    看看这个 answer .