Операції, android developers

Ключові класи

Див. також:

Як правило, програма містить кілька операцій, які слабо пов'язані один з одним. Зазвичай одна з операцій в додатку позначається як «основна», пропонована користувачеві при першому запуску програми. У свою чергу, кожна операція може запустити іншу операцію для виконання різних дій. Кожен раз, коли запускається нова операція, попередня операція зупиняється, однак система зберігає її в стек ( «стек переходів назад»). При запуску нової операції вона поміщається в стек переходів назад і відображається для користувача. Стек переходів назад працює за принципом «останнім увійшов - першим вийшов», тому після того як користувач завершив поточну операцію і натиснув кнопку Назад. поточна операція видаляється з стека (і знищується), і відновлюється попередня операція. (Ви можете дізнатись про стек переходів назад представлені в статті Завдання і стек переходів назад.)

Коли операція зупиняється через запуску нової операції, для повідомлення про зміну її стану використовуються методи зворотного виклику життєвого циклу операції. Існує кілька таких методів, які може приймати операція внаслідок зміни свого стану - створення операції, її зупинка, відновлення або знищення системою; також кожен зворотний виклик представляє можливість виконати певну дію, відповідне для відповідної зміни стану. Наприклад, в разі зупинки операція повинна звільнити будь-які великі об'єкти, наприклад, підключення до мережі або базі даних. При поновленні операції ви можете повторно отримати необхідні ресурси і відновити виконання перерваних дій. Такі зміни стану є частиною життєвого циклу операції.

Далі в цьому документі розглядаються основи створення і використання операцій, включаючи повний опис життєвого циклу операції, щоб ви могли краще зрозуміти, як слід керувати переходами між різними станами операції.

створення операції

Щоб створити операцію, спочатку необхідно створити підклас класу Activity (або скористатися існуючим його підкласом). В такому підкласі необхідно реалізувати методи зворотного виклику, які викликає система при переході операції з одного стану свого життєвого циклу в інше, наприклад при створенні, зупинці, відновлення або знищення операції. Ось два найбільш важливих методу зворотного виклику:

onCreate () Цей метод необхідно обов'язково реалізувати, оскільки система викликає його при створенні вашої операції. У своїй реалізації вам необхідно ініціалізувати ключові компоненти операції. Найбільш важливо саме тут викликати setContentView () для визначення макета призначеного для користувача інтерфейсу операції. onPause () Система викликає цей метод в якості першого ознаки виходу користувача з операції (однак це не завжди означає, що операція буде знищена). Зазвичай саме тут необхідно застосовувати будь-які зміни, які повинні бути збережені крім поточного сеансу роботи користувача (оскільки користувач може не повернутися назад).

Існують також і деякі інші методи зворотного виклику життєвого циклу, які необхідно використовувати для того, щоб забезпечити плавний перехід між операціями, а також для обробки непередбачених порушень у роботі операції, в результаті яких вона може бути зупинена або навіть знищена. Більш докладний опис всіх методів зворотного виклику життєвого циклу представлені в розділі, присвяченому управлінню життєвим циклом операцій.

Реалізація користувальницького інтерфейсу

Для реалізації призначеного для користувача інтерфейсу операції використовується ієрархія уявлень -об'єктів, отриманих з класу View. Кожна вистава відповідає за певну прямокутну область вікна операції і може реагувати на дії користувачів. Наприклад, поданням може бути кнопка, натискання на яку приводить до виконання певної дії.

В Android передбачений набір вже готових уявлень, які можна використовувати для створення дизайну макета і його організації. Віджети - це уявлення з візуальними (і інтерактивними) елементами, наприклад, кнопками, текстовими полями, чекбоксами або просто зображеннями. Макети - це уявлення, отримані з класу ViewGroup. забезпечують унікальну модель компонування для своїх дочірніх уявлень, таких як лінійний макет, сітка або відносний макет. Також можна створити підклас для класів View і ViewGroup (або скористатися існуючими підкласами), щоб створити власні віджети і макети, і потім застосувати їх до макету своєї операції.

