【问题标题】:Android local service unbind issueAndroid本地服务解除绑定问题
【发布时间】:2012-03-13 14:04:39
【问题描述】:

我创建了 Android 服务文章扩展 Binder 类http://developer.android.com/guide/topics/fundamentals/bound-services.html 中提供的示例本地服务项目。

一切正常。但是查询是

使用 unbind(),服务不会停止。如果是,我是否需要明确使用 stopSelf() 而不是 unbind() 所做的。

我创建了带有三个按钮的示例项目 -> 开始、停止和获取

start --> 绑定服务

stop --> 解除绑定服务

start --> 访问服务的方法。 (随机数生成方法)

现在访问:

  1. 开始-绑定服务

  2. fetch - 获取服务方法的访问权限

  3. 停止 - 取消绑定服务

这里我例外的是服务将被解除绑定和销毁。不过

第 4 步:获取 - 此方法仍然有效并生成随机数,而预期是某种异常或可能被强制关闭。

(onServiceDisconnected 不会被调用:因为它只会在崩溃的情况下被调用)

【问题讨论】:

  • This question and answer 似乎正是您想要的。
  • "使用 unbind(),服务不会停止。" ——你是怎么确定的? “停止”是什么意思?
  • @CommonsWare:为了清楚起见,我已经编辑了我的问题。
  • @FishBreath:感谢您添加对我有帮助的链接。我的查询怎么样。为什么我能够执行第 4 步。

标签: android android-service


【解决方案1】:

对于远程服务——您绑定到的服务位于另一个进程中——在解除绑定后尝试调用 binder 代理上的方法应该会导致 RemoteException

对于本地服务(该服务仍在您的进程中),在解除绑定后尝试调用活页夹上的方法可能仍然有效。在这种情况下,活页夹与您的服务通过onBind() 返回的对象完全相同。垃圾收集规则规定,如果您持有活页夹,活页夹不能被垃圾收集。

但是,在解除绑定后调用活页夹上的方法是危险且糟糕的形式。 服务 认为它已被破坏。如果您的活页夹依赖于 onDestroy() 中清理的服务, 可能会导致崩溃。同样,您正在泄漏服务的内存,直到您允许对绑定器进行垃圾回收。

顺便说一句,我希望您的服务做的事情比“生成随机数”更有意义。您不需要为此提供服务。

【讨论】:

  • 感谢您提供宝贵的信息。关于随机数生成:) 正如我的查询中已经提到的;这是一个学习服务的示例项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多