Android 上长期运行服务的最佳架构
-
12-12-2019 - |
题
我希望获得有关如何处理操作系统终止长期运行服务的指导。
业务场景:
应用程序记录可能持续几个小时的 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);
不隶属于 StackOverflow