Я работаю над приложением, которое поддерживает соединение для нескольких целей, таких как публикация обновлений принимающего местоположения. В соответствии с андроидным способом делать что-то и советом из других ответов я не переопределял поведение android по умолчанию для уничтожения и воссоздания приложения при вращении экрана, и в этом отношении все хорошо работает.
Я поддерживаю связь с методом onRetainNonConfigurationInstance. Проблема в том, что я хотел бы закрыть соединение, когда пользователь нажимает "Домой", приложение сведено к минимуму или по какой-то другой причине теряет фокус, но НЕ, когда экран повернут - поэтому я не могу сделать это в onPause, onStop или OnDestroy без некоторые проверки, так как они называются один за другим при изменении конфигурации. Поскольку это прямо сейчас, я использую isFinishing(), чтобы проверить, закрыто ли приложение, но случай, когда пользователь нажимает "Домой", не влечет за собой isFinishing() == true (что имеет смысл).
Одно из решений, о котором я подумал, это проверка того, имеет ли приложение фокус в потоке, обрабатывающем обновления соединения, и просто закрывайте его, если какое-то время прошло без фокуса - но я чувствую, что должен быть какой-то лучший способ сделать это?
Спасибо заранее за ваше время.
(Отредактировано, чтобы выяснить, что касается жизненного цикла деятельности и onRetainNonConfigurationInstance, после прочтения ответов)
Я наконец нашел метод hook onUserLeaveHint() в Activity, который делает то, что я хочу, по крайней мере, для случаев, которые я видел до сих пор. То есть, соединение сохраняется во время перезапуска из-за изменений конфигурации, но закрывается, когда пользователь нажимает на себя или обратно. Таким образом, решение, в котором я закончил, похоже на код ниже. Все, что не имеет отношения к вопросу, было отрезано, и имена были упрощены.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (m_connection == null) {
Connection connection = (Connection) getLastNonConfigurationInstance(); // Try to get a saved version of the connection
if (connection != null) {
m_connection = connection;
}
else {
m_connection = new Connection(); // Else create a new one
}
}
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible, connect.
if (!m_connection.isConnected())
m_connection.connect();
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
m_bUserLeaving = false;
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped").
if (m_bUserLeaving && m_connection.isConnected()){ // Disconnect if we stopped because the user left
m_connection.disconnect();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing() && m_connection.isConnected()) { // Often means that the user pressed back
m_connection.disconnect();
}
}
@Override
public Object onRetainNonConfigurationInstance() {
// If we get the chance, keep our connection for later use
return m_connection;
}
@Override
protected void onUserLeaveHint() {
m_bUserLeaving = true;
}
По моему мнению, вы должны обращаться с вращением устройства и сохранять все значения/действия, которые вы хотите поддерживать после завершения вращения.
И для нажатия кнопки home используйте onPause()
чтобы остановить сетевую активность и onResume()
чтобы перезапустить ее
Вы должны проверить это сообщение, чтобы лучше понять жизненный цикл деятельности и его обратные вызовы. Нет необходимости реализовывать некоторые сложные механизмы или переопределять нажатие кнопки HOME. Вы должны просто опубликовать весь свой код, который вы хотите запустить при закрытии приложения, в onback() или onStop() обратные вызовы активности. Разница между теми, которые вы можете найти в ссылке выше. Надеюсь это поможет.