即使在Activity关闭后也能保持Android服务运行

时间:2017-02-20 06:54:54

标签: android android-service accelerometer

我正在构建其中一个SOS应用程序。每当设备晃动超过阈值(通过加速度计检测到)时,我显示Toast(截至目前)

1)推出应用程序。用户提供姓名,电子邮件等..并在最后一个屏幕上点击finish

2)启动Service,持续听取震动。

3)如果应用正在运行,它会正确检测到震动。

4)如果我关闭了应用程序(activity),服务就会被杀死。

即使应用已关闭,如何保持service正常运行,以便它可以从后台听到震动? (这就是这个应用程序的全部目的)

[1.我正在onStartCommand

返回 START_STICKY
  1. 我还尝试使用BroadcasterReciever,它将通过接收来自onTaskRemoved

    的广播来重启服务
  2. 我正在测试华硕Xenfone Max, Marshmallow OS ]

3 个答案:

答案 0 :(得分:2)

您有两种选择:

  • 将您的服务作为前台服务启动(使用startForeground(int id, Notification notification)docs。但在这种情况下,只要您的服务正在运行,您就必须在通知托盘中显示通知
  • 使用单独的流程将您的服务添加到流程android:process=":nameofyourprocess"

答案 1 :(得分:0)

您可以将服务置于前台,在这种情况下,它将始终被视为活动(因此它将具有自己的通知,因此用户知道正在运行的活动服务)。它不会被阻止,直到它回到后台。这就是你想要的,因为你希望你的服务尽可能地保持活力。如Android Service documentation

中所述
  

已启动的服务可以使用 startForeground(int,Notification) API将服务置于前台状态,系统认为该服务是用户主动了解的内容,因此不是当内存不足时被杀的候选人。

活动和服务的想法是相同的,实际上:当Android需要内存时,它会开始查杀进程。前台进程(例如,屏幕上显示的Activity或前台服务)的优先级高于后台进程(例如,暂停的Activity),因此它们将是系统停止的最后一个进程。

使用START_STICKY只是告诉系统,如果它必须终止您的服务,那么您希望重新启动它可以。这并不能说这项服务的优先级高于其他服务。

答案 2 :(得分:0)

尝试启动服务而不将其绑定到活动(简单的未绑定服务)。在null功能上返回onBind()。只要附件存活,粘性服务就会附加到活动上并具有生命周期。使用前台服务时,您可能会有与您的应用程序相关的持续通知。