2010-10-14 4 views
0

Я понимаю, когда действие закрывается, вызывается onDestroy(). Но это не всегда верно? Иногда вызывается onPause().Android: При выходе приложения?

Итак, предположим, что я хочу очистить память, когда действие закрывается, где именно я это делаю? Так как onDestory не может быть вызван, я не могу сохранить его там, либо правильно?

Разработка: У меня есть 2 вида деятельности A1 и A2. A1 запускается при запуске приложения. A1 вызывает A2 позже. Предположим, что я создаю объект класса в onCreate() Activity A1. Этот объект должен быть удален при выходе из приложения, то есть когда приложение больше не отображается. Лучшее место для этого в onDestroy() или onStop() для A1? Я предполагаю, что onPause() может не быть подходящим местом, потому что onPause() вызывается, когда A1 вызывает A2, и я не хочу удалять объект.

-Kiki

+0

Какую память вы хотите выпустить? Это может быть выпущено для вас в зависимости от ситуации. В общем случае ваше приложение не отображается, когда вызывается onStop, так что это довольно безопасный вариант. Если вы освободите память здесь, хотя вам нужно будет перераспределить ее в onStart, так как она не будет повторно входить в CreateCreate, если вызывается onDestroy. –

+0

Скажем, объект класса создается в onCreate() и должен быть удален, когда приложение завершено. Поэтому вы предлагаете его создать в onStart() и удалить в onStop()? Но у меня есть ответы, говорящие onStop(), которые не всегда могут быть вызваны. – kiki

ответ

3

Я думаю, что вы имеете в виду onPause(), нет метода onSuspend(). Если ваша активность закрывается чисто, она будет вызывать onStop() и onDestroy().

Если система работает с низким объемом памяти и хочет убить вашу деятельность, то гарантируется, что onPause() будет вызван до того, как ваш процесс будет убит, но это единственная гарантия. Методы onStop() и onDestroy() не могут быть вызваны. Поэтому вы должны очистить onPause().

Однако ... не забывайте, что ваша деятельность может многократно переходить между onResume() и onPause(), поэтому вы не хотите делать слишком много распределений и очистки в этих двух методах, они должны быть быстрыми ,

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

+0

Да, я имел в виду onPause(), а не onSuspend(). Изменили вопрос. Не могли бы вы еще раз проверить? Потому что я думаю, что onPause() не соответствует моему сценарию. – kiki

+0

память, выделенная в onCreate(), должна быть выпущена в onDestroy(). Это освобождает память, когда ваша деятельность создается и уничтожается в течение обычной жизни. Единственный раз, когда onDestroy() не будет вызван, находится в ситуации с низкой памятью, когда ваша активность убивается, чтобы освободить память. В этом случае это не имеет значения, потому что весь ваш процесс уходит, и это включает в себя VM и всю память, которую он дал вам в A1. Это не будет важно вообще, если А1 не должен информировать о какой-либо другой деятельности, что он уходит, для этого вам нужно использовать onPause() –

+0

Кроме того, если вам нужно сообщить другое действие, которое вы уходите, единственное сообщение, которое вы можете отправить, - это внутри onPause(), и вы можете сообщить другой активности, что «я останавливаюсь, больше не полагаюсь на меня» ... вот и все. Если другое действие может зависать, потому что A1 уходит, не сообщая о другом действии, вам нужно рассмотреть это и запрограммировать его. Если это просто память, о которой вы беспокоитесь, не беспокойтесь, это не важно в этом сценарии. напишите это правильно, чтобы освободить память в onDestroy(), а также освободите ее, когда она вам больше не нужна, особенно. если он большой –

1

документы Google говорят, что делать то, что нужно сделать перед выходом в OnPause(), потому что да, в условиях плохой памяти OnDestroy() не может быть названо.

+0

Хм, но onPause действия будет вызываться, если он переместится на другую активность в том же приложении. Я хочу, чтобы память была выпущена только тогда, когда приложение завершает работу, то есть, например, нажмите кнопку «Назад», чтобы активировать эту активность. – kiki

+0

Я понимаю. Все, о чем я говорю, это то, что я считаю, что Google сказал, что onDestroy() может не всегда вызываться в ситуациях с низкой памятью. Но onPause() всегда будет вызываться при выходе из активности. Кнопка «Назад» не всегда (если когда-либо?) Вызывает onDestroy(), но кнопка «Домой» или «Закончить»() делает.Насколько я знаю. Просто пытаюсь помочь, но я не эксперт, поэтому, если я ошибаюсь, возможно, некоторые более продвинутые люди могли бы прыгнуть сюда и исправить меня. – ShadowGod

1

Я не думаю, что onSuspend() существует. Он не упоминается в документации. Возможно, вы имеете в виду onStop().

Когда вызывается onStop(), действие больше не видимо, но еще не уничтожено. Завершение действительно происходит после вызова onDestroy(), завершено ли оно завершением вызова() или требованиями к памяти от Android, как говорится в документации. Тогда, по моему мнению, подходящее место для свободной памяти - onDestroy().

Если вам нужно остановить операции с интенсивным использованием процессора, связанные с взаимодействием с пользователем, сделайте это в onPause().

+0

Я имел ввиду onPause, извините. Но будет ли всегда называться «Дестрой»? Это безопасно? – kiki

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