3

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

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

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

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

bindService我的问题是为什么我和onBind电话之间还有别的东西?我觉得这与线程问题有关。

4

2 回答 2

3

好吧,这不是一个很好的答案,但为什么在你的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(). 这些是用户操作——我只是根据我如何使用它们来命名它们。

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

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

于 2013-04-08T03:01:50.027 回答
0

就我而言,我的问题是在 Android Manifest 中使用元素的android:process属性<service>,这应该可以提高性能,但实际上,一旦服务运行,它可能会这样做,但需要很长时间才能达到onCreate()(因此也达到onBind())。对我来说,这需要几分钟。现在,应用程序和服务运行顺畅且符合预期。

更多信息: https ://developer.android.com/guide/topics/manifest/service-element

于 2022-02-24T11:09:34.717 回答