Имитировать Android-приложение, сброшенное из памяти

У меня есть приложение для Android, которое входит на сервер, получает идентификатор сеанса и использует его, пока приложение работает. Идентификатор сеанса хранится в файле SharedPeferences .

По какой-то причине на одном устройстве (старый Samsung Galaxy S) иногда, когда приложение просыпается, идентификатор сеанса исчезает - его нельзя получить из SharedPreferences, а вместо этого - возвращается ноль. Это происходит, вероятно, после интенсивного использования телефона, когда Android требует освобождения ресурсов памяти. Обратите внимание, что приложение все еще живо, оно не перезапускается с нуля - моя активность просто вызывается onResume.

Я был бы очень рад, если бы смог воспроизвести это поведение на эмуляторе. Есть ли способ заставить эмулятор делать то же самое?


person zmbq    schedule 14.04.2013    source источник
comment
Вы пытались уменьшить ресурсы эмулятора до ресурсов Samsung Galaxy S или даже больше?   -  person D-Dᴙum    schedule 14.04.2013


Ответы (1)


Я был бы удивлен, если бы в таких ситуациях ваша активность также не вызывала onCreate. Стратегия тестирования такого рода вещей на эмуляторе состоит в том, чтобы приостановить все действия в вашем приложении, а затем использовать adb для завершения процесса. Это в основном то, что делает фреймворк, когда ему не хватает ресурсов. Когда вы возобновляете действие, он создает новый процесс и пытается повторно инициализировать ваше действие из состояния, которое было сохранено, когда оно было приостановлено.

person Ted Hopp    schedule 14.04.2013
comment
Как бы вы включили это в свой рабочий процесс? Мне нужно смоделировать, как ОС убивает приложение, чтобы я мог отследить исключение NulLReference. - person Chase Florell; 06.05.2014
comment
nm... убийство приложения - это не то, что мне нужно... это больше похоже на состояние гибернации, которое я ищу. - person Chase Florell; 06.05.2014
comment
@ChaseFlorell — чтобы имитировать, что операционная система убивает приложение, приостановите работу приложения (например, нажав «Домой» или имитируя телефонный звонок). Затем используйте ADB, чтобы убить процесс приложения. Я не знаю о состоянии гибернации в Android; можно поподробней что нужно сделать? - person Ted Hopp; 06.05.2014
comment
да, я не уверен в термине. Это состояние, в котором приложение переходит, когда оно не убито, а как бы находится в спящем режиме. Это происходит, когда я выхожу на домашний экран, а затем кладу телефон в карман на пару часов. Когда я снова открываю приложение, оно не запускается заново (IE: нет заставки), но и не переходит сразу к последнему действию. Он показывает пустую активность в течение короткого промежутка времени, пока он повторно инициализирует некоторые биты. Именно в этом состоянии я получаю исключение NullReferenceException в своем контейнере IoC. - person Chase Florell; 06.05.2014
comment
@ChaseFlorell - это очень похоже на то, что ОС убила процесс приложения. Пустая активность — это, вероятно, ОС, пытающаяся восстановить активность в верхней части стека задач для вашего приложения. Сбой приложения или нет, может зависеть от того, какая активность была на вершине стека, когда приложение было приостановлено. Приостановка приложения и уничтожение процесса приложения через adb должны надежно имитировать одну и ту же последовательность событий. - person Ted Hopp; 06.05.2014