В случае использования, когда пользователь должен выполнить онлайн-транзакцию, например, онлайн-платеж, используя приложение.
Это должно быть сделано без блокировки пользовательского интерфейса, поэтому я собирался использовать AsyncTask. Проблема заключается в следующем сценарии: - пользователь поворачивает телефон или получает входящий звонок в середине транзакции, тем самым вызывая действие.
Если я правильно понял, в asynctask теперь есть ссылка на устаревший объект. Поэтому после завершения транзакции невозможно сообщить пользователю о результатах. Это?
Должна ли использоваться услуга?
Большая путаница в отношении класса Service фактически вращается вокруг того, что это не так:
- Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит.
- Служба не является нитью. Это не значит, что нужно выполнять работу основного потока (чтобы избежать ошибок, связанных с ошибками приложения).
Служба - это просто компонент, который может работать в фоновом режиме, даже если пользователь не взаимодействует с вашим приложением. Таким образом, вы должны создать услугу, только если это то, что вам нужно.
Если вам необходимо выполнить работу вне основного потока, но только в то время, когда пользователь взаимодействует с вашим приложением, вам, вероятно, следует вместо этого создать новый поток, а не службу. Например, если вы хотите воспроизвести какую-либо музыку, но только во время работы, вы можете создать поток в onCreate(), запустить его в onStart(), а затем остановить его в onStop(). Также рассмотрите использование AsyncTask или HandlerThread вместо традиционного класса Thread. Дополнительную информацию о потоках см. В документе Процессы и Threading.
Помните, что если вы используете службу, она по-прежнему работает в основном потоке приложения по умолчанию, поэтому вы должны создать новый поток в службе, если он выполняет интенсивные или блокирующие операции.
Если конфигурация устройства (как определено классом Resource.Configuration) изменится, то все, что отображает пользовательский интерфейс, необходимо будет обновить в соответствии с этой конфигурацией. Поскольку Activity является основным механизмом взаимодействия с пользователем, он включает специальную поддержку для обработки изменений конфигурации.
Если вы не укажете иное, изменение конфигурации (например, изменение ориентации экрана, языка, устройств ввода и т.д.) Приведет к уничтожению вашей текущей активности, выполнению процесса жизненного цикла обычной активности onPause(), onStop() и onDestroy() в зависимости от ситуации. Если действие было на переднем плане или видимо для пользователя, как только onDestroy() вызывается в этом экземпляре, тогда будет создан новый экземпляр действия с любым сохраненнымInstanceState предыдущего экземпляра, сгенерированным из onSaveInstanceState (Bundle).
В некоторых особых случаях вы можете обойти перезапуск своей активности на основе одного или нескольких типов изменений конфигурации. Это делается с помощью атрибута android: configChanges в его манифесте. Для любых изменений конфигурации вы говорите, что вы там работаете, вы получите вызов вашей текущей активности onConfigurationChanged (Configuration) вместо перезапуска. Однако если изменение конфигурации связано с тем, что вы не обрабатываете, активность все равно будет перезапущена, а onConfigurationChanged (Configuration) не будет вызываться.