Про що мовчать книги з Android

Зміст статті
Ти ніколи не замислювався, чим робота програміста відрізняється, наприклад, від роботи інженера-конструктора чи прочниста (розслабся, співпромат згадувати не будемо)? Перше, що спадає на думку, — право на помилки: справді, процес тестування (налагодження) займає значний час у будь-якому проекті. Якщо продовжити розмірковувати, можна додати сюди динамічність професії.
В основі інженерних спеціальностей лежать методики, розроблені десятиліття тому, - так, методу кінцевих елементів скоро виповниться 70 років, а він досі не втратив актуальності. У програмуванні все змінюється зі швидкістю, близької до швидкості світла. І нам доводиться постійно щось вивчати, куштувати чужі рішення, винаходити власні велосипеди, змінювати алгоритми, впроваджувати стеки нових технологій — словом, брати участь у гонці без фінішу. І якщо інженерам у роботі допомагають розумні книжки, перевірені часом, то нашому разі знайти інформацію, часом навіть у офіційних джерелах, буває дуже проблематично. Не віриш? Що ж, тоді ласкаво просимо до [А]ндрои[Д]…
Віджет та документація
Сьогодні ми розглянемо Android та його віджети – лише практику, жодної теорії. За останньою відсилаю тебе до недавньої статті, де ми докладно розглядали процес створення хакерського віджету.
Отже, віджет є реалізацією широкомовного приймача, каркас якого представлений нижче:
Коли користувач поміщає перший екземпляр віджету на домашній екран, спрацьовує метод onEnabled() , після видалення якого викликається парний onDisabled() . Метод onDeleted() викликається щоразу, коли користувач перетягує поданняекземпляра віджету в кошик.
Метод onUpdate() у циклі оновлює всі екземпляри віджету за ідентифікаторами, що зберігаються в масиві, смикаючи updateAppWidget() .
Все сказане можна знайти в офіційній документації Google, а також у будь-якій книзі програмування під Android. Типовий віджет представлений на рис. 1.

Віджет vs програміст
Як розминку пропоную забути половину з того, що ми написали, бо воно не працює! Я не дарма поставив налагоджувальну печатку всіх методів. Запустивши код в емуляторі або реальному девайсі, можна легко переконатися, що ні onEnabled , ні onDisabled ніколи не викликаються в Android 4.4 і нижче! (Щоб не бути голослівним, тут і надалі я тестую код на пристроях з Android 4.4, 5.1, 6.0.)
Хтось скаже, що у 5-й версії мобільної ОС це виправлено. Так, виправлено, але скидати з рахунків Android 4 поки що рано. Крім того, такі речі не повинні виявлятися програмістом досвідченим шляхом.
Віджет vs здоровий глузд
Віджет може бути набагато кориснішим, якщо передбачити можливість налаштувати його перед додаванням на домашній екран. Як екран налаштування може виступати будь-яка активність у рамках програми за умови, що вона має фільтр намірів для дії APPWIDGET_CONFIGURE в маніфесті:
Щоб призначити для віджету цю активність, потрібно додати її у відповідний тег appwidget-provider за допомогою атрибута configure, вказавши повне ім'я пакета:
Активність налаштування нічим не відрізняється від звичайної, але має вказати RESULT_OK як результат і повернути намір з додатковим параметром EXTRA_APPWIDGET_ID , що є ідентифікатором віджету. В іншому випадку вважається, що користувач скасував своє рішення (наприклад, натиснув"Назад"), і віджет не буде додано.