启动服务时,bindService()和onBind()之间的延迟

时间:2013-04-04 03:32:29

标签: android binding android-fragments android-activity android-service

我的应用程序遇到了一个奇怪的问题。我有一个在后台运行的LocationService。我管理其生命周期的方式是:

  1. onResume中,每个活动都使用bindService(intent,serviceConnection, BIND_AUTO_CREATE),就像在需要时自动创建服务一样。
  2. onStop中,每项活动都使用unbindService(serviceConnection)
  3. 这是有效的,因为在切换活动时,在旧的Activity onResume方法之前调用新的Activity onStop
  4. 我遇到的问题是,让我说我从主屏幕开始,然后使用包含片段的Activity启动应用程序。函数调用的顺序如下

    1. 活动onCreate - > setContentView在这里被称为
    2. 活动onResume - >此处bindService已调用,应创建Service
    3. 片段onResume
    4. 称为服务onBind方法
    5. 我的问题是为什么我的bindServiceonBind来电之间还有别的东西?我觉得这与线程问题有关。

1 个答案:

答案 0 :(得分:2)

嗯,这不是一个很好的答案,但为什么在bindService()onBind()来电之间不会有其他内容?您似乎在假设当您调用bind时,系统将立即创建并启动您的服务,并且不提供此类保证。

您尚未说明您的是IntentService还是普通服务,这可能会影响您的服务启动速度,但我的回答是一样的。

此外,我假设您的ServiceConnection对象在服务onBind()返回后的某个时间按预期调用。

我说这不是基于阅读任何明确的内容,而是因为我有类似的经历:在我的服务创建和ServiceConnection被调用之前,我感到惊讶和恼火,即使我很快从服务的onBind返回。 (我的片段需要来自服务的数据来创建初始UI,因此任何创建服务的延迟都意味着向用户显示初始UI的延迟。)

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

Intent si = new Intent( this, com.company.MyService.class );
si.setAction( MyService.SVC_BIND );
startService( si );
然后我发送MyService.SVC_UNBIND代替打电话取消绑定。当我在我的服务中收到UNBIND意图时,我进行了清理,然后拨打stopSelf()。这些是用户操作 - 我只是根据我的使用方式命名它们。

我相信这更快,但回顾我对该代码的评论,我没有任何具体细节。请注意,这意味着没有ServiceConnection,但我正在从活动中直接调用服务,并使用LocalBroadcastManager一点点。

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