Как отменить все ожидаемые намерения, которые будут предназначены для службы намерения
-
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, так как это не предлагает их прерывать, пока он уже идет.
Есть несколько вариантов, о которых я могу подумать, что вы можете попробовать, чтобы они соответствовали вашей потребности.
- Скопируйте код intentservice, чтобы внести свои собственные модификации, которые позволили бы вам удалить ожидающие сообщения. Похоже, кто -то имел некоторый успех с этим здесь: Android: intentservice, как прервать или пропустить задачу в очереди в ручке
- Вместо того, чтобы копировать весь код intentservice, вы также можете привязать к нему, как обычный сервис (так как Intentservice Extends Service), чтобы вы могли написать свою собственную функцию для удаления ожидающих сообщений. Этот также упоминается в этой ссылке.
- Вместо этого переписывайте намеренный сервис как обычный сервис. С помощью этой опции у вас будет больше контроля над добавлением и удалением сообщений.
У меня было то, что звучало как похожая ситуация, когда я использовал намеренный сервис, и в конце концов я просто преобразовал его в сервис. Это позволило мне выполнить задачи одновременно, а также отменить их, когда мне нужно было их очистить.
Другие советы
ЗдесьКогда я должен освободить нативные (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){
...
}
}
Просто мысль