我希望获得有关如何处理操作系统终止长期运行服务的指导。

业务场景:

应用程序记录可能持续几个小时的 BTT 轨迹。它还可以在地图上显示轨迹以及相关统计数据。

应用程序用户界面使用户能够开始/停止轨迹记录并在地图上查看实时轨迹。

开始跟踪记录后,用户可以退出应用程序并关闭屏幕(以节省电量),并且只有一个服务将保持运行以将记录更新到数据库(显示通知),直到用户再次启动活动并要求停止记录,这会导致服务终止。

问题:

经过一段从 40 分钟到 1 个半小时不等的可变时间后,录制服务会在没有任何警告的情况下被终止。由于BTT外出可能需要几个小时,这会导致轨迹记录不完整。

一些附加信息:

服务开始于 START_STICKY 并获得 PARTIAL_WAKE_LOCK, ,并在与主要活动相同的进程中运行。

新位置以用户定义的速率从 1 秒到几分钟采集(并记录)。我从 Android 文档中知道,这是长期运行的服务的预期操作系统行为。

问题:

要拥有一个性能良好、能够满足业务场景需求的应用程序,最好的架构设计方法是什么?

我可以想到几个选项(我不喜欢其中任何一个),但我希望有人指导如何已经面临并解决类似的问题:

  • 使用广播接收器(如果可能的话,理想地连接到位置管理器)才能在获取新位置时才能运行该服务?
  • 不让用户离开主要活动(导致用户体验下降)?
  • 如果需要,是否有警报广播接收器重新启动服务?

感谢所有能够就这个主题分享一些智慧的人。

有帮助吗?

解决方案

我有一个应用程序可以做非常类似的事情。我通过将其设置为前台任务来确保服务继续运行。当我准备开始运行时,我调用此函数,它还会设置一个通知:

void fg() {
    Notification notification = new Notification(R.drawable.logstatus, 
                    "Logging On", System.currentTimeMillis());
    Intent notificationIntent = new Intent(this, LoggerActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, 
                    notificationIntent, 0);
    notification.setLatestEventInfo(this, "Logger","Logger Running",
                pendingIntent);
    startForeground(1, notification);   
}

然后在日志记录完成后离开前台模式:

stopForeground(true);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top