我正在使用解释here的Android服务。我在doBindService()
中呼叫onCreate()
并尝试在mBoundservice
中调用onResume()
方法之一。这是我遇到问题的地方。此时,mBoundService
仍然为空,可能是因为尚未调用mConnection.onServiceConnected()
。
是否有某种方法可以在mBoundService
中调用onResume()
的方法,或者没有办法解决它在此时为空?
答案 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();
}
... ...
希望这有帮助。