2

我正面临着我的应用程序的一个奇怪问题。我有一个在后台运行的LocationService。我管理其生命周期的方法是:启动服务时bindService()和onBind()之间的延迟

  1. onResume,每一次活动都使用bindService(intent,serviceConnection, BIND_AUTO_CREATE)喜欢在需要时该服务会自动创建。
  2. onStop,每一次活动都使用unbindService(serviceConnection)
  3. 这工作,因为开关的活动时,新ActivityonResume是老ActivityonStop方法

我已经是这个问题之前调用,可以说我从一开始主屏幕上,我用一个包含片段的活动启动应用程序。函数调用的顺序如下

  1. 活动onCreate - >setContentView这里叫
  2. 活动onResume - >这里bindService被调用,并应创建Service
  3. 片段onResume
  4. 服务onBind方法被称为

我的问题是为什么我的bindServiceonBind调用之间还有其他东西?我有一种感觉,这与线程问题有关。

+3

延迟是一个预期的行为,因为bindService()确实是一个异步调用,请参阅[这个答案](http://stackoverflow.com/questions/10802456/when-exactly-onserviceconnected-for-bounded-service - 将被称为/ 10807311#10807311)了解更多详情。 – yorkw 2013-04-08 03:07:22

+0

谢谢,它并没有说它是在文档中的异步调用,这就是为什么我感到困惑。你想把它作为答案吗? – chopchop 2013-04-09 01:35:33

+0

嘿,我认为我是不必要的冗长,但我没有说过同样的事情(我相信在发布约克的评论之前)。我不打算得到赏金,但如果你认为我的回答是错误的,请对此作出评论。 – Tom 2013-04-09 02:30:39

回答

2

嗯,这不是一个很好的答案,但为什么你的bindService()onBind()调用之间没有别的东西?您似乎认为当您调用绑定时,系统会立即创建并启动您的服务,并且不提供此类保证。

您还没有指定是否为IntentService,或者只是一个普通的服务,这可能会影响服务启动的速度,但我的回答是一样的。

此外,我假设您的服务onBind()返回后,您的ServiceConnection对象被调用,如预期的那样。

我说这不是基于阅读任何明确的内容,而是因为我有类似的经历:我很惊讶和烦恼,在我的服务创建和我的ServiceConnection被调用之前需要多长时间,尽管我从服务的onBind非常快。 (我的碎片需要服务中的数据来创建初始用户界面,所以创建服务的任何延迟意味着延迟向用户显示初始用户界面。)

最后,我决定启动我的服务使用意图而不是绑定,例如

Intent si = new Intent(this, com.company.MyService.class); 
si.setAction(MyService.SVC_BIND); 
startService(si); 

然后我发送了MyService.SVC_UNBIND来代替调用unbind。当我在我的服务中收到UNBIND意图时,我会清理,然后致电stopSelf()。这些是用户操作 - 我只是将它们命名为我如何使用它们。

我相信这是更快,但回顾我的代码的意见,我没有任何具体细节。请注意,这意味着没有ServiceConnection,但我正在进行一些直接调用该服务的活动,并使用LocalBroadcastManager一个公平的位。

另一个选择考虑(为了使您的服务更快地启动,如果这是您的目标?)是在Appliction.onCreate()中启动它,而不是等待Activity.onResume()。所有这些选项都有必要做一些额外的工作,以确定何时停止服务,与您当前正常的计划相比,这些工作将由您负责。