Найчастіше для завдання макета за допомогою уявлень використовується XML-файл макета, збережений в ресурсах додатка. Таким чином ви можете зберігати дизайн користувальницького інтерфейсу окремо від вихідного коду, який служить для завдання поведінки операції. Щоб задати макет в якості призначеного для користувача інтерфейсу операції, можна використовувати метод setContentView (). передавши в нього ідентифікатор ресурсу для макета. Однак ви також можете створити нові View в коді вашої операції і створити ієрархію уявлень. Для цього вставте View в ViewGroup. а потім використовуйте цей макет, передавши кореневої об'єкт ViewGroup в метод setContentView ().

Докладні відомості про створення призначеного для користувача інтерфейсу см. В статті для користувача інтерфейс.

Щоб операція стала доступна системі, її необхідно оголосити в файлі маніфесту. Для цього відкрийте файл маніфесту і додайте об'єкт lt; activitygt; в якості дочірнього для елемента lt; applicationgt ;. наприклад:

Використання фільтрів намірів

елемент lt; actiongt; вказує, що це «основна» точка входу в додаток. елемент lt; categorygt; вказує, що цю операцію слід вказати в засобі запуску додатків системи (щоб користувачі могли запускати цю операцію).

Однак, якщо вам необхідно, щоб операція реагувала на неявні наміри, одержувані від інших додатків (а також з вашого додатки), для операції необхідно визначити додаткові фільтри намірів. Для кожного типу наміри, на який необхідно реагувати, необхідно вказати об'єкт lt; intent-filtergt ;. що включає елемент lt; actiongt; і необов'язковий елемент lt; categorygt; або lt; datagt; (Або обидва ці елементи). Ці елементи визначають тип наміри, на який може реагувати ваша операція.

Додаткові відомості про те, як операції можуть реагувати на наміри, наведені в статті Наміри і фільтри намірів.

запуск операції

Для запуску іншої операції досить викликати метод startActivity (). передавши в нього об'єкт Intent. який описує запускається операцію. У намір вказується або точна операція для запуску, або описується тип операції, яку ви хочете виконати (після чого система вибирає для вас підходящу операцію, яка може навіть перебувати в іншому додатку). Намір також може містити невеликий обсяг даних, які будуть використовуватися запущеної операцією.

При роботі з власним додатком найчастіше потрібна лише запустити потрібну операцію. Для цього необхідно створити намір, яке явно визначає необхідну операцію з допомогою імені класу. Нижче представлений приклад запуску однієї операцією іншої операції з ім'ям SignInActivity.

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

Запуск операції для отримання результату

У деяких випадках після запуску операції може знадобитися отримати результат. Для цього викличте метод startActivityForResult () (замість startActivity ()). Щоб отримати результат після виконання наступної операції, реалізуйте метод зворотного виклику onActivityResult (). По завершенні наступної операції вона повертає результат в об'єкті Intent в викликаний метод onActivityResult ().

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

У цьому прикладі демонструється базова логіка, якій слід керуватися при використанні методу onActivityResult () для обробки результату виконання операції. Перша умова перевіряє пізнаємо, чи запит, і якщо він успішний, то результат для resultCode буде RESULT_OK; також перевіряється, чи відомий запит, для якого отримано цей результат, і в цьому випадку requestCode відповідає другому параметру, відправленому в метод startActivityForResult (). Тут код обробляє результат виконання операції шляхом запиту даних, повернутих в Intent (параметр data).

При цьому ContentResolver виконує запит до постачальника контенту, який повертає об'єкт Cursor. забезпечує зчитування запитаних даних. Додаткові відомості представлені в статті Постачальники контенту.

Додаткові відомості про використання намірів см. В статті Наміри і фільтри намірів.

завершення операції

Для завершення операції досить викликати її метод finish (). Також для завершення окремої операції, запущеної раніше, можна викликати метод finishActivity ().

Примітка. У більшості випадків вам не слід явно завершувати операцію за допомогою цих методів. Як зазначено в наступному розділі, присвяченому управлінню життєвим циклом операції, система Android виконує таке управління за вас, тому вам не потрібно завершувати ваші власні операції. Виклик цих методів може негативно позначитися на очікуваному поведінці додатки. Їх слід використовувати виключно тоді, коли ви абсолютно не хочете, щоб користувач повертався до цього примірника операції.

Управління життєвим циклом операцій

Управління життєвим циклом операцій шляхом реалізації методів зворотного виклику має важливе значення при розробці надійних і гнучких програм. На життєвий цикл операції безпосередньо впливають його зв'язку з іншими операціями, його завданнями та стеком переходів назад.

Існує всього три стану операції:

