阻止某些用户关闭Android服务

阻止某些用户关闭Android服务,android,service,Android,Service,我正在安卓上做一项服务,它将安装在手机/平板电脑上。很多人都可以使用该平板电脑,但只有被选中的人才有权关闭该服务。我怎样才能做到这一点?我在谷歌上搜索并找到了一些选项: 创建用户帐户:有很多应用程序可以实现这一点,但它们没有指定在一个帐户中运行的服务是否也会为其他帐户运行 关闭服务前提示输入密码:有许多stackoverflow问题需要解决,但看起来不可能 当用户关闭服务时重新启动它:重新启动可能会导致数据丢失,因为我的服务正在不断与其他设备通信以收集数据 新选项: 我有另一个想法让它工作:

我正在安卓上做一项服务,它将安装在手机/平板电脑上。很多人都可以使用该平板电脑,但只有被选中的人才有权关闭该服务。我怎样才能做到这一点?我在谷歌上搜索并找到了一些选项:

  • 创建用户帐户:有很多应用程序可以实现这一点,但它们没有指定在一个帐户中运行的服务是否也会为其他帐户运行
  • 关闭服务前提示输入密码:有许多stackoverflow问题需要解决,但看起来不可能
  • 当用户关闭服务时重新启动它:重新启动可能会导致数据丢失,因为我的服务正在不断与其他设备通信以收集数据
新选项:

我有另一个想法让它工作:我将使它成为一个系统应用程序,这样当用户试图停止它时,它会警告用户。对于系统应用程序,当用户按下“设置”中的“停止”按钮时,会弹出一条警告消息:“关闭此应用程序可能导致……(诸如此类)…”。您知道弹出此消息的目的是什么吗?我想我可以在这里使用这个意图,并禁用此消息中的“OK”选项


.

即使用户无法停止服务,手机仍可能断电、电池耗尽或失去网络连接。甚至可以想象,如果资源不足,Android可能会扼杀服务进程。因此,代码应该准备好处理这些事件中潜在的数据丢失


我不确定您如何检测服务何时停止,但始终存在定期轮询。

阻止服务关闭几乎是不可能的。但是,您可以使您的服务在关闭后立即重新启动

使用。如文件所述:

已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统将其视为用户主动意识到的内容,因此在内存不足时不可能终止。(理论上,在当前前台应用程序的极端内存压力下,服务仍有可能被终止,但在实践中,这不应引起关注。)


onStartCommand
返回以在用户关闭服务后立即重新启动服务。在大多数情况下,您的服务将在中重新启动。您是否被授权禁用设置

如果是这样,在您的服务中,您可以监视正在运行的线程并杀死属于设置的线程(按包名),或者让系统返回到启动器,用户将永远无法到达能够关闭进程的上下文

该解决方案不会影响正确性(谷歌建议不要这样做),但它甚至会阻止用户看到该选项,对于本地(而不是整个市场)应用程序来说,它可能是可以接受的


无论如何,如果您能够处理一些数据丢失(仅几秒钟),我建议您使用返回粘滞的答案。

只是好奇,但为什么工厂车间的工人会感到被迫停止服务?(看起来你把上面的那一行删掉了)。这并不是最简单的流程,即使是进入“应用程序”设置屏幕,也无法找到停止它的运行进程。因为Android正日益出名,工作人员可能知道如何做到这一点。此外,出于安全目的,我需要此功能。这是一个为您的设备定制固件的人的问题。如果您试图在这个用例中使用现成的硬件和库存ROM,这是一个相当严重的错误。更不用说一个永久性的服务首先通常是一个反模式的。@commonware它不是一个永久性的服务。我只是想让它有密码保护才能停止。其他原因,比如断电和网络故障,在工厂里是很少见的。为了处理内存不足的情况,我将提供足够的硬件功能。对于断电情况,将向经理发送一条消息(wo将访问服务)。感谢您指出重要问题。:)我现在已经把它做成了前景和粘性的。正如我在Q中已经提到的,重启可能不是一个好主意,因为它需要几秒钟的时间。我可能会在这几秒钟内丢失数据。在搜索了很长一段时间后,我同意:“阻止服务关闭几乎是不可能的。”如果用户强制停止应用程序,这将不起作用。当这种情况发生时,在用户再次与应用程序交互之前,您的服务将不会启动。这是一个很好的建议。我有另一个想法让它工作:我正在制作it系统应用程序,这样当用户试图停止它时,它就会警告用户。对于系统应用程序,当用户按下“设置”中的“停止”按钮时,会弹出一条警告消息:“关闭此应用程序可能导致……(诸如此类)…”。您知道弹出此消息的目的是什么吗?我想我可以在这里使用这个意图,并在这个应用程序中禁用“OK”选项。