onResume中的Android服务mBoundService null

时间:2012-04-17 02:06:53

标签: android service

我正在使用解释here的Android服务。我在doBindService()中呼叫onCreate()并尝试在mBoundservice中调用onResume()方法之一。这是我遇到问题的地方。此时,mBoundService仍然为空,可能是因为尚未调用mConnection.onServiceConnected()

是否有某种方法可以在mBoundService中调用onResume()的方法,或者没有办法解决它在此时为空?

1 个答案:

答案 0 :(得分:1)

official dev guide中没有明确说明bindService()实际上是异步调用:

  

客户端可以通过调用bindService()绑定到服务。如果是这样,它必须提供ServiceConnection的实现,它监视与服务的连接。 bindService()方法在没有值的情况下立即返回,但是当Android系统在客户端和服务之间创建连接时,它会调用ServiceConnection上的onServiceConnected(),以提供客户端可以用来与服务通信的IBinder。 / p>

在调用bindService()之后和系统准备/实例化可用服务实例(非NULL)之前存在滞后(尽管是瞬时但仍然滞后),并将其交回ServiceConnection.onServiceConnected()回调。 onCreate()和onResume()之间的时间间隔太短,无法克服延迟(如果活动是第一次打开的话)。

假设您想在onResume()中调用mBoundservice.foo(),一个常见的解决方法是在首次创建活动时调用onServiceConnected()回调函数,并设置一个布尔状态,并且在onResume()方法中,只调用如果状态被设置,则条件控制代码执行,即基于different Activity lifecycle调用mBoundservice.foo():

LocalService mBoundservice = null;
boolean mBound = false;

... ...

private ServiceConnection mConnection = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName className, IBinder service) {
    LocalBinder binder = (LocalBinder) service;
    mBoundservice = binder.getService();
    mBound = true;
    // when activity is first created:
    mBoundservice.foo();
  }

  ... ...
};

... ...

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // call bindService here:
  doBindService();
}

@Override
protected void onResume() {
  super.onResume();
  // when activity is resumed:
  // mBound will not be ready if Activity is first created, in this case use onServiceConnected() callback perform service call.
  if (mBound) // <- or simply check if (mBoundservice != null)
    mBoundservice.foo();
}

... ...

希望这有帮助。