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」というエラーが表示されます。

編集:追加の観察を追加

あなたが書いた:

「以下のコードを使用して、サービスがまだ実行されているかどうかを確認します。実行されている場合は、バインドを解除して停止します」

それは漏れを防ぎませんServiceConnectionunbindService()サービスが実行されていなくても、アクティビティがシャットダウンしたときに呼び出す必要があります。安全に無視できる を取得する可能性があるため (サービスに接続していないことを意味します)、への呼び出しを必ずunbindService()try/catch ブロックに配置してください。IllegalArgumentException

于 2012-08-22T10:10:27.207 に答える