【问题标题】:How can I prevent my Android app/service from being "killed" from a task manager?如何防止我的 Android 应用程序/服务被任务管理器“杀死”?
【发布时间】:2011-02-16 16:03:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: android service kill taskmanager


    【解决方案1】:

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

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

    Here你可以找到一个如何使用它的例子。

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

    【讨论】:

      【解决方案2】:

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

      “Smart App Protector Free”就是这样做的。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 但是程序可以!任何可以执行相当于kill -KILL -1 的程序都可能导致您的所有实例同时死亡。
        • 如果您有系统权限,您将如何签署您的应用程序以隐藏或不让用户知道?您是否需要设置任何特定权限?
        • 我刚刚安装了一个名为 Smart App Protector Free 的应用程序,它会询问您是否要安装帮助程序而不是防止它被杀死。它有效,我想知道它是怎么回事。我使用系统面板杀死所有东西(包括系统进程),但保护器仍然回来。更重要的是,我看不到助手运行的痕迹,不在系统面板中,甚至我在设备控制台(通过 adb)中 ps,我仍然看不到助手存在。有什么提示吗?
        【解决方案4】:

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

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

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

        public static final int START_REDELIVER_INTENT

        在 API 级别 5 中添加

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

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

        常量值:3 (0x00000003)

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 仅适用于系统进程。用户安装的进程强制为 false。
          • 它是否适用于在根设备上具有系统权限的应用程序?
          • 我不确定,我以前从未root过设备,但我应该。无论如何,我认为使用有根设备你可能可以做任何事情:)
          【解决方案6】:

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

          【讨论】:

          • 应该是START_STICKY
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-12
          • 1970-01-01
          • 2012-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多