リストビューにたくさんの曲が含まれています。曲がクリックされるたびに、IntentServiceを呼び出して、この曲を順番にダウンロードします。
ただし、ダウンロードをキャンセルしたい場合があります(例:5番目)。これは、5番目に実行されているIntentServiceを停止する必要があることを意味します。stopService()を呼び出して停止しようとしましたが、機能しません。
IntentServiceを停止する良い方法を教えてもらえますか?どうもありがとうございました。
リストビューにたくさんの曲が含まれています。曲がクリックされるたびに、IntentServiceを呼び出して、この曲を順番にダウンロードします。
ただし、ダウンロードをキャンセルしたい場合があります(例:5番目)。これは、5番目に実行されているIntentServiceを停止する必要があることを意味します。stopService()を呼び出して停止しようとしましたが、機能しません。
IntentServiceを停止する良い方法を教えてもらえますか?どうもありがとうございました。
マニフェストの要素IntentService
ごとに実行中の が 1 つだけあります。6 回<service>
呼び出した場合、実行されるのは最大で 1 つです。別のコマンドが送信されたときに がコマンドを処理している場合、コマンドはキューに入れられ、 によって一度に 1 つずつ処理されます。startService()
IntentService
onHandleIntent()
IntentService
あなたの場合、未処理のコマンドを で簡単にキャンセルできないIntentService
ため、独自のバージョンの を作成する必要があります。独自のワーク キューを持つIntentService
独自のサブクラスを作成Service
し、まだ実行されていないコマンドをキャンセルできるようにする必要があります。ランニング。
インテントサービスを使用してダウンロード中に同じ問題が発生しました。私のアプリでは、ダウンロードごとに独自の通知があり、クリックするとダウンロードを停止したいと考えています。
onStartCommand() メソッド (新しいインテントが到着したときに呼び出される) をオーバーライドすることで解決しました。1 つのダウンロードを閉じたいと思ったとき、「stopid」と呼ばれるエクストラを使用して新しいインテントを開始しました。
Intent stopIntent = new Intent(DialogActivity.this,DownloadIntentService.class);
stopIntent.putExtra("stopid", id);
startService(stopIntent);
onStartCommand() メソッドは次のようになります。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int id = intent.getExtras().getInt("stopid");
if(id!=0) {
stopList.add(id);
}
return super.onStartCommand(intent, flags, startId);
}
通常のインテントの場合は、ダウンロードの ID を追加としてインテントに入れるだけです。onHandle() メソッドでダウンロードを実行している間、stopList に現在のダウンロード インテントの ID が含まれているかどうかを頻繁に確認してください。含まれている場合は、ダウンロードを停止し、stopList から ID を削除します。