我有一个应用程序,要求用户登录并显示活动。还会在标牌上启动一项服务,该服务使用位置管理器来跟踪其当前位置。 一切正常,直到应用程序处于待机状态(在后台关闭应用程序超过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);
}
我添加了关于销毁活动和服务功能的日志记录,以检测何时发生这种情况,但是这种情况发生时永远不会写入日志(当然,在销毁应用程序的情况下通常会进入日志记录)
答案 0 :(得分:6)
根据Android Processes and Application Lifecycle Documentation
[...] Android的一个不寻常的基本特征是应用程序 流程的生命周期不受应用程序直接控制 本身。而是由系统通过组合确定 系统知道正在运行的应用程序部分,如何 这些东西对用户很重要,总的内存是多少 在系统中可用。
前台服务应位于重要性层次结构的顶部,以确定在内存不足时应杀死哪些进程。
但是
[...]长时间运行的服务(例如30 分钟或更长的时间)可能会被降级,以允许其处理程序 放到下面描述的缓存的LRU列表中。这有助于避免 长时间运行的服务带有内存泄漏或其他情况 问题消耗了太多的内存,以至于阻止了系统 有效使用缓存的进程。
,所以您不能确定该进程不会被操作系统杀死。
一些对我有用的预防措施:
答案 1 :(得分:0)
如果您有活动的服务,则应该不会遇到此问题。
请参见here。
前台流程是用户所需的流程 正在做。各种应用程序组件可能导致其 包含过程以不同方式被视为前台。一种 如果出现以下任何情况,则认为该过程处于前台 条件成立:
它正在与用户进行交互的屏幕顶部运行一个Activity(已调用其onResume()方法)。 它具有当前正在运行的BroadcastReceiver(正在执行其BroadcastReceiver.onReceive()方法)。 它具有一个服务,该服务当前正在其回调之一(Service.onCreate(),Service.onStart()或 Service.onDestroy())。
系统中只会有一些这样的过程,而这些 如果内存不足以至于没有 这些过程可以继续运行。通常,在这一点上, 设备已达到内存分页状态,因此需要执行此操作 为了使用户界面保持响应状态。
看看这个answer。 在杀死时检测是否在前台。