Відновлено Операція виконується на передньому плані екрана і відображається для користувача. (Цей стан також іноді називається «Виконується».) Припинено На передньому фоні виконується інша операція, яка відображається для користувача, однак ця операція як і раніше не прихована. Тобто поверх поточної операції показуються інші операція, частково прозора або що не займає повністю весь екран. Призупинена операція повністю активна (об'єкт Activity як і раніше знаходиться в пам'яті, в ньому зберігаються всі відомості про стан і інформація про елементи, і він також залишається пов'язаним з диспетчером вікон), проте в разі гострого браку пам'яті система може завершити її. Зупинено Операція повністю перекривається іншою операцією (тепер вона виконується в фоновому режимі). Зупинена операція як і раніше активна (об'єкт Activity як і раніше знаходиться в пам'яті, в ньому зберігаються всі відомості про стан і інформація про елементи, але об'єкт більше не пов'язаний з диспетчером вікон). Однак операція більше не видно користувачеві, і в разі нестачі пам'яті система може завершити її.

Якщо операція припинена або повністю зупинена, система може очистити її з пам'яті шляхом завершення самої операції (за допомогою методу finish ()) або просто завершити її процес. У разі повторного відкриття операції (після її завершення) її потрібно створити повністю.

Реалізація зворотних викликів життєвого циклу

При переході операції з одного вищеописаного стану в інше, повідомлення про це реалізуються через різні методи зворотного виклику. Всі методи зворотного виклику є прив'язки, які можна перевизначити для виконання відповідного дії при зміні стану операції. Зазначена нижче базова операція включає кожен з основних методів життєвого циклу.

Примітка. При реалізації цих методів життєвого циклу завжди викликайте реалізацію суперкласу, перш ніж виконувати будь-які дії, як показано в прикладах вище.

Разом всі ці методи визначають весь життєвий цикл операції. За допомогою реалізації цих методів можна відстежувати три вкладених циклу в життєвому циклі операції:

  • Весь життєвий цикл операції відбувається між викликом методу onCreate () і викликом методу onDestroy (). Ваша операція повинна виконати настройку «глобального» стану (наприклад, визначення макета) в методі onCreate (). а потім звільнити всі залишилися в onDestroy () ресурси. Наприклад, якщо у вашій операції є потік, що виконується в фоновому режимі, для завантаження даних по мережі, операція може створити такий потік в методі onCreate (). а потім зупинити його в методі onDestroy ().

Відомий життєвий цикл операції відбувається між викликами методів onStart () і onStop (). Протягом цього часу операція відображається на екрані, де користувач може взаємодіяти з нею. Наприклад, метод onStop () викликається в разі, коли запускається нова операція, а поточна більше не відображається. У проміжку між викликами цих двох методів можна зберегти ресурси, необхідні для відображення операції для користувача. Наприклад, можна зареєструвати об'єкт BroadcastReceiver в методі onStart () для відстеження змін, що впливають на призначений для користувача інтерфейс, а потім скасувати його реєстрацію в методі onStop (). коли користувач більше не бачить відображуваного. Протягом усього життєвого циклу операції система може кілька разів викликати методи onStart () і onStop (). оскільки операція то відображається для користувача, то ховається від нього.

Життєвий цикл операції, що виконується на передньому плані. відбувається між викликами методів onResume () і onPause (). Протягом цього часу операція виконується на тлі всіх інших операцій і відображається для користувача. Операція може часто йти в фоновий режим і виходити з нього - наприклад, метод onPause () викликається при переході пристрою в сплячий режим або при появі діалогового вікна. Оскільки перехід в цей стан може виконуватися досить часто, код в цих двох методах повинен бути легким, щоб не допустити повільних переходів і не змушувати користувача чекати.

На малюнку 1 ілюструються проходи і шляхи, які операція може пройти між станами. Прямокутниками позначені методи зворотного виклику, які можна реалізувати для виконання дій між переходами операції з одного стану в інший.

Операції, android developers

Малюнок 1. Життєвий цикл операції.

Ці ж методи життєвого циклу перераховані в таблиці 1, в якій детально описано кожен метод зворотного виклику і вказано його місце в життєвому циклі операції в цілому, включаючи відомості про те, чи може система завершити операцію по завершенні методу зворотного виклику.

Таблиця 1. Зведені відомості про методи зворотного виклику життєвого циклу операції.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is. You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.