Android: как отключить, когда пользователь нажимает домой, но не на поворот экрана?

1

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

Я поддерживаю связь с методом onRetainNonConfigurationInstance. Проблема в том, что я хотел бы закрыть соединение, когда пользователь нажимает "Домой", приложение сведено к минимуму или по какой-то другой причине теряет фокус, но НЕ, когда экран повернут - поэтому я не могу сделать это в onPause, onStop или OnDestroy без некоторые проверки, так как они называются один за другим при изменении конфигурации. Поскольку это прямо сейчас, я использую isFinishing(), чтобы проверить, закрыто ли приложение, но случай, когда пользователь нажимает "Домой", не влечет за собой isFinishing() == true (что имеет смысл).

Одно из решений, о котором я подумал, это проверка того, имеет ли приложение фокус в потоке, обрабатывающем обновления соединения, и просто закрывайте его, если какое-то время прошло без фокуса - но я чувствую, что должен быть какой-то лучший способ сделать это?

Спасибо заранее за ваше время.

(Отредактировано, чтобы выяснить, что касается жизненного цикла деятельности и onRetainNonConfigurationInstance, после прочтения ответов)

Теги:
android-lifecycle
ondestroy

3 ответа

1
Лучший ответ

Я наконец нашел метод 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;
}
  • 0
    О, спасибо :-) (У меня была та же проблема, и я делаю, чтобы отсчет времени отключал пользователя, если он не вернулся через 10 секунд после)
  • 0
    @Guillaume Да, он точно не выделен нигде в документации по жизненному циклу или на диаграмме путей состояний.
0

По моему мнению, вы должны обращаться с вращением устройства и сохранять все значения/действия, которые вы хотите поддерживать после завершения вращения.
И для нажатия кнопки home используйте onPause() чтобы остановить сетевую активность и onResume() чтобы перезапустить ее

  • 0
    В этой дискуссии кажется, что люди соглашаются с тем, что следует прибегать к ручной обработке изменений конфигурации только в том случае, если больше ничего не будет работать.
0

Вы должны проверить это сообщение, чтобы лучше понять жизненный цикл деятельности и его обратные вызовы. Нет необходимости реализовывать некоторые сложные механизмы или переопределять нажатие кнопки HOME. Вы должны просто опубликовать весь свой код, который вы хотите запустить при закрытии приложения, в onback() или onStop() обратные вызовы активности. Разница между теми, которые вы можете найти в ссылке выше. Надеюсь это поможет.

  • 0
    Спасибо, но я уже прочитал эти документы. Если я не понял их неправильно, при изменении конфигурации, например, при повороте экрана, onPause (), onStop () и onDestroy () вызываются один за другим. Дело в том, что отключение, которое я хочу, НЕ должно происходить при повороте экрана, но ДОЛЖНО произойти, когда приложение свернуто. Так как onStop () вызывается, когда приложение сворачивается И когда конфигурация изменяется при ротации, мне нужен способ различать случаи в onStop () или другом методе. У меня есть соединение, сохраненное с помощью метода onRetainNonConfigurationInstance.
  • 0
    Я отредактировал вопрос так, чтобы моя проблема стала более ясной, основываясь на ответе Егора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню