我正在尝试编写一个无法被用户或其他应用程序杀死的应用程序。我理解这与Android为其平台设计的内容相悖,这更像是一个概念证明。该计划有两个应用程序app1和app2。当app1启动时,它将启动app2,然后绑定到app2,当app2启动时,它将确保app1启动,如果没有,然后启动它并绑定到app1。 App1上的app1绑定和app1上的app2绑定是这样的,当其中一个被杀死时,将调用一个方法,绑定已经断开,然后可以重新启动应用程序。我目前让应用程序在启动时互相启动,但是当我强制关闭其中一个时,我似乎无法让它们重新启动。
对于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
所以我的问题是,如何将服务绑定在一起,这样当一个人被强制关闭时,我会收到另一个通知?
答案 0 :(得分:2)
首先需要指定“不能被杀”。由用户?通过平台?任务杀手?
我怀疑你能用两个.apks做些什么来让你不太可能被杀死,除了让用户模糊你正在做什么。 (如果你的目标是模糊用户......这就是危险地接近恶意软件。)
告诉平台不要杀死你的应用程序的正确方法是使用Service.startForeground()。这说“用户知道我的服务,所以继续运行真的很不错。”与此同时,发布通知以确保用户了解它并知道如何摆脱它。
除此之外,该平台越来越积极地杀死在后台运行的应用程序。 (当然,对于已经请求的服务,它们可以自动重启。)这是设备性能不佳的原因之一,因为应用程序滥用在后台运行并导致整个系统的资源运行不足。因此,如果有解决当前语义的方法,您可以期望在未来版本的平台中关闭它们。
答案 1 :(得分:1)
试着回答.. 服务不能被杀死。 在onDestroy方法中,再次启动服务.. ^^
答案 2 :(得分:0)
我的想法是在你的服务的onDestroy方法中发送一个广播,这样其他服务就可以知道它被销毁了。
答案 3 :(得分:0)
在官方文档中,我读到只有在您尝试绑定服务时才会调用方法“onServiceDisconnected()”,并且出于某种原因,您不能。所以你的连接关闭了。这并不意味着此方法从客户端捕获解除绑定。您应该关注@Adekdik并使用方法“onDestroy()”。