Android: intentservice, как прервать или пропустить задачу в handleintent очереди - PullRequest
15 голосов
/ 06 сентября 2011

У меня есть действие ("ApplicationActivity"), которое вызывает службу намерений ("DownloadService")

IntentService загружает файлы из Интернета в фоновом режиме, но я хочу иметь возможность прервать определенную загрузку .........

Допустим, я поставил 5 файлов в очередь: файл 1,2,3,4,5

Служба намерений начинает загружать номер 1, затем второй и так далее .... 1) Есть ли способ сообщить службе намерений прервать то, что вы делаете в данный момент в событии дескриптора метода (в данном случае загрузка файла 1), и начать загрузку следующего?

2) Можно ли удалить элемент из очереди, например, при загрузке файла 1, удалить файл 4 из очереди, чтобы после номера 3 он шел прямо к 5?

Вскоре мне нужен способ общения с очередью для выполнения этих двух простых операций, но я не нашел ничего полезного в интернете: (

Tnx

Ответы [ 5 ]

19 голосов
/ 23 мая 2012

Спасибо @ 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);
}

Работает как шарм:)

Надеюсь, это кому-нибудь поможет ...

12 голосов
/ 25 октября 2011

Я создаю свой собственный класс MyIntentService, копирующий оригинальный довольно короткий и модифицирующий методы для моих собственных целей ........ в частности, для удаления элемента из очереди вы можете использовать методы ServiceHandler в моем случае
mServiceHandler.removeMessages (appId);
, которые удаляют все ожидающие сообщения с определенным кодом «что» в очереди сообщений, это означает, что вы должны пометить каждое сообщение, которое вы добавляете в очередь, добавив идентификатор внутриполе «что» в каждом сообщении ..... например

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
4 голосов
/ 23 декабря 2014

Расширьте класс 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);
        }
    }
}

Я знаю, что этот код работает, потому что я тестировал его раньше, но я не уверен, что это правильный способ сделать это!

1 голос
/ 06 сентября 2011

Вы можете привязать к службе intentservice и создать метод, чтобы отменить загрузку или удалить ее из очереди.

Здесь - это краткое руководство, которое может вам понадобиться

0 голосов
/ 08 января 2018

Как сказал @JeffreyBlattman выше, лучше быть осторожным, присваивая собственному значению «что» для сообщения, подобного этому

@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).

Надеюсь, это поможет.

...