4

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(in 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);
        }
4

1 回答 1

3

你需要打电话unbindService()进来onDestroy()。如果服务已绑定连接,停止服务不会使其停止。

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

编辑:添加额外的观察

你写了:

“我使用下面的代码检查服务是否仍在运行。如果是 - 我取消绑定并停止它”

这不会阻止泄漏ServiceConnection. unbindService()即使您的服务不再运行,您也需要在您的活动关闭时调用。确保将调用unbindService()放在 try/catch 块中,因为可以获得IllegalArgumentException可以安全忽略的调用(这意味着您与服务没有连接)。

于 2012-08-22T10:10:27.207 回答