Android: как отключить, когда пользователь нажимает домой, но не на поворот экрана? - PullRequest
1 голос
/ 12 июля 2011

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

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

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

Заранее благодарим за ваше время.

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

Ответы [ 3 ]

1 голос
/ 13 июля 2011

Я наконец нашел метод ловушки 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 голосов
/ 12 июля 2011

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

0 голосов
/ 12 июля 2011

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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...