检查您是否已在Android中绑定服务的常用方法是在绑定步骤中保留一个布尔参数,例如mBound
,如Android开发人员指南中所述。我注意到这个Android参考教程中存在一个问题,我认为这种方法在某种程度上是一种不好的做法。以下是Bound Services的代码:
这是一个代码块,语言代码为提示:
public class ActivityMessenger extends Activity {
Messenger mService = null;
boolean mBound;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mService = new Messenger(service);
mBound = true;
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
mBound = false;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
// Bind to the service
bindService(new Intent(this, MessengerService.class), mConnection,
Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (mBound) {
unbindService(mConnection);
mBound = false;
}
}
}
好的,这是问题所在。我们假设OnStop()
之后立即调用OnStart()
。您可以通过在OnCreate()
中放置断点来创建此情况,并等待手机屏幕变暗以强制应用程序重新创建,然后继续运行应用程序。
如果发生这种情况,mBount
变量在您运行false
时仍然会OnStop()
,因为尚未调用服务连接onServiceConnected()
。因此,您不会致电unbindService()
,并且您将拥有一个已绑定且永不解除绑定的服务。
有关更好的绑定服务方法的任何建议吗?我想知道在任何情况下调用unbideService()
是否足够(例如调用即使服务现在没有绑定)。
最好的问候
答案 0 :(得分:1)
我还没有在实践中尝试这一点,但是当调用 mBound = true
而不是回调时,设置bindService
似乎是合理的。实际上,documentation表示即使unbindService
返回bindService
,您也应该致电false
(意味着您永远不会收到任何onServiceConnected
来电和mBound
永远不会是真的):
注意:如果方法返回false,则您的客户端没有有效的 连接到服务。但是,您的客户仍应致电 unbindService();否则,您的客户将保留服务 在空闲时关机。
考虑到这一点,很明显只在mBound = true
中设置onServiceConnected
是不够的(或者至少建议)。我怀疑在之前没有绑定时调用unbindService
是无操作,但可能需要一些确认。如果是这样,在调用mBound = true
时设置bindService
似乎是一种很好的方法。