阻止某些用户关闭Android服务

时间:2014-06-10 15:56:07

标签: android service

我正在Android上提供服务,它将安装在手机/平板电脑上。许多人可以使用该平板电脑,但只有选定的平板电脑应该有权关闭服务。我怎样才能做到这一点?我google了&找到了一些选择:

  • 制作用户帐户:有很多应用程序,但它们没有指定在一个帐户中运行的服务是否也会为其他帐户运行。
  • 关闭服务前提示输入密码:有很多stackoverflow Q.for this但看起来不可能。
  • 当用户关闭服务时重新启动服务:由于我的服务不断与其他设备通信以收集数据,因此重新启动可能会导致数据丢失。

新选项:

我有另一个想法让它工作:我将使它成为系统应用程序,以便在他试图阻止它时警告用户。对于系统应用程序,当用户从设置中按下“停止”按钮时,会弹出一条警告消息:“关闭此应用程序可能会导致...(等等等等)......”。你知道抛出这条消息会引起什么意图吗?我想我可以在这里使用这个意图并禁用此消息中的“确定”选项

I want to disable this "OK"

3 个答案:

答案 0 :(得分:6)

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

我不确定你是如何检测服务何时停止的,但是定期轮询总是AlarmManager

答案 1 :(得分:5)

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

使用startForeground。正如文档中所述:

  

已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动了解的内容,因此在内存不足时不会成为查杀的候选者。 (从理论上讲,服务在当前前台应用程序的极端内存压力下被杀死仍然是可能的,但实际上这不应该是一个问题。)

从用户onStartCommand返回START_STICKY,以便在用户关闭您的服务后立即重新启动您的服务。在大多数情况下,您的服务将以< 5s重新启动,但这取决于您的服务连续被杀的频率。

这两种方法将使您的服务几乎无法收回。

答案 2 :(得分:3)

您是否有权禁用设置?

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

此解决方案并未提供正确性(Google建议不要这样做),但它会阻止用户查看该选项,而对于本地(非整个市场)应用程序,它可能是可接受的。

无论如何,如果你能够处理一些数据丢失(只是几秒钟),我会说你要使用RETURN_STICKY答案。

相关问题