2017-02-20 76 views
0

我正在构建其中一个SOS应用程序。每当设备被震动超过阈值(通过加速度计检测)时,我显示Toast(截至目前)即使在活动关闭后,仍然保持Android服务运行

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

2)Service开始不停地收听摇一摇。

3)如果App正在运行,它会正确检测到摇晃。

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

即使关闭应用程序,我如何保持service运行,以便它可以从后台收听抖动? (这是这个应用程序的全部目的)

[1.I是回START_STICKYonStartCommand

  • 我使用BroadcasterReciever其将通过接收重新启动服务也试图从onTaskRemoved

  • 我对华硕Xenfone最大测试播放,棉花糖OS ]

  • +0

    经历一次http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android –

    +0

    顺便说一句,你可以尝试使用这个解决方案基于BroadcastReceiver而不是服务:http://stackoverflow.com/a/24540699/1533933 – krossovochkin

    +0

    非常感谢@krossovochkin。这是实现我想要做的事情的好方法。我会测试它。 –

    回答

    0

    您可以在前台放置一个服务,在这种情况下,它始终被视为活动(因此它将拥有自己的通知,因此用户知道活动的服务正在运行)。它不会停止,直到它回到背景。这就是你想要的,因为你希望你的服务尽可能长时间保持活力。正如描述的Android Service documentation

    一个启动的服务可以使用startForeground(INT,通知) API把服务前台状态,当系统认为它是一些用户正在积极了解因此当内存不足时不会成为杀人的候选人。

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

    使用START_STICKY只是告诉系统,如果它必须杀死你的服务,那么你希望它重新启动它。这并不是说这个服务的优先级高于其他服务。

    2

    你有两个选择:

    • 启动为前景的服务服务(与startForeground(int id, Notification notification)docs。但在这种情况下,你将作为长时间出现在通知栏通知对作为服务运行
    • 使用单独的进程为您服务将在清单给你的进程android:process=":nameofyourprocess"
    +0

    您确定在单独的流程中使用您的服务将具有与生命周期中的前台服务相同的效果吗? – JonesV

    +0

    @JonesV如果通过“生命周期”,你的意思是“这两个服务对于Android是否具有相同的优先级,所以如果Android没有更多的内存,就不能分辨哪一个会先被销毁” - 然后回答“当然不是” 。前台服务具有最高优先级,并且只有在任何其他非前台服务将被终止时才会被终止。但问题是关于没有在Activity上销毁服务。用这些术语来说 - 是的,他们会表现得一样。前台服务就像电池杀手 - 所以如果你可以避免身份证 - 做它 – krossovochkin

    +1

    我只是想为一个SOS应用程序,你想确保它正在运行,不会被杀死=)。我对“电池杀手”部分感兴趣!这是为什么?你的意思是即使前台服务没有做任何事情? – JonesV

    0

    尝试不绑定它开始服务到活动(简单的未绑定服务)。返回null您的onBind()功能。只要附件能够存活,粘滞服务就会将自己附加到活动中并具有一定的使用寿命。当您使用前台服务时,您可能会有一个与您的应用程序相关的常量通知。

    相关问题