gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:30:52 25 4
gpt4 key购买 nike

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

  1. onResume 中,每个 Activity 都使用 bindService(intent,serviceConnection, BIND_AUTO_CREATE),以便在需要时自动创建服务。
  2. onStop中,每个 Activity 都使用unbindService(serviceConnection)
  3. 这是有效的,因为当切换 Activity 时,新的 Activity onResume 在旧的 Activity onStop 方法之前被调用

我遇到的问题是,假设我从主屏幕开始,然后使用其中包含 fragment 的 Activity 启动应用程序。函数调用顺序如下

  1. Activity onCreate --> setContentView 在这里调用
  2. Activity onResume --> 这里 bindService 被调用并且应该创建 Service
  3. fragment onResume
  4. 调用服务onBind方法

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

最佳答案

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

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

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

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

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

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

然后我发送 MyService.SVC_UNBIND 来代替调用解除绑定(bind)。当我在我的服务中收到 UNBIND Intent 时,我会进行清理,然后调用 stopSelf()。这些是用户操作 - 我只是根据我的使用方式命名它们。

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

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

关于android - 启动服务时 bindService() 和 onBind() 之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802040/

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