bindService,unbindService,android和非晴天场景

时间:2011-11-09 12:44:51

标签: android service

对于那些在过去偶然遇到类似疑虑的人来说,这更像是一个关于Android内部的问题。

问题本质上非常简单:

假设我有一个绑定服务,为其他进程中运行的应用程序提供某些功能 - 我怎么知道调用者请求功能是否仍在那里?

假设我有一个实现远程回调的远程服务,如提到here,我怎么能确定还有一个类来接收回调?如何清洁?应用程序离开/崩溃时绑定是否自动关闭,打开文件或套接字的方式是什么?

最后:

如果远程应用程序在没有解除绑定的情况下崩溃,它是否会继续运行,即使那是使用该服务的最后一个应用程序?

感谢所有的提示,伙计们,欣赏它。

2 个答案:

答案 0 :(得分:1)

我刚刚对此进行了测试,即使外部组件因未能解除绑定而泄漏ServiceConnection,Android也会终止该服务(前提是它尚未使用startService启动,并且未绑定到其他位置)。在这种情况下,将调用onUnbind和onDestroy。

至于检测注册回调的组件是否还活着,我相信CommonsWare是正确的,你应该尝试回调。但是,您应该能够唤醒调用组件,并将其唤醒。

如果外部组件已死,则回调中有两种所需行为(这样正常的回调将失败):

  1. 如果相关组件仍处于活动状态,则外部组件只需要从您的服务接收回调。在这种情况下,只需通过尝试调用死回调来吞下(并记录)抛出的异常。
  2. 当您的服务尝试回调时,应该唤醒不再存在的外部组件。由于您无法通过常规回调方法执行此操作,因此您需要触发一些唤醒死组件的意图。执行此操作的简单方法是为组件提供方法以向您的服务注册PendingIntent。如果正常回调失败,只需触发PendingIntent即可。外部组件(应该已注册为关联的Intent的接收者)将被唤醒,并适当地响应意图,可能通过reBinding和调用其他方法来检索失败的回调的结果。需要注意的是,如果你允许呼叫者死亡,并且他们希望醒来,你需要服务通过startService()启动,并适当停止,否则你可能会在你做的时候被收集在触发PendingIntent
  3. 之前请求的工作

答案 1 :(得分:0)

  

假设我有一个绑定服务,为其他进程中运行的应用程序提供某些功能 - 我怎么知道调用者请求功能是否仍在那里?

你没有,AFAIK。

  

假设我有一个实现远程回调的远程服务,就像这里提到的那样,我怎么能确定还有一个类来接收回调呢?

如果回调对象不再可用(例如,客户端已消失),您应该获得RemoteObjectException

  

如何进行清洁?

我不知道在这种情况下这意味着什么,抱歉。

  应用程序离开/崩溃时,

绑定是否自动关闭,打开文件或套接字的方式是什么?

是的,虽然您在服务中未收到有关此事实的通知。

  

如果远程应用程序在没有解除绑定的情况下崩溃,它是否会继续运行,即使那是使用该服务的最后一个应用程序?

我不确定。我希望Android会检测到这一点并停止服务,但我还没试过。