Зміни конфігурації і життєвий цикл активності в Android додатку

&nbsp

Вище ми розповіли, як можна спровокувати систему Android завершити процес, в якому працює активність або будь-який інший компонент програми Для цього потрібно просто запустити досить багато додатків, щоб системі довелося завершити деякі процеси Якщо після цього переглянути реєстраційний журнал і рис 115, то можна побачити, що ID процесу змінюється і що створюється новий екземпляр підкласу Activity, що визначає, як програма буде взаємодіяти з користувачем Цей новий екземпляр перезавантажує всі ресурси для даної активності, а якщо в програмі є які-небудь дані програми, які потрібно перезавантажити, то вони також будуть завантажені заново У підсумку виходить, що користувач продовжує працювати з нібито «тієї ж самої» активністю, як ніби нічого й не сталося Новий екземпляр виглядає точно як старий, оскільки має рівно той же стан, що і старий

Існує й інший спосіб примусити Android використовувати новий екземпляр Activity: змінити конфігурацію системи Найпоширеніше зміна конфігурації в додатку – це зміна орієнтації екрану Але феномени, зараховувані до змін конфігурації, набагато різноманітніше: наприклад, можливість підключення фізичної клавіатури, зміна локалі, зміна розмірів шрифту і ін Найбільш загальним фактором при всіх змінах конфігурації є те, що такі зміни можуть вимагати перезавантаження ресурсів, зазвичай тому, що потрібно перерахунок компонування елементів

Найпростіший спосіб переконатися в тому, що всі ресурси, використовувані в активності, перезавантажувались з урахуванням нової конфігурації, – обовязково скидати старий екземпляр активності і створювати новий, щоб при цьому і перезавантажувалися всі ресурси Щоб це сталося, коли додаток працює в емуляторі, натисніть клавішу 9 на числовій клавіатурі Після цього в емуляторі зміниться орієнтація екрану У реєстраційному журналі ви побачите приблизно таку ж інформацію, як на рис 116 У журналі буде показано, що викликаний метод onDestroy, оскільки екземпляр Actіvity скидається в рамках процесу зміни конфігурації, а не через те, що в системі не вистачає памяті і вона намагається завершити процес, щоб вивільнити память Ви також помітите, що у всіх нових примірниках обєкта Actіvity ID (ідентифікатор) процесу залишається одним і тим же – системі не доводиться відновлювати ту память, яку використовує додаток

Рис 116 При виклику методу onDestroy ідентифікаційний номер процесу не змінюється

Такий підхід може здатися марнотратним: новий екземпляр Activity Навіщо Чому б не користуватися тим, який вже є Хіба створення нового екземпляра не забариться роботу Проте в більшості випадків ресурси, що завантажуються активністю, коли вона запускається, складають основну частину стану екземпляра Activity У багатьох випадках основний обсяг обчислень, що протікають в активності, відбувається тоді, коли вона зчитує XML-файл і розраховує компоновку І, як правило, зміни конфігурації – наприклад, орієнтації екрану або локалі – вимагають перерахунку практично для всіх макетів, завантажених з ресурсів Отже, зміна конфігурації практично неминуче призводить до перезапуску активності, а також до витрат процесорного часу, які потрібні для такого перезапуску

Не забувайте, що, коли Android «знищує» активність, відбувається, по суті, всього одна річ: скидається посилання на дану активність, і ця активність в результаті потрапляє в збірку сміття Всякий раз, коли користувач переходить від однієї активності до іншої, виконуються всі розрахунки, необхідні для створення нової активності Якщо робити те ж саме, коли відбувається зміна конфігурації, то це буде не надто складним завданням для системи

Джерело: Android Програмування на Java для нового покоління мобільних пристроїв

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*