16

インテントサービス( "DownloadService")を呼び出すアクティビティ( "ApplicationActivity")があります

intentServiceはバックグラウンドでインターネットからファイルをダウンロードしますが、特定のダウンロードを中止できるようにしたいです.........

それで、私が5つのファイルをキューに入れたとしましょう:ファイル1、2、3、4、5

インテントサービスは、番号1、次に2番目などのダウンロードを開始します。1)メソッドハンドルイベント(この場合はファイルのダウンロード)で現在実行していることをインテントサービスに中止するように指示する方法はありますか? 1)そして次のものをダウンロードし始めますか?

2)キューから要素を削除することは可能ですか?たとえば、ファイル1をダウンロードしているときに、ファイル4をキューから削除して、番号3の後に5に直接移動するようにしますか?

間もなく、これら2つの簡単な操作を実行するためにキューと通信する方法が必要ですが、インターネット上で有用なものは何も見つかりませんでした:(

Tnx

4

5 に答える 5

19

@ user280560に感謝します、私はあなたのコメントに基づいて解決策を見つけました:)

より具体的な例を示すために、特定の場合にキューをクリアしたいと思いました。

まず、ここからIntentService.javaソースをプロジェクトにコピーしました(名前を変更する必要はありません。IntentService.javaを保持できます。Androidではなく自分のソースをインポートするだけです)。それから私はこれを追加しました

public void clearQueue() {
    Debug.PrintInfo(TAG, "All requests removed from queue");
    mServiceHandler.removeMessages(0);
}

私のIntentServiceソースに。

ここで、IntentServiceを拡張するサービスから、特定のアクション(ログイン)がサービスに渡されたときにキューをクリアしたかったので、次のようにonStartMethodをオーバーライドします。

@Override
public void onStart(Intent intent, int startId) {
    if(intent.getAction().equals(ACTION_LOGIN)) {
        //Login clears messages in the queue
        clearQueue();
    }
    super.onStart(intent, startId);
}

魅力のように機能します:)

それが誰かを助けることを願っています...

于 2012-05-23T10:02:51.370 に答える
12

かなり短い元のクラスをコピーして独自のMyIntentServiceクラスを作成し、独自の目的でメソッドを変更します........特に要素をデキューするには、私の場合はServiceHandlerのメソッドを使用できます
mServiceHandler.removeMessages(appId) ;
これは、メッセージキューにある特定のコード「what」のメッセージの保留中の投稿を削除します。これは、キューに追加する各メッセージにラベルを付けて、各メッセージの「what」フィールド内に識別子を追加する必要があることを意味します。 ..例えば

public void onStart(Intent intent, int startId) 
{
    super.onStart(intent, startId);
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    msg.what = intent.getIntExtra("appId", 0); \\parameters that come from the outside
于 2011-10-25T17:36:51.503 に答える
5

IntentServiceクラスを拡張し、キャンセルされたアイテムのリストを宣言します。キャンセルする場合は、このリストに追加します。最後に、インテントを処理する前に、それがキャンセルされていないことを確認してください。

public class MyDownloadService extends IntentService {
    private static List<String> canceledUrl;

    public static void cancelDownload(String url){
         canceledUrl.add(url);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String url = intent.getStringExtra(EXTRA_URL);

            if(!canceledUrl.contains(url)) //if download has not been canceled already
                downloadFile(url);
            else
                canceledUrl.remove(url);
        }
    }
}

以前にテストしたので、このコードが機能することはわかっていますが、それが正しい方法かどうかはわかりません。

于 2014-12-23T14:27:37.160 に答える
1

インテントサービスにバインドして、ダウンロードをキャンセルまたはキューから外すメソッドを作成できます。

これがあなたが必要とするかもしれないものの簡単なチュートリアルです

于 2011-09-06T11:16:19.530 に答える
0

上記の@JeffreyBlattmanが述べたように、このようなメッセージに独自の「what」値を割り当てることで、安全にプレイすることをお勧めします。

@Override
    public void onStart(@Nullable Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        msg.what = 0;
        mServiceHandler.sendMessage(msg);
    }

のようにキューをクリアしますmServiceHandler.removeMessages(0)

お役に立てば幸いです。

于 2018-01-08T15:04:39.490 に答える