我的应用程序遇到了一个奇怪的问题。我有一个在后台运行的LocationService。我管理其生命周期的方式是:
onResume
中,每个活动都使用bindService(intent,serviceConnection, BIND_AUTO_CREATE)
,就像在需要时自动创建服务一样。onStop
中,每项活动都使用unbindService(serviceConnection)
Activity
onResume
方法之前调用新的Activity
onStop
我遇到的问题是,让我说我从主屏幕开始,然后使用包含片段的Activity启动应用程序。函数调用的顺序如下
onCreate
- > setContentView
在这里被称为onResume
- >此处bindService
已调用,应创建Service
onResume
onBind
方法我的问题是为什么我的bindService
和onBind
来电之间还有别的东西?我觉得这与线程问题有关。
答案 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()
。所有这些选项都需要做一些额外的工作来确定何时停止服务,与您正在处理的当前正常计划相比。