防止某些用户关闭Android服务

11
我正在Android上创建一个服务,它将安装在手机/平板电脑上。许多人可以使用该平板电脑,但只有选择的人才能关闭该服务。我该如何实现这一点?我谷歌了一下并找到了一些选项:
  • 制作用户帐户:有很多应用程序可以做到这一点,但它们没有指定在一个帐户中运行的服务是否也会为其他帐户运行。
  • 在关闭服务之前提示输入密码:有很多StackOverflow Q.对于此操作,但看起来是不可能的。
  • 用户关闭服务时重新启动服务:重新启动可能会导致数据丢失,因为我的服务正在不断地与其他设备通信以收集数据。

新方案:

我有另一个想法使其可行:我将其制作为系统应用程序,这样当用户试图停止它时,它将发出警告。对于系统应用程序,当用户从设置中按下“停止”按钮时,会弹出一个警告消息:“关闭此应用程序可能会导致..(blah blah)....”。您知道哪个意图会触发此消息?我认为我可以在这里使用该意图并禁用此消息中的“确定”选项。

我想禁用这个“确定”.


只是好奇,但为什么工厂车间的工人会感到有必要停止服务呢?(似乎你在上面编辑了那行)。这甚至不是最容易进入“应用程序”设置屏幕以找到正在运行的进程并停止它的流程。 - selbie
由于Android越来越受欢迎,工作者可能知道如何做到这一点。此外,出于安全考虑,我想要这个功能。 - Nikhil Chilwant
这是一个针对为您的设备定制固件的人员的问题。如果您尝试在这种用例中使用现成的硬件和原始固件,那在我看来是相当严重的错误。更不用说,永久服务通常是一种反模式。 - CommonsWare
@CommonsWare 这不是一个永久的服务。我只想让它有密码保护,以防止... - Nikhil Chilwant
3个回答

6
即使用户无法停止服务,手机仍可能因为关机、电量耗尽或失去网络连接而停止服务。甚至可以想象,如果Android资源不足,它也可能杀死服务进程。因此,代码应准备处理这些事件中潜在的数据丢失。
我不确定如何检测服务何时已停止,但始终可以使用AlarmManager进行定期轮询。

其他原因,如断电和网络故障,在工厂中很少发生。为了处理低内存情况,我将提供超过足够的硬件能力。对于断电情况,将向经理发送消息(他将可以访问服务)。感谢指出重要问题。 :) - Nikhil Chilwant

6
防止一个服务关闭几乎是不可能的。但是,你可以使你的服务在关闭后立即重新启动。
使用startForeground。根据文档所述:
“启动的服务可以使用startForeground(int, Notification) API将服务置于前台状态,这样系统将其视为用户正在积极关注的内容,因此在内存不足时不会成为杀死候选项。(从当前前台应用程序来说,在极端内存压力下理论上仍然有可能杀死服务,但实际上这不应该是一个问题。)”
从你的onStartCommand返回START_STICKY,以便在用户关闭你的服务后立即重新启动你的服务。在大多数情况下,你的服务将在小于5秒内重新启动,但这取决于你的服务连续被杀死的频率。
这两种方法将使你的服务几乎不可杀死。

1
我现在已经将它设置为前台和粘性了。正如我在我的问题中已经提到的,重新启动可能不是一个很好的主意,因为这将需要几秒钟的时间。在那些几秒钟内,我可能会丢失数据。经过长时间的搜索,我同意:“防止服务关闭几乎是不可能的。” - Nikhil Chilwant
如果用户强制停止应用程序,则此方法将无法工作。当发生这种情况时,直到用户再次与应用程序交互,您的服务才会重新启动。 - Blaz

3

你是否有权限禁用设置?

如果是这样,在您的服务中,您可以监视运行的线程并关闭属于设置(按包名称)的线程,或者只需使系统返回到启动器,用户将永远不会进入能够关闭进程的上下文中。

这种解决方案不符合正确性要求(Google建议不要这样做),但它将防止用户甚至看到该选项,并且对于一个本地(而非整个市场)应用程序来说,这可能是可接受的。

无论如何,如果您能够处理一些数据的损失(仅为几秒钟),我会建议您使用RETURN_STICKY答复。


那是个好建议。我有另一个想法让它起作用:我将把它制作成系统应用,这样当用户试图停止它时,它会发出警告。对于系统应用,当用户从设置中按下“停止”按钮时,会弹出一个警告消息:“关闭此应用程序可能会导致..(啥啥啥)...”。你知道哪个意图会触发弹出这个消息吗?我认为我可以在这里使用那个意图并禁用此应用程序中的“确定”选项。 - Nikhil Chilwant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接