onDestroy()
中的我使用下面的代码检查服务是否仍在运行。如果是 - 我解开并停止它。
public boolean isServiceRunning(Class<?> serviceClass) {
String serviceClassName = serviceClass.getName();
final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
for(RunningServiceInfo runningServiceInfo : services){
if(runningServiceInfo.service.getClassName().equals(serviceClassName)){
return true;
}
}
return false;
}
现在我遇到isServiceRunning
返回false的情况,但在onDestroy()
之后我收到一条错误消息,指出ServiceConnection已泄露。为什么会这样?
修改:
这就是我开始Service
(在onCreate()
中)的方式:
startService(posServiceIntent);
bindService(posServiceIntent, posConn, BIND_AUTO_CREATE);
和
posServiceIntent = new Intent(getApplicationContext(), PositionService.class);
private ServiceConnection posConn = new PosServiceConnection();
public class PosServiceConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "PosServiceBinder connected [name: " + name.toShortString() + "].");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "PosServiceBinder disconnected [name: " + name.toShortString() + "].");
}
}
protected void onDestroy() {
if(isServiceRunning(PositionService.class)){
Log.d(TAG, "Stopping PositionService in " + MainActivity.class.getSimpleName() + ".onDestroy()");
unbindService(posConn);
stopService(posServiceIntent);
}
答案 0 :(得分:3)
您需要在unbindService()
中致电onDestroy()
。如果绑定连接,则停止服务不会使其停止。
在任何情况下,都会出现“ServiceConnection泄露”错误,因为您仍然具有与服务的绑定连接。
编辑:添加其他观察
您写道:
“我使用下面的代码检查服务是否仍在运行。如果 它是 - 我解开并阻止它“
这不会阻止ServiceConnection
泄露。即使您的服务不再运行,您也需要在活动关闭时致电unbindService()
。确保将调用unbindService()
放在try / catch块中,因为它可以获得IllegalArgumentException
,你可以放心地忽略它(这意味着你没有连接到服务)。