2012-08-22 31 views
4

onDestroy()我使用下面的代码检查服务是否仍在运行。如果是 - 我解开并停止它。虽然(假定)没有运行,但Android服务已经泄漏

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

你如何实例化服务?你能粘贴该代码吗? – tolgap

+0

已添加@tolgap代码。 – alex

回答

3

你需要调用unbindService()onDestroy()。如果服务绑定了连接,停止服务将不会停止。

在任何情况下,都会显示错误“ServiceConnection泄漏”,因为您仍然有与服务的绑定连接。

编辑:添加额外的观察

您写道:

“我检查是否该服务使用下面的代码仍然在运行。如果 是 - 我拆散并停止它。”

这不会阻止泄漏ServiceConnection。即使您的服务不再运行,当您的活动关闭时,您也需要致电unbindService()。确保将电话unbindService()放在try/catch块中,因为可以得到IllegalArgumentException,您可以放心地忽略它(这意味着您没有连接服务)。

+0

正确。当活动被销毁时,绑定服务必须解除绑定。当你这样读,这听起来很合逻辑,呃? – tolgap

+0

@tolgap好吧我解决了这个问题,因为它不清楚,当你读它时,我停止**和**解除绑定服务。 – alex

+0

发布您用于停止和解除绑定服务的代码。 –

相关问题