android - 创建一个无法被杀死的Android服务

标签 android service

我正在尝试编写一个不能被用户或其他应用程序杀死的应用程序。我知道这违背了 Android 为其平台设计的内容,这更多的是概念验证。该计划是两个有两个应用程序,app1 和 app2。当app1启动时,它会启动app2,然后绑定(bind)到app2上,当app2启动时,它会确保app1已启动,如果没有启动,则启动它并绑定(bind)到app1上。 app1 绑定(bind)到 app2 上,app2 绑定(bind)到 app1 上的目的是,当其中一个被杀死时,将调用一个方法来断开绑定(bind),然后可以重新启动应用程序。目前,我的应用程序在启动时会相互启动,但当我强行关闭其中一个应用程序时,我似乎无法让它们重新启动。

对于 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 永远不会被调用。我认为这可能是因为我没有正确绑定(bind)到服务。

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

所以我的问题是,如何将服务绑定(bind)在一起,以便当一个服务被强制关闭时我会收到另一个服务的通知?

最佳答案

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

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

告诉平台不要终止您的应用程序的正确方法是使用 Service.startForeground()。这表示“用户知道我的服务,因此它继续运行真是太好了。”为此,我们会发布一条通知,以确保用户知道它并知道如何删除它。

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

关于android - 创建一个无法被杀死的Android服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3686161/

相关文章:

java - 除了读取 smali 代码之外,还有其他逆向方法吗?

android - 连接VPN后没有下载应用程序

java - Android Imageview 上的大图像因 OOM 错误导致应用程序崩溃

Angular4 尝试比较 '[object Object]' 时出错

c++ - 以编程方式重新启动所有崩溃服务的服务程序

android - 如何禁用 SDL 启动屏幕?

Android studio 添加库项目(使用新项目)

.net - Windows 服务 - 安装 2 个副本

android - Android后台服务中的蓝牙连接?

.net - 什么是 "web services"?