2012-04-17 3 views
0

Я столкнулся с аналогичной проблемой, например this one. Я использую некоторые статические члены класса, включающие синглтоны в моем приложении. Когда я покидаю основное действие с помощью функции finish() и запускаю его снова, все статические члены все еще присутствуют. Похоже, что это не хорошее решение назвать Process.killProcess (Process.myPid()); и я также не хочу отключать все статические элементы, когда я покидаю приложение, потому что это связано с ошибкой при расширении приложения. Итак, как можно полностью отказаться от приложения Android?Как полностью прекратить андроид?

ответ

1

Просто некоторые важные замечания по этой теме (как я думаю):

Это важный аспект программирования Android. Проверка документации по жизненному циклу активности здесь http://developer.android.com/reference/android/app/Activity.html на самом деле не справедливо объясняет это поведение - как я думаю.

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

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

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

Обнуление переменных просто увеличивает вероятность для GC. Вы не можете заставить разгружать afaik. Таким образом, нет никакого способа «полностью выйти из приложения» в этом смысле.

Нужно разработать приложение - более сложные - вокруг этого поведения системы.

Это мое понимание до сих пор - к сожалению, я не нашел никакой хорошей полной документации по этому вопросу.

Если я ошибаюсь, пожалуйста, простите и исправьте!

5

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

+0

Проблема в том, что один синглтон запускает поток, и я не хочу, чтобы он работал, когда приложение закрыто. когда я перезапускаю приложение, поток не перезапускается, так как я сделал это в конструкторе singleletons. –

+0

@zolex: Синглтон никогда не должен начинать нить. Исправьте приложение, чтобы иметь реальный компонент (активность или услугу), управляющий потоком, и использовать его методы жизненного цикла (например, 'onCreate()' и 'onDestroy()' для службы), заботятся о очистке потока. – CommonsWare

+0

почему бы не начать игру? –

1

Как @CommonsWare сказал, что вы можете оставить свой статический член, и ОС Android позаботится об этом, и если вам все еще нужно, вы можете переопределить onDestroy() и свести на нет все ваши статические переменные. Тогда он будет пустым, когда ваше приложение запустится в следующий раз.

+0

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

Смежные вопросы