我正在开发一个作为后台服务运行的应用。我需要实现这些目标: 1.使用广播接收器启动电话后启动服务 2.服务不应该由android停止,它应该连续运行。
我已经迈出了第一步。对于第二步,我尝试使用startForeground()方法。此方法向用户提供前台服务正在运行的通知。但是,我不希望用户收到有关服务的通知,并且不应该停止服务。我怎样才能实现这一目标?有没有办法不使用startForeground()方法?
如果提供示例代码来实现此目的,将是一个很好的帮助。
谢谢!
答案 0 :(得分:0)
设置<intent-filter android:priority="integer" >
如果我们将优先级设置为高,那么服务将持续运行并捕获事件
答案 1 :(得分:0)
只要服务已启动或客户端绑定服务,Android系统就会尝试保持托管服务的进程。当内存不足并且需要杀死现有进程时,托管服务的进程的优先级将是以下可能性中的较高者:
如果服务当前正在其onCreate(),onStartCommand()或onDestroy()方法中执行代码,则托管进程将是一个前台进程,以确保此代码可以执行而不会被终止。 如果服务已经启动,则其托管过程被认为不如屏幕上用户当前可见的任何进程重要,但比任何不可见的进程更重要。因为用户通常只能看到一些进程,这意味着除非在极低内存条件下,否则不应该终止该服务。 如果有客户端绑定到该服务,那么该服务的托管过程永远不会比最重要的客户端重要。也就是说,如果其客户端之一对用户可见,则认为服务本身是可见的。 已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统将其视为用户主动了解的内容,因此在内存不足时不会成为查杀的候选者。 (从理论上讲,服务在当前前台应用程序的极端内存压力下被杀死仍然是可能的,但实际上这不应该是一个问题。) 请注意,这意味着大多数情况下您的服务正在运行,如果系统处于严重的内存压力下,它可能会被系统杀死。如果发生这种情况,系统稍后将尝试重新启动该服务。这样做的一个重要结果是,如果您实现onStartCommand()来安排异步或在另一个线程中完成的工作,那么您可能希望使用START_FLAG_REDELIVERY让系统为您重新提供一个Intent,这样它就不会丢失如果您的服务在处理过程中被终止。
答案 2 :(得分:0)
您无法有效实现这一点,因为您的服务始终容易受到Android的进程/服务查杀系统的影响。
除非您使用的是平台级环境,否则无法从应用层实现此目的。除非您的服务被杀死,否则您将拥有一个程序,当它被杀死时,它将重新启动。这就是你能做的一切。然而,对于完整的解决方案,并且永远不会停止,你不能这样做,因为这种恶意行为,因为用户应用无权在手机上永远运行,并且与其他应用程序相比,特别是那些 WAY 更重要的是像Android系统应用程序及其服务。
如果你不在平台上工作,那么不要做任何事情来实现这一目标,因为你无法成功并使其成为完全无懈可击。
你能做的最好的事情就是尽可能长时间保持活着,但是如果内存不足并且你已经闲置太久,那么 EXPECT 就会被杀死。