我正在Android上提供服务,它将安装在手机/平板电脑上。许多人可以使用该平板电脑,但只有选定的平板电脑应该有权关闭服务。我怎样才能做到这一点?我google了&找到了一些选择:
新选项:
我有另一个想法让它工作:我将使它成为系统应用程序,以便在他试图阻止它时警告用户。对于系统应用程序,当用户从设置中按下“停止”按钮时,会弹出一条警告消息:“关闭此应用程序可能会导致...(等等等等)......”。你知道抛出这条消息会引起什么意图吗?我想我可以在这里使用这个意图并禁用此消息中的“确定”选项
答案 0 :(得分:6)
即使用户无法停止服务,手机仍然可能会关闭电源,电量耗尽或丢失网络连接。甚至可以想象,如果资源运行不足,Android可能会终止服务流程。因此,代码应该准备好处理这些事件中潜在的数据丢失。
我不确定你是如何检测服务何时停止的,但是定期轮询总是AlarmManager。
答案 1 :(得分:5)
防止关闭服务几乎是不可能的。但是,您可以在关闭后立即将服务重新启动。
使用startForeground。正如文档中所述:
已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动了解的内容,因此在内存不足时不会成为查杀的候选者。 (从理论上讲,服务在当前前台应用程序的极端内存压力下被杀死仍然是可能的,但实际上这不应该是一个问题。)
从用户onStartCommand
返回START_STICKY,以便在用户关闭您的服务后立即重新启动您的服务。在大多数情况下,您的服务将以< 5s重新启动,但这取决于您的服务连续被杀的频率。
这两种方法将使您的服务几乎无法收回。
答案 2 :(得分:3)
您是否有权禁用设置?
如果是这样,在您的服务中,您可以监视正在运行的线程并终止属于设置的线程(按包名称)或只是让系统返回启动器,用户将永远不会到达能够关闭的上下文过程
此解决方案并未提供正确性(Google建议不要这样做),但它会阻止用户查看该选项,而对于本地(非整个市场)应用程序,它可能是可接受的。
无论如何,如果你能够处理一些数据丢失(只是几秒钟),我会说你要使用RETURN_STICKY答案。