1

我正在使用此处解释的 android 服务。我正在打电话并试图doBindService()在. 这是我遇到问题的地方。此时,仍然为空,大概是因为还没有被调用。onCreate()mBoundserviceonResume()mBoundServicemConnection.onServiceConnected()

有没有办法可以调用mBoundServicein 的方法onResume(),或者当时没有办法解决它为 null 的问题?

4

1 回答 1

1

官方开发指南中没有明确说明bindService() 实际上是一个异步调用:

客户端可以通过调用 bindService() 绑定到服务。当它这样做时,它必须提供一个 ServiceConnection 的实现,它监视与服务的连接。bindService() 方法不带值立即返回,但是当 Android 系统在客户端和服务之间建立连接时,它会在 ServiceConnection 上调用 onServiceConnected() 来传递客户端可以用来与服务通信的 IBinder。

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

假设你想在 onResume() 中调用 mBoundservice.foo(),一个常见的解决方法是在第一次创建活动时在 onServiceConnected() 回调中调用它,并设置一个布尔状态,并且在 onResume() 方法中,只有当设置状态,以有条件地控制代码执行,即根据不同的 Activity 生命周期调用 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();
}

... ...

希望这可以帮助。

于 2012-04-17T03:15:30.480 回答