什么时候可以调用Android Activity生命周期中的绑定服务?

问题描述 投票:3回答:3

我是Android开发的新手,正在为绑定服务的概念而苦恼。

我将一个服务绑定到了Activity的 onCreate 活动方式

startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

mConnection 是一个 ServiceConnection 对象,我已经为其覆盖了 onServiceConnected 回调方法

在回调中。mService 的类成员 LibraryService, LibraryService 是我的子类 Service)被设置为引用 LibraryService 对象进行绑定。

mService = binder.getService();

我以为在onCreate中调用bindService后,我就可以通过mService引用调用LibraryService,但此时它仍然被设置为null,表明onServiceConnected回调没有被执行。

我试着打印了一个由一个 "服务 "生成的字符串的值。mService 方法中使用日志。

if (mService != null) {
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: " + mService.getLogFileName("pulse"));             
} else {
    Log.d(LOG_TAG, "In onCreate getLogFileName string value: null");                
}

正如我所提到的 - 在onCreate中仍然是空的,然后我在onStart和onResume中添加了同样的日志代码,但mService仍然是空的。

我的问题是,这个回调什么时候被执行?我认为它必须发生在 onCreate 方法,但显然不是。我想我需要一些指导,当回调被Android系统执行时,我需要一些指导。

我知道回调确实会被执行,因为我已经在实例化mService的语句上设置了一个断点,并且它击中了那个语句。我只是不明白它什么时候发生,也就是说,我怎么知道什么时候可以假设为 mService 已设置?我是否只能在正文中访问它?OnServiceConnected 回调?

android android-activity android-service
3个回答
2
投票

服务绑定是异步的,因此,你必须用一点同步来处理这个问题。因此,在调用绑定服务之后,你可以做一些类似于

synchronized(this){
   while(mBoundInstance == null)
      this.wait();
}

中的onServiceConnected。

synchronized(this){
   this.notify(); //wakes up thread: now mBoundInstance is 100% != null
}

注意,把那个等待放在一个asyncTask中是很好的,这样ui就不会被冻结。


0
投票

请看一下 https:/stuff.mit.eduafssipbprojectandroiddocsguidecomponentsbound-services.html。

那里写着:"你只需要在你的活动可见时与服务交互。

  • 你只需要在你的活动可见时与服务交互,你应该在onStart()期间绑定,在onStop()期间解除绑定。
  • 如果你想让你的活动在后台停止时也能收到响应,那么你可以在onCreate()期间绑定,在onDestroy()期间解除绑定。请注意,这意味着你的活动在整个运行过程中(甚至在后台)都需要使用该服务,所以如果该服务在另一个进程中,那么你就会增加该进程的权重,系统就更有可能杀死它。
  • 在你的activity的onResume()和onPause()期间,你通常不应该绑定和解除绑定。

0
投票

现在我重新阅读了你的问题和描述,我想你想知道一些其他的东西.我不删除第一个答案,因为如果只看问题的标题,它通常是正确的答案。

通常你想真正建立你的UI在onResume之后。或者你会启动一个线程,定期轮询你的服务--然后在Resume时启动这个线程(在Pause时停止)。你可以把 "init "代码移到一个特殊的init()方法中。

onStart你调用bindServiceonResume你检查mService是不是空的,然后你启动init()方法(如果你只是把你的活动放在后台不久,那么它就不会在onStop上,而只会调用onPause和onResume)。

另外,你从你的ServiceConnection匿名类中调用init(),就在你从binder对象中分配mService之后。

记住总是在ServiceConnectionon.ServiceDisconnected中把mService清空,并且在你调用onStop()中的unbindService()之后也要清空。另外记住:你不能在一次绑定(和解绑)完成后重新使用ServiceConnection对象。它将给出一个异常。所以只要在每一个新的绑定(onStartonStop的每一个周期)上做一个新的ServiceConnection即可。

© www.soinside.com 2019 - 2024. All rights reserved.