web-dev-qa-db-ja.com

stopServiceメソッドが呼び出されてもサービスは停止しません

現在、開始時に正常に実行されるサービスがありますが、stopServiceメソッドを使用して停止しようとすると、onDestroyメソッドは呼び出されません。

以下は、サービスを停止しようとするために使用するコードです

stop_Scan_Button =(ボタン)findViewById(R.id.stopScanButton);

_stop_Scan_Button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v){
        Log.d("DEBUGSERVICE", "Stop Button pressed");
        Intent service = new Intent(CiceroEngine. CICERO_SERVICE);
        releaseBind();
        Log.d("Stop_Scan_Button", "Service: " + service.toString());
        stopService(service);
        Log.d("Stop_Scan_Button", "Service should stop! ");

        }   
});
_

StopServiceを使用すると、ServiceのonDestroyメソッドが呼び出されると思いますか?スキャン停止ボタンを押しても、サービスのonDestroy()メソッドは呼び出されません。

サービスを停止するために入れる必要がある他に何か不足していますか?

編集:onServiceConnected()の代わりにstopServiceが実行されたときにonServiceDisconnected()が追加されると、なぜそれが起こるのですか?

編集:バインディングに関する情報を追加するには

OnCreate()メソッドでbindServiceを呼び出し、releaseBind()メソッドでサービスのバインドを解除します。

そのメソッドのコードは次のとおりです。

_ public void releaseBind(){
    unbindService(this);
  }
_

だから私は、バインド解除が私の問題ではないと思いますか?

25
Donal Rafferty

releaseBind()のメソッド呼び出しがあることは、以前にこのサービスでbindService()を呼び出したこと、およびreleaseBind()unbindService()を呼び出していることを意味すると思います。私の推測が間違っている場合は、この回答を無視してください。


すべてのbindService()呼び出しに対応するunbindService()呼び出しが行われた後、サービスはシャットダウンします。バインドされたクライアントが存在しない場合、誰かがサービスでstopService()を呼び出した場合にのみ、startService()も必要になります。

そのため、ここにはいくつかの可能性があります。

  1. バインドされたクライアント(他のアクティビティなど)がまだある場合は、バインドを解除するまでサービスを停止できません
  2. unbindService()stopService()は非同期であるため、タイミングに問題が生じる可能性があります。その場合、ServiceConnectionstopService()メソッドからonServiceDisconnected()を呼び出すと、運が良くなる可能性があります

また、破壊されるサービスの正確なタイミングはAndroidまでであり、即時ではない可能性があることに注意してください。たとえば、onDestroy()に依存している場合実行中の作業を停止するサービスを作成するには、そのための別のトリガーの使用を検討してください(たとえば、サービスバインダーインターフェイスを介してstopDoingStuff()メソッドを呼び出すアクティビティ)。

43
CommonsWare

すべてのバインディングが閉じられていますか?

サービスは2つの方法で使用できます。 2つのモードは完全に分離されていません。 startService()で開始されたサービスにバインドできます。たとえば、再生する音楽を識別するIntentオブジェクトを指定してstartService()を呼び出すと、バックグラウンドミュージックサービスを開始できます。後になって、おそらくユーザーがプレーヤーを制御したり、現在の曲に関する情報を取得したい場合、bindService()を呼び出してサービスへの接続を確立します。このような場合、stopService()は実際にサービスを停止しません、最後のバインディングが閉じられるまで

10
JRL

回答が遅れて申し訳ありませんが、私が知る限り、このコードでサービスを停止できました。ここで link を確認できます。

public void onClick(View src) {
switch (src.getId()) {
case R.id.buttonStart:
  Log.d(TAG, "onClick: starting srvice");
  startService(new Intent(this, MyService.class));
  break;
case R.id.buttonStop:
  Log.d(TAG, "onClick: stopping srvice");
  stopService(new Intent(this, MyService.class));
  break;
}
}

およびサービスクラス:

    public class MyService extends Service {
       private static final String TAG = "MyService";


@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onCreate");


}

@Override
public void onDestroy() {
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onDestroy");

}

@Override
public void onStart(Intent intent, int startid) {
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
    Log.d(TAG, "onStart");

}
}
4
dondondon