Android上长期运行服务的最佳架构

Lui*_*uis 17 service android android-service android-lifecycle

我将非常感谢有关如何处理操作系统查杀长期服务的一些指导.

业务场景:

应用程序记录BTT轨道,可能持续数小时.它还可以在地图上显示轨道以及相关统计数据.

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

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

问题:

在可变时间(从40分钟到1个半小时)之后,录制服务在没有任何警告的情况下被杀死.由于BTT出场可能需要几个小时,这导致跟踪录音不完整.

一些其他信息:

服务以启动START_STICKY并获取PARTIAL_WAKE_LOCK,并在与主活动相同的过程中运行.

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

题:

拥有性能良好的应用程序以满足业务场景要求的最佳架构设计方法是什么?

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

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

感谢所有能够就此主题分享一些智慧的人.

Mic*_*ael 9

我有一个非常类似的应用程序.我通过将服务作为前台任务来确保服务保持运行.当我准备好开始运行时,我调用了这个函数,它也设置了一个通知:

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);   
}
Run Code Online (Sandbox Code Playgroud)

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

stopForeground(true);
Run Code Online (Sandbox Code Playgroud)