Основная активность удалена из стека - установить состояние пользователя как автономное - PullRequest
2 голосов
/ 09 января 2012

Когда основное действие загружено, я могу установить состояние зарегистрированного пользователя как онлайн, обновив строку удаленной базы данных.Если пользователь выходит из приложения, я должен установить состояние пользователя как офлайн.

Если приложение закрывается с помощью кнопки «Назад», у меня есть метод onDestroy (), и там я могу установить состояние пользователя как автономное, но если я выйду с помощью кнопки «Домой» и закрою приложение из настроек onDistroy ()не вызывается.

Есть ли способ узнать, когда основной активности больше нет в стеке, чтобы я мог обновить состояние пользователя?

Ответы [ 2 ]

2 голосов
/ 09 января 2012

onStop будет срабатывать, когда пользователь нажимает кнопку «назад» или «домой». Так что обрабатывайте свои события в onStop.

public void onStop () {
//do your stuff here
super.onStop() 
}

EDIT:

Также попробуйте

@Override
protected void onPause()

super.onPause();




}

Также вы можете проверить, заканчивается ли приложение на

 if (this.isFinishing()){
    //Insert your finishing code here

} 
1 голос
/ 09 января 2012

Кнопка «Домой» не вызывает onDestroy, поскольку действие все еще находится в стеке действий, где, как и в случае с кнопкой «Назад», оно обычно удаляется. Когда ActivityManager решает удалить действие из стека, обычно после периода бездействия или когда требуются ресурсы, будет вызван onDestory, и в этот момент ваше поле будет сброшено.

Я не могу сказать однозначно, потому что я не знаю всей информации, но может показаться, что удаление пользователей, вошедших в состояние, когда вы нажимаете home (в onStart, как предлагает coder_For_Life22), может быть плохим, как если бы Вы вернулись к операции, которую пользователь должен будет снова выполнить, возможно, излишне, и управление сеансами на стороне клиента станет еще более сложным.

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

UPDATE

Единственный способ предположить, что это возможно, - использовать ActivityManager.getRunningTasks() или ActivityManager.getRunningAppProcesses() и проверить, входит ли ваше приложение в их число. Если вы убьете свое приложение так, как вы предлагаете, тогда ваше приложение не будет среди них, и поэтому вы знаете. Это кажется чрезвычайно сложным решением, если это вообще возможно, поскольку вам понадобится отдельная фоновая служба (которую можно вызвать getSystemService(ACTIVITY_SERVICE), чтобы получить ActivityManager), просто после того, как вы убьете свое приложение, у вас все еще будет что-то, что может проверьте это и выполните соответствующие действия.

Убивая ваше приложение таким образом, вы пренебрегаете жизненным циклом активности, и, следовательно, в вашей активности нет ловушки, с помощью которой вы можете выполнять закрытые вызовы.

Кажется, гораздо разумнее проверить отсутствие активности на стороне сервера и сбросить поле таким образом, люди не так часто убивают свои приложения, а когда они делают это, они вряд ли быстро передадут телефон кому-то другому. кто сможет получить доступ к информации злонамеренно.

Если данные требуют такой защиты, вам следует пересмотреть свою модель безопасности.

...