21

我的服务保持运行非常重要,直到有密码的人从我的 UI 屏幕停止服务。我的应用程序运行良好,但它旨在由父母(使用密码)在孩子的手机上打开/关闭。我已经设法使一切正常,但我遇到的问题是,如果孩子使用任务管理器来终止我的服务,那么我的应用程序就没用了。我会感谢任何知道方法的人

1)监视服务并在其“被杀死”时自动启动它或 2)防止有人能够杀死它,除了启动服务的活动(管理屏幕)。或两者?

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

4

6 回答 6

13

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

启动的服务可以使用 startForeground(int, Notification) API 将服务置于前台状态,系统认为它是用户主动意识到的,因此在内存不足时不适合杀死。(理论上,在当前前台应用程序的极端内存压力下,服务仍然可能被杀死,但实际上这不应该是一个问题。)

在这里您可以找到如何使用它的示例。

至于问题,您无法阻止服务被杀死。它可以被系统杀死。甚至可以杀死系统服务。如果发生这种情况,它们将重新启动。您可以使用相同的方法。

于 2012-07-27T15:19:19.607 回答
6

您可以编写一个助手应用程序来接收android广播“android.intent.action.PACKAGE_RESTARTED”,当您的应用程序被杀死时,您的助手将接收该广播,您可以重新启动您的应用程序或其他任何东西。

这就是“Smart App Protector Free”的作用。

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

于 2013-03-13T05:42:07.630 回答
5

没有根设备,没有办法直接防止这种情况。SDK 有助于防止此类问题。

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

于 2010-05-07T02:44:46.317 回答
3

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

您不能:使服务无法终止,如果在内存不足的情况下运行,系统将始终终止您的服务。但

你可以:告诉系统在服务被杀死时重新启动你的服务。看这段代码:

公共静态最终 int START_REDELIVER_INTENT

在 API 级别 5 中添加

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

如果该服务的进程在启动时被杀死(从 中返回后onStartCommand(Intent, int, int)),它将被安排重新启动,并且最后交付的 Intent 再次通过 重新交付给它onStartCommand(Intent, int, int)。此 Intent 将保持重新交付的计划,直到服务调用stopSelf(int)start ID 提供给onStartCommand(Intent, int, int). 服务将不会收到onStartCommand(Intent, int, int)带有 null Intent 的调用,因为只有在未完成处理发送给它的所有 Intent 时才会重新启动它(并且任何此类挂起的事件都将在重新启动时传递)。

常数值: 3 (0x00000003)

于 2014-02-21T10:09:09.327 回答
2

如果您具有系统级权限,请persistent:true通过清单权限使用。

https://developer.android.com/guide/topics/manifest/application-element

于 2018-05-04T06:50:42.323 回答
1

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

于 2015-08-02T19:22:14.663 回答