Android服务已经泄露,即使它(据说)没有运行

时间:2012-08-22 09:12:37

标签: android android-service

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);
        }

1 个答案:

答案 0 :(得分:3)

您需要在unbindService()中致电onDestroy()。如果绑定连接,则停止服务不会使其停止。

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

编辑:添加其他观察

您写道:

  

“我使用下面的代码检查服务是否仍在运行。如果   它是 - 我解开并阻止它“

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