Как отменить все ожидающие намерения, которые запрашиваются для Службы намерений - PullRequest
4 голосов
/ 02 декабря 2011

У меня есть служба intentservice, которая автоматически запрашивается пользователем и моим приложением. Мне нужно иметь возможность убить все ожидающие намерения, которые запрашиваются, когда пользователь выходит из моего приложения, но я не могу заставить это работать. Я пробовал stopService () и stopself (), но намерения продолжают запускать intentservice после выхода пользователя из системы. Я бы попытался получить идентификатор намерения, но это сложно, так как каждый раз, когда служба intent запускается, переменная, содержащая идентификатор намерения, пуста. Вот мой код службы поддержки:

public class MainUploadIntentService extends IntentService {
private final String TAG = "MAINUPLOADINTSER";
private GMLHandsetApplication app = null;
private SimpleDateFormat sdf = null;
public boolean recStops = true;

public MainUploadIntentService() {
    super("Main Upload Intent Service");

    GMLHandsetApplication.writeToLogs(TAG,
            "GMLMainUploadIntentService Constructor");

}

@Override
protected void onHandleIntent(Intent intent) {
GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Started");
if (app == null) {
    app = (GMLHandsetApplication) getApplication();
}
uploadData(app);
    GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Finished");
}

@Override
public void onDestroy() {
GMLHandsetApplication.writeToLogs(TAG, "onDestroy Started");
app = null;
    stopSelf();
    GMLHandsetApplication.writeToLogs(TAG, "onDestroy completed");
}

public void uploadData(GMLHandsetApplication appl) {
    //All of my code that needs to be ran
}

Ответы [ 3 ]

4 голосов
/ 03 декабря 2011

К сожалению, я не думаю, что это возможно сделать с помощью стандартных методов IntentService, поскольку он не предлагает способа прервать его, пока он уже идет.

Есть несколько вариантов, которые я могу себе представитьиз этого вы можете попытаться проверить, соответствуют ли они вашим потребностям.

  1. Скопируйте код IntentService, чтобы внести в него собственные изменения, которые позволят вам удалить ожидающие сообщения.Похоже, что здесь кто-то добился определенного успеха: Android: intentservice, как прервать или пропустить задачу в очереди handleintent
  2. Вместо того, чтобы копировать весь код IntentService, вы также можетеПривязывайте его как обычный сервис (поскольку IntentService расширяет сервис), чтобы вы могли написать собственную функцию для удаления ожидающих сообщений.Этот также упоминается в этой ссылке.
  3. Вместо этого переписать IntentService как обычный сервис.С этой опцией у вас будет больший контроль над добавлением и удалением сообщений.

У меня было что-то похожее на ситуацию, когда я использовал IntentService, и в итоге я вместо этого просто преобразовал его в Сервис,Это позволило мне запускать задачи одновременно, а также отменять их, когда мне нужно было их очистить.

0 голосов
/ 05 июня 2016

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

boolean appRunning;

Далее, когда вы устанавливаете appRunning равным false, после действия onPause или onDestroy вы можете перенести onhandleintent.код в логическом виде:

 protected void onHandleIntent(final Intent intent) {
     if(MainActivity.appRunning){
       ...
     }
}

Просто мысль

0 голосов
/ 25 сентября 2012

Здесь Когда я должен освободить собственные маркеры (Android NDK)? - это класс HangAroundIntentService, который имеет метод cancelQueue().Класс также имеет метод

public static Intent markedAsCancelIntent(Intent intent)

, который преобразует намерение в намерение отмены, и

public static boolean isCancelIntent(Intent intent).

на основе открытого кода Google.

...