Запускать длинную задачу при вызове 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() после завершения задания.