Запускать длинную задачу при вызове onDestroy()

Я хочу запустить долгую операцию из onDestroy() из фрагмента. Моя цель - вызвать сетевой вызов, чтобы удалить некоторые данные в случае, если пользователь закрывает приложение, удаляя его из последних приложений. Я хочу начать намерение, когда вызывается onDestroy().

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

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

Вызов операции из onDestroy() операции привел к той же ошибке.

Конечно, я бы не хотел работать с потоком пользовательского интерфейса и "откладывать" onDestroy() до завершения моей операции.

Просто для очистки, хотя getContext() не является нулевым, к тому времени, когда я достигаю класса SomeService, контекст уже нулевой, так как отправка намерения является асинхронной операцией.

@Override
    public void onDestroy() {
         Intent intent = new Intent(getContext(), SomeService.class);
         getContext().startService(intent);
         super.onDestroy();
    }

2 ответа

Я бы посоветовал начать и связать службу во время, скажем, onCreate() вашей Activity а затем связав сервис, вы можете легко запустить утилиту очистки, расположенную в вашем Service, т.е. вы должны разделить запуск сервиса и запуск очистки.

Подобно:

//somewhere in onCreate()
myServiceIntent = new Intent(this.getApplicationContext(), MyService.class);
context.startService(myServiceIntent);
context.bindService(myServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);

а затем в onDestroy()

public void onDestroy() {
     myService.cleanup();
     super.onDestroy();
}

Узнайте больше о привязке услуг

Помните, что onDestroy() не гарантированно вызывается.

Используйте контекст приложения.

Связанный сервис будет действовать до тех пор, пока к нему привязан любой компонент, поэтому ваш вариант с запущенным сервисом лучше, не забывайте использовать stopSelf() после завершения задания.

Другие вопросы по тегам