Пишемо віджет для Android, який показує доступність сайту "

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

Представляємо вам наш список кращих віджетів для Android.


Це найкращі віджети, які ви можете встановити на Android

Data Rush

Безкоштовний додаток Data Rush являє собою зручний віджет для тих, хто змушений стежити за витратою інтернет трафіку. Програма наочно показує кількість отриманих і переданих мегабайт. Щоб обмежити трафік і не допустити перевитрати, потрібно просто вказати свій ліміт.

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

AccuWeather

()

Один з перших в рейтингу додатків з прогнозом, налічує 50 мільйонів скачувань в Плей Маркеті. Має цілком стандартний набір можливостей для представників даного типу.

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


Dash Clock

Віджет Dash Clock, безкоштовно завантажити і встановити який можна з сервісу Google Play, користується великою популярністю. Це своєрідний центр повідомлень, в якому збирається інформація про нові листи на електронну пошту, дані про погоду, пропущені дзвінки та події в календарі. Також віджет показує рівень заряду акумулятора і містить інформацію про активні будильники.

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

Інструменти тла

Починаючи з Android 3.0 (версія API 11), будь-який функціонал, пов'язаний з мережевою активністю, повинен обов'язково виконуватися у вторинному потоці. Будь-яка спроба такої роботи в головному (графічному) потоці програми призведе до викиду винятку NetworkOnMainThreadException і негайного завершення програми. Це правило відноситься і до фонового сервісу, так як він теж фактично виконується в головному потоці. Як ти вже, напевно, здогадався (а якщо ні - терміново купуй березневий «Хакер»), ми будемо використовувати IntentService. Даний фоновий сервіс бере на себе всю роботу зі створення вторинного потоку, дозволяючи нам зосередитися безпосередньо на функціоналі.

Для початку зареєструємо сервіс в маніфесті:

Основна робота сервісу кипить і вирує всередині onHandleIntent, текст якого наведено нижче (зневаджувальний друк присутній):

private ArrayList sites = new ArrayList(4); private PingPref pf = new PingPref(this); private AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE); … @ Override protected void onHandleIntent (Intent intent) {Log.d (TAG_LOG, «Сеанс PingService працює»...); loadSites () ;//Читання списку сайтів boolean isConnected = isConnected () ;//Чи є з "єднання? if (! isConnected) {setSitesFail () ;//Ставимо для всіх сайтів прапор -1 Log.d (TAG_LOG, «З'єднання відсутнє!»);} else for (int i = 0; i < sites.size(); i++){ String site = sites.get(i); if (! site.equalsIgnoreCase («»)) {//Сайт доступний? Так - flag = 1, інакше flag = 0 int flag = isSiteAvail (site)? 1 : 0; pf.setData(i+1, site, flag); Log.d(Main.TAG_LOG, site + «: flag ='+ flag);}} refreshWidget () ;//Оновлюємо віджет//Створюємо відкладений намір Intent si = new Intent (this, PingService.class); PendingIntent pi = PendingIntent.getService(this, 0, si, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel (pi) ;//Скидаємо попередню сигналізацію//Зв'язок є? Так - повтор пінгу через 15 хв, інакше - перевірка зв'язку через 30 хв long updceFreq = isConnected? AlarmManager.INTERVAL_FIFTEEN_MINUTES : AlarmManager.INTERVAL_HALF_HOUR ;//Визначаємо час наступного запуску сервісу = поточний + інтервал long timeToRefresh = SystemClock.elapsedRealtime () + updceFreq ;//Встановлюємо сигналізацію am.setInexactRepeating (AlarmManager.ELAPSED_REALTIME, timeToRefresh, updceFreq, pi); Log.d (Main.TAG_LOG, «Наступний сеанс приблизно через» + updateFreq/60/1000 + «мін».); Log.d (Main.TAG_LOG, «Сеанс PingService завершено»);}

Функція loadSites заповнює збірку ArrayList адресами сайтів, збережених раніше в загальних налаштуваннях. Далі відбувається перевірка на з'єднання з мережею: якщо isConnected повертає false - для всіх сайтів встановлюємо прапор -1 (setSitesFail), в іншому випадку запускаємо цикл опитування всіх ресурсів (isSiteAvail) із записом результатів (setData). Для активної роботи з всесвітньою павутиною за протоколом HTTP в Java передбачено спеціальний клас HttpURLConnection, що використовує об'єкт-посилання (URL) для зазначення адреси сайту:


private boolean isSiteAvail(String site){ try { URL url = new URL(site); HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); urlc.setRequestProperty(«Connection», «close»); urlc.setConnectTimeout(5000); urlc.connect(); int Code = urlc.getResponseCode(); if (Code == HttpURLConnection.HTTP_OK) return true; } catch (MalformedURLException e) {} catch (IOException e) {} return false; }

Оскільки ми не збираємося надалі запитувати будь-яких ресурсів з сайту, в заголовку запиту сміливо вказуємо лексему з'єднання setRequestProperty («Connection», «close»), тобто після відповіді сервер розірве зв'язок. Метод setConnectTimeout встановлює тайм-аут з'єднання і підбирається експериментально (у моєму випадку п'ять секунд при з'єднанні 3G цілком вистачило). Повернене методом getResponseCode значення HttpURLConnection.HTTP_OK визначає позитивний вердикт функції. Маю на увазі: при використанні мобільного доступу до інтернету шанс словити IOException і MalformedURLException досить високий. Це відбувається тому, що метод isConnected об'єкта NetworkInfo не завжди оперативно реагує на зміну стану мережі, і ми можемо прийти в isSiteAvail з відсутнім з'єднанням. Так що, якщо раптово всі сайти виявляться недоступними, панікувати, звичайно, слід, але не відразу.

INFO

Об'єкт HttpURLConnection обробляє лише ті посилання, які починаються з https://, тобто протокол потрібно вказувати явним чином.

Функція refreshWidget ініціює оновлення віджету за допомогою трансляції (передачі) унікального широкомовного наміру FORCE_WIDGET_UPDATE, яке наш віджет буде відловлювати, оскільки він є широкомовним приймачем. Термін «широкомовність» означає глобальний характер обробки намірів - будь-який інший додаток може обробити наш намір, так само як і ми можемо підписатися на обробку чужого. Щоб не було плутанини, наміри повинні бути унікальними. До речі, якщо наприклад, потрібно відкрити інтернет-посилання (один намір), а в системі встановлено кілька браузерів (кілька широкомовних приймачів) - з'явиться вікно з вибором належного. У наступному розділі ми розглянемо цей механізм більш детально.

private void refreshWidget() { Intent i = new Intent(PingWidget.FORCE_WIDGET_UPDATE); sendBroadcast(i); }


Ближче до кінця створюємо вже знайомий тобі відкладений намір на повторний запуск сервісу через не менш знайомий менеджер сигналізацій. Тільки замість методу set будемо використовувати setRepeating, а точніше - setInexactRepeating. Останній допомагає в деякій мірі зменшити енерговитрати, збираючи для виконання близькі за часом сигналізації. Тому замість точного інтервалу ми передаємо константу AlarmManager.INTERVALFIFTEEN_MINUTES для опитування сайтів приблизно через кожні 15 хв і AlarmManager.INTERVAL_HALF_HOUR (ауд 30 хв) у разі відсутності з'єднання для нової спроби. Можливо, ти захочеш вказати інші константи об'єкта AlarmManager: INTERVAL_HOUR (година), INTERVAL_HALF_DAY (12 год), INTERVAL_DAY (раз на добу). Зауважу, що ці інтервали дуже умовні, і при необхідності дотримання більш точного розкладу слід використовувати метод setRepeating, але, як вже зазначалося, він більш ненажерливий. До речі, будити пристрій ми не станемо - використовуємо AlarmManager.ELAPSED_REALTIME, оскільки оновлення інформації для віджету при вимкненому екрані не тільки не потрібно, але і, ймовірно, викличе вкорізнений погляд колег з рубрики X-Mobile.

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

Погода - Weather

Дуже зручний віджет для стеження за погодою. З його допомогою ви будете весь час мати найточніші дані за прогнозом на потрібний проміжок часу. Функціоналом передбачено погодний радар і можливість блокування екрану.

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

COM_SPPAGEBUILDER_NO_ITEMS_FOUND