【问题标题】:Creating an Android Service that cannot be killed创建一个无法被杀死的 Android 服务
【发布时间】:2023-03-16 10:36:01
【问题描述】:

我正在尝试编写一个不能被用户或其他应用程序杀死的应用程序。我知道这与 Android 为其平台设计的内容背道而驰,这更像是一个概念证明。该计划是两个有两个应用程序,app1和app2。 app1启动时会启动app2然后绑定到app2上,app2启动时会确认app1是否启动,如果没有启动则启动并绑定到app1上。 app1 在 app2 上绑定和 app2 在 app1 上绑定的意义在于,当其中一个被杀死时,将调用一个方法,表明绑定已断开连接,然后可以重新启动应用程序。我目前有应用程序在启动时相互启动,但是当我强制关闭其中一个时,我似乎无法让它们重新启动。

对于我拥有的 App1 服务和 app2 非常相似:

    @Override
public void onCreate()
{
    this.setForeground(true);
    this.startService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))));
    this.bindService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))), mConnection,
            BIND_DEBUG_UNBIND);

对于实现 ServiceConnection 的类,我有:

    @Override
public void onServiceDisconnected(ComponentName name)
{
    Log.d(TAG, "onServiceDisconnected:" + name.getClassName());
    mContext.startService((new Intent()
            .setComponent(new ComponentName("com.app2",
                    "com.app2.App2Service"))));
}

我认为我遇到的问题是,当 app1 或 app2 被杀死时,onServiceDisconnected 永远不会被调用。我认为这可能是因为我没有正确绑定到服务。

W/JavaBinder(  884): ibinderForJavaObject: 0x436274a0 is not a Binder object
W/JavaBinder(  891): ibinderForJavaObject: 0x43621d30 is not a Binder object

所以我的问题是,我怎样才能将服务绑定在一起,以便当一个被强制关闭时我会收到另一个通知?

【问题讨论】:

  • @John C - “John C”,就像在 John Connor 中一样,我猜?你的掩护被炸毁了!

标签: android service


【解决方案1】:

你首先需要指定“不能被杀死”。由用户?靠平台?任务杀手?

我怀疑你可以用两个 .apk 做些什么来降低你被杀的可能性,除了让用户模糊你在做什么。 (如果您的目标是让用户模糊不清……这是危险地接近恶意软件。)

告诉平台不要杀死你的应用程序的正确方法是使用 Service.startForeground()。这表示“用户知道我的服务,因此它继续运行会非常好。”与此同时,会发布一条通知以确保用户知道它并知道如何摆脱它。

除此之外,该平台在杀死后台运行的应用程序方面变得越来越激进。 (当然,对于已请求的服务,它们可以自动重新启动。)这是设备性能不佳的原因之一,因为应用程序滥用在后台运行并导致整个系统的资源不足。因此,如果有解决当前语义的方法,您可以预期这些方法将在平台的未来版本中关闭。

【讨论】:

  • 我正在考虑被用户/任务杀手杀死。我完全同意系统杀死应用程序以获取内存。这再次是概念验证,我试图看看是否可以出于安全原因构建这样的应用程序。我理解这种行为是“危险地接近恶意软件”。主要问题是如何正确绑定到服务并在服务被终止时调用 onServiceDisconnected 方法。
  • 从 2.2 开始,任务杀手不能杀死服务。在此之前,你真的无能为力。
【解决方案2】:

只是尝试回答..

服务不能被杀死。 在 onDestroy 方法中,再次启动服务.. ^^

【讨论】:

    【解决方案3】:

    我的想法是在您的服务的 onDestroy 方法中发送一个广播,以便其他服务可以知道它已被销毁。

    【讨论】:

    • onDestroyed 方法仅在操作系统关闭服务时被调用,因此应用程序可以执行诸如持久信息之类的操作。我希望绕过用户或其他应用程序杀死不触发 onDestroy 方法的服务。
    【解决方案4】:

    在官方文档中,我读到“onServiceDisconnected()”方法仅在您尝试绑定到服务时才被调用,并且由于某种原因您不能。所以你的连接被关闭了。这并不意味着此方法从客户端捕获解除绑定。您应该遵循@Adekdik 并改用“onDestroy()”方法。

    【讨论】:

      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 2015-12-13
      相关资源
      最近更新 更多