我正在使用此处解释的 android 服务。我正在打电话并试图doBindService()
在. 这是我遇到问题的地方。此时,仍然为空,大概是因为还没有被调用。onCreate()
mBoundservice
onResume()
mBoundService
mConnection.onServiceConnected()
有没有办法可以调用mBoundService
in 的方法onResume()
,或者当时没有办法解决它为 null 的问题?
官方开发指南中没有明确说明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();
}
... ...
希望这可以帮助。