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

StackOverflow https://stackoverflow.com/questions/8358190

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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
}
Это было полезно?

Решение

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

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

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

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

Другие советы

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

public static Intent markedAsCancelIntent(Intent intent)

это преобразует намерение в отмену намерения, и

public static boolean isCancelIntent(Intent intent).

Класс основан на коде Google с открытым исходным кодом.

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

boolean appRunning;

Следующим в вашем намерении, когда вы установите одобрение FALSE, после того, как после того, как вы можете получить активность, вы можете обернуть код Onhandleintent в логическую:

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

Просто мысль

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top