2010-09-10 71 views
2

我正在尝试编写无法被用户或其他应用程序终止的应用程序。我明白这违背了Android为其平台设计的内容,这更像是一个概念证明。该计划有两个应用程序,app1和app2。当app1启动时,它将启动app2,然后绑定到app2,当app2启动时,它将确保app1启动,如果不启动,则启动它并绑定到app1。在app1上app1和app2绑定的app1的关键点是,当其中一个被杀死时,会调用一个方法,表明绑定已断开连接,然后可以重新启动应用程序。我目前有这些应用程序在启动时互相启动,但当我强行关闭其中一个时,我似乎无法让它们重新启动。创建无法终止的Android服务

对APP的服务我已经和APP 2非常相似:

@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")))); 
} 

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

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

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

+3

只是不叫它天网... – 2010-09-10 15:56:17

+3

@约翰C - “约翰C”,如约翰康纳,我假设?你的封面已被炸毁! – 2010-09-10 16:10:47

回答

2

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

我怀疑你可以用两个.apks做什么,通常会让你不太可能被杀,除了使用户不知道你在做什么。 (如果你的目标是隐瞒用户...这是危险地接近恶意软件。)

告诉平台不杀死你的应用程序的正确方法是Service.startForeground()。这说“用户知道我的服务,所以它会非常好,继续运行。”为了解决这个问题,我们发布了一个通知,以确保用户知道并知道如何摆脱它。

除此之外,该平台对杀死在后台运行的应用程序变得越来越积极。 (当然,虽然服务已经提出要求,但它们可以自动重新启动。)这是导致设备性能不佳的原因之一,因为应用程序滥用后台运行并导致整个系统资源不足。因此,如果有办法解决当前的语义问题,那么可以期望在未来版本的平台中关闭这些语义。

+0

我正在考虑被用户/任务杀手杀死。我完全确定系统会杀死内存应用程序。再一次,这是概念证明,我试图看看这样的应用程序是否可以出于安全原因而构建。我知道这种行为是“危险地接近恶意软件”。主要问题是如何正确绑定到服务,并在服务被终止时调用onServiceDisconnected方法。 – Murdock 2010-09-10 17:29:29

+0

从2.2任务杀手不能杀死服务。在此之前,你无法做任何事情。 – hackbod 2010-09-11 08:33:01

0

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

+0

只有在操作系统关闭服务时才会调用onDestroyed方法,以便应用程序可以执行持久信息等操作。我正在寻找绕过用户或另一个应用程序,以杀死不会触发onDestroy方法的服务。 – Murdock 2010-09-10 17:31:36

1

只是试着去看看..

服务不能被杀死。在的onDestroy方法 ,再次开始服务.. ^^

0

在官方文档我读的方法“onServiceDisconnected()”被调用,只有当你试图绑定到服务,由于某种原因,你可以“T。所以你的连接关闭了。这并不意味着这种方法可以从客户端解除绑定。您应该遵循@Adekdik并使用“onDestroy()”方法。