gpt4 book ai didi

android - bindService, unbindService, android 和非晴天场景

转载 作者:太空狗 更新时间:2023-10-29 14:29:51 29 4
gpt4 key购买 nike

对于过去偶然发现类似疑问的人来说,这更多是关于 Android 内部结构的问题。

问题本质上很简单:

假设我有一个绑定(bind)服务,可以向在其他进程中运行的应用程序提供某些功能 - 我如何知道请求功能的调用者是否仍然存在?

假设我有一个实现远程回调的远程服务,如前所述here ,我怎么能确定还有一个类可以接收回调?清洁是如何进行的?当应用程序离开/崩溃时,绑定(bind)是否会自动关闭,就像打开文件或套接字时发生的那样?

最后:

如果远程应用程序在未解除与我的服务绑定(bind)的情况下崩溃,它会继续运行吗,即使那是最后一个使用该服务的应用程序?

感谢所有提示,伙计们,非常感谢。

最佳答案

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

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

如果外部组件死了(这样正常的回调就会失败),回调有两种期望的行为:

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

关于android - bindService, unbindService, android 和非晴天场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8065215/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com