我正在尝试编写一个不能被用户或其他应用程序杀死的应用程序。我知道这违背了 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/