我该如何防止我的Android应用程序/服务被任务管理器“杀死”?

21

我的服务非常重要,直到有人通过我的UI屏幕使用密码停止服务。我的应用程序运行良好,但它是设计为由父母(带密码)在他们孩子的手机上打开/关闭的。我已经设法使一切正常工作,但我遇到的问题是,如果孩子使用任务管理器来终止我的服务,那么我的应用程序就无用了。如果有人知道以下方法之一,我将不胜感激:

1)监视服务并在其“被杀死”后自动重新启动 或者 2)防止除启动服务的活动(管理屏幕)之外的任何人能够终止它。或两者都可以?

如果我描述问题不太清楚,我很抱歉,我是初学者。到目前为止,我取得了很大进展,但我卡在了这个最后的障碍。

6个回答

13
您可以使用API方法:startForeground()。以下是它的解释:
引用:

已启动的服务可以使用startForeground(int, Notification) API将服务置于前台状态,系统认为它是用户当前正在使用的内容,因此当内存不足时不会被终止。(在极端内存压力下,当前前台应用程序可能会终止该服务,但实际上这不应该成为一个问题)

此处您可以找到如何使用它的示例。

至于问题,您无法防止服务被终止。系统可能会终止它们,即使是系统服务也会被终止。如果发生这种情况,它们将重新启动。您可以使用相同的方法。

6

如果没有root设备,无法直接防止这种情况发生。SDK可以帮助防止这些问题。

你可以使用“极其恶毒”的技巧,在两个应用程序中分别运行两个服务。每个服务监视另一个服务,并在其停止时重新启动它。虽然这很麻烦,但在大多数情况下,即使最快手的孩子也无法同时终止两个应用程序。


3
但是程序可以!任何能够执行相当于"kill -KILL -1"的程序都可以导致你所有的实例同时停止运行。 - C. K. Young
1
如果您拥有系统特权,您会如何签署您的应用程序以隐藏它或使其无法被用户终止?是否需要设置特定权限? - rayman
3
我刚刚安装了一款名为Smart App Protector Free的应用程序,它会询问您是否要安装一个助手以防止它被关闭。它起作用了,我想知道它是如何做到的。我使用System Panel来关闭所有东西(包括系统进程),但是保护程序仍然可以重新启动。更重要的是,我看不到运行助手的痕迹,无论是在System Panel中还是通过设备控制台(通过adb),我仍然看不到该助手的存在。有什么提示吗? - xandy

6
你可以编写一个帮助程序来接收Android广播“android.intent.action.PACKAGE_RESTARTED”,当你的应用程序被杀死时,你的帮助程序将接收该广播,然后你可以重新启动你的应用程序或执行其他操作。
这就是“Smart App Protector Free”所做的。
不好的地方是用户必须安装两个应用程序而不是一个。

3

对于仍在寻找答案的人,这个可能是正确的:

如果运行在低内存上,系统会始终终止您的服务,因此您无法使服务不可终止。但是

当它被杀死时,您可以告诉系统重新启动您的服务。请查看以下代码:

public static final int START_REDELIVER_INTENT

在API级别5中添加

onStartCommand(Intent,int,int)返回的常量:

如果该服务的进程在启动后(从onStartCommand(Intent,int,int)返回)被杀死,则将安排重新启动,并通过onStartCommand(Intent,int,int)再次传递最后一个传递的Intent进行重新交付。 直到服务使用提供给onStartCommand(Intent,int,int)的启动ID调用stopSelf(int)为止,此意图将保留预定以进行重传。因为只有在未完成处理发送到它的所有意图时才会重新启动它(任何此类待处理事件都将在重新启动时传递),所以该服务不会收到具有空Intent的onStartCommand(Intent,int,int)调用。

Constant Value: 3 (0x00000003)


2

仅适用于系统进程。用户安装的进程将被强制设置为false。 - Slawa
它能在已经获取了系统权限的Root设备上运行吗? - Ofek Regev
我不确定,我以前从未对设备进行过root,但我应该这样做。 无论如何,我认为使用root设备,你可能可以做任何事情 :) - JoshuaTree

1

只需将返回类型设置为 START_STICKY。


4
应该使用 START_STICKY - CopsOnRoad

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