17

我将不胜感激有关如何处理操作系统杀死长期服务的一些指导。

业务场景:

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

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

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

问题:

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

一些附加信息:

服务启动START_STICKY并获得一个PARTIAL_WAKE_LOCK, 并在与主要活动相同的进程中运行。

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

问题:

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

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

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

感谢所有可以在这个问题上分享一些智慧的人。

4

1 回答 1

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

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

stopForeground(true);
于 2012-10-02T15:13:18.633 回答