我的服务保持运行非常重要,直到有密码的人从我的UI屏幕停止服务。我的应用程序运行良好但它的设计是由他们的孩子手机上的父母(带密码)打开/关闭。我已经设法使一切正常,但我遇到的问题是,如果孩子使用任务管理器来终止我的服务,那么我的应用程序是无用的。我会很感激能够找到方法的人
1)监控服务并在其“被杀”后自动重新启动 要么 2)防止某人杀死它,除了从启动该服务的活动(管理屏幕)。或两者兼而有之?
如果我不清楚描述问题,我很抱歉,我是初学者。到目前为止,我已经取得了很大的进步,但我陷入了最后的障碍。
答案 0 :(得分:10)
您可以使用API方法:startForeground()
。以下是对它的解释:
启动的服务可以使用startForeground(int,Notification)API 将服务置于系统考虑的前台状态 它是用户积极意识到的东西,因此不是 当内存不足时被杀的候选人。 (理论上还是如此 可能会在极端记忆压力下杀死该服务 从当前的前台应用程序,但在实践中这应该 不要担心。)
Here你可以找到一个如何使用它的例子。
至于问题,您无法阻止服务被杀死。它可以被系统杀死。甚至可以杀死系统服务。如果发生这种情况,则重新启动。您可以使用相同的方法。
答案 1 :(得分:5)
没有root设备,没有办法直接阻止这种情况。 SDK有助于防止出现这类问题。
你可以做“真正的邪恶”技巧,并在两个应用程序中有两个服务。每个服务都监视另一个服务,如果停止则重新启动它。这很愚蠢,但在大多数情况下,即使是速度最快的孩子也无法杀死这两个应用程序。
答案 2 :(得分:5)
您可以编写一个帮助应用程序来接收Android广播"android.intent.action.PACKAGE_RESTARTED",当您的应用程序被杀时,您的助手将收到该广播,您可以重新启动您的应用程序或其他任何内容。
这就是'Smart App Protector Free'的用法。
糟糕的是用户必须安装两个应用而不是一个。
答案 3 :(得分:3)
对于仍在寻找答案的人 - 这可能是正确的:
你不能:使服务不可杀死,如果在低内存运行,系统将永远终止您的服务。但是
您可以:告诉系统在服务被杀死时重新启动服务。看看这段代码:
public static final int START_REDELIVER_INTENT
在API级别5中添加
从onStartCommand(Intent,int,int)返回的常量:
如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),那么它将被安排重新启动,并且最后一次传递的Intent通过onStartCommand再次传递给它(Intent ,int,int)。 此Intent将保持计划重新传递,直到服务调用stopSelf(int),并将启动ID提供给onStartCommand(Intent,int,int)。该服务不会接收带有null Intent的onStartCommand(Intent,int,int)调用,因为只有在没有完成处理发送给它的所有Intent时才会重新启动它(并且任何此类挂起事件将在重启点)。
常数值:3(0x00000003)
答案 4 :(得分:1)
如果您具有系统级权限,请通过清单权限使用persistent:true
。
https://developer.android.com/guide/topics/manifest/application-element
答案 5 :(得分:0)
只需将返回类型设置为START_TICKY。