2010-05-07 106 views
16

这是非常重要的,我的服务保持运行,直到有人用密码停止从我的UI屏幕服务。我的应用运行良好,但它的设计目的是在父母的电话上打开/关闭(使用密码)。我已经设法使所有的工作,但我遇到的问题是,如果孩子使用任务管理器来杀死我的服务,那么我的应用程序是没用的。我会很感激谁知道的方式要么如何防止我的Android应用程序/服务被任务管理器“杀死”?

1)监控服务,并重新启动它会自动如果“封杀” 或 2)防止有人能杀死它除了从活动(管理屏幕)启动服务。或两者?

如果我在描述问题时不太清楚,我很抱歉,我是初学者。到目前为止我已经取得了很大的进步,但我陷入了最后的障碍。

回答

5

没有一种方法可以直接防止这种情况发生,没有固定的设备。 SDK有助于防止这些问题。

你可以做“真正的邪恶”的把戏,并在两个应用程序有两个服务。每个服务监视另一个服务,如果停止,则重新启动它。这很烂,但在大多数情况下,即使是最快的手指孩子也不能杀死这两个应用程序。

+3

但是一个程序可以!任何能够执行'kill -KILL -1'的程序都会导致所有实例同时死亡。 – 2010-05-07 02:55:43

+1

如果您拥有系统权限,您将如何以隐藏方式签署您的应用或如何从用户中删除该应用?是否有任何具体的许可,你必须设置? – rayman 2010-12-09 10:15:18

+3

我刚刚安装了名为Smart App Protector Free的应用程序,它会询问您是否要安装帮助程序,以防止它被杀害。它工作,我不知道它是如何。我使用系统面板来杀死所有东西(包括系统进程),但保护程序仍然回来。更重要的是,我看不到辅助程序运行的痕迹,不在系统面板中,甚至在设备控制台(通过adb)中我都没有ps,但仍然看不到辅助程序存在。任何提示? – xandy 2011-07-09 16:01:49

10

您可以使用API​​方法:startForeground()。这里是它的解释:

已启动的服务可以使用startForeground(INT,通知)API 把服务前台状态,当系统认为 它是什么用户正在积极了解的,因此不是 候选人在内存不足时进行查杀。 (它仍然是理论上 可能的服务要在极端的内存压力 从目前的前台应用程序打死,但在实践中,这应该 不算是个问题。)

Here你可以找到一个例子如何用这个。

至于这个问题,你不能阻止一个服务被杀害。它可以被系统杀死。即使系统服务也可能被杀死。如果发生这种情况,则重新启动。您可以使用相同的方法。

5

你可以编写一个助手应用程序来接收android广播"android.intent.action.PACKAGE_RESTARTED",当你的应用程序被杀害后,你的助手将收到该广播,你可以重新启动你的应用程序或任何其他。

这就是'Smart App Protector Free'的做法。

坏事是用户必须安装两个应用程序而不是一个。

3

对于任何人谁仍在寻找答案 - 这一个可能是正确的:

你不能:进行服务无法终止,如果在低内存运行时,系统会一直杀了你的服务。但是

您可以:告诉系统在终止服务时重启您的服务。看看这段代码:

如果此服务的过程:

公共静态最终诠释START_REDELIVER_INTENT

API等级5

不断从onStartCommand(意向,INT,INT)返回

增加在从onStartCommand(Intent,int,int)返回之后被杀死,然后它将被安排重新启动,最后一次传递的Intent通过onStartCommand(Intent,int,int)重新传递给它。 此Intent将保持计划重新传递,直到服务使用提供给onStartCommand(Intent,int,int)的开始ID调用stopSelf(int)。该服务将不会收到带有null Intent的onStartCommand(Intent,int,int)调用,因为只有在它未完成处理发送给它的所有Intents时才会重新启动该服务(并且任何此类未决事件将在重新启动点)。

常数值:3(0x00000003)

0

只要设置返回类型为START_TICKY。

相关问题