【问题标题】:Binding to Service in onCreate() or in onResume()在 onCreate() 或 onResume() 中绑定到服务
【发布时间】:2014-08-18 20:31:25
【问题描述】:

我想知道 Activity 中绑定服务的最佳位置是什么? 我在onResume()onCreate() 中看到了这样做的例子。我问自己将它放入onCreate() 是否不是问题,因为在onPause() 我将取消绑定到服务,所以如果我离开活动,我不会得到 serviceConnectionLeak。现在,如果我按下主屏幕按钮,然后切换到主屏幕,则 Activity 将与服务解除绑定,当我从任务管理器返回 Activity 时,将不会调用 onCreate() 并且如果代码正在尝试从服务访问一个函数我会得到一个 NullPointerException。如果我只在onResume()onPause() 中绑定和取消绑定,我就没有这个问题。我说的对吗?

【问题讨论】:

  • 我再次查看了一些在 onCreate() 中绑定的示例,它们在 onDestroy() 中解除绑定,而不是在 onPause() 中。但对我来说仍然不清楚。

标签: android


【解决方案1】:

我通常建议在 onCreate()/onDestroy()onStart()/onStop() 中执行此操作,具体取决于您想要的语义:

    1234563允许在后台发生这种情况,因此如果用户返回,您将准备好数据),那么onCreate()/onDestroy() 可能是合适的。请注意,这里的语义是您的Activity 在整个运行期间都需要Service,因此如果此Service 在另一个进程中运行,那么您增加了它的权重并使其更有可能在后台被杀死。
  • 如果您的Activity 只对在可见时使用Service 感兴趣,那么onStart()/onStop() 是合适的。这意味着您的Activity 将在用户离开时与Service 解除绑定(并且不再可见),并在下次返回时重新连接并重新启动和恢复。

    李>

我一般不建议在onResume()onPause() 中执行绑定/取消绑定。这些通常不会显着减少您使用Service 的数量(以及您的开销),事实上,因为在每次活动转换时都会发生暂停和恢复,这是您希望尽可能轻量级的代码路径.在此处执行此操作可能会产生其他意想不到的负面后果:例如,如果您的应用程序中的多个 Activitys 绑定到同一个 Service,当其中两个活动之间存在转换时,Service 也可能被销毁并重新创建为当前的Activity 在下一个恢复之前暂停。

此外,这些对(onCreate()/onDestroy()onStart()/onStop()onPause()/onResume())旨在成为获取和释放资源的正确对(例如绑定到 @ 987654351@s、注册接收器等),以确保它们在被需要之前被正确获取并在不再需要时释放(而不是泄露)。

【讨论】:

  • 将其放入 onResume() 就足够了吗? if (listAdapter == null) {listAdapter = new MyListAdapter(getApplicationContext());}
  • 但有时@hackbod,...我在释放 stopService() 和 unbindService() 时也遇到了同样的错误,通过绑定到该服务的每个活动的 onStop() 方法。并且...所以,为了消除错误,我只是把 try-and-catch 放在那里......解决了! :D
【解决方案2】:

你说的是对的。在大多数情况下,您需要在onResume() 注册并在onPause() 取消注册。如果你使用onCreate()onDestroy(),当你被暂停时,你仍然会注册更新,这是一个坏公民。如果您在onCreate() 注册并在onPause() 取消注册,当您恢复任务时,注册将消失,这几乎肯定不是您想要的。

【讨论】:

  • “如果你使用 OnCreate() 和 Destroy(),当你暂停时你仍然会注册更新,这是一个坏公民。”您有可以引用此声明的来源吗?
  • 这是我的理解,但我听从你的意见。这不正确吗?
  • 好吧,我知道这不是一般性陈述。相对于服务,有“注册更新”的概念作为要求。当您的活动离开屏幕时,您可能特别想取消绑定(因此可能关闭)某些服务。其他你可能没有。例如,与 GPS 相关的服务可能想要关闭,但前提是应用程序长时间不在屏幕上,这样用户就不会因为必须重新获取 GPS 定位而感到沮丧。现在,可能还有比我更好的建议,这就是我问你是否有消息来源的原因。
  • 我应该更具体。我试图说明的一点是,只要有可能,我认为尽快清理以将更多资源留给其他应用程序是一个很好的规则。如果您有合理的需要更长时间地保留资源(如在您的示例中重新获取资源的时间很长),那么它就不那么简单了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多