Писане джаджа за Android, което показва наличието на сайта
В днешния спектър от IT-технологии квалифициран администратор - лицето, макар и не винаги се вижда, но е важна и много зает. Борба на разстояние досадни потребители, тя трябва постоянно да държи под око на естествената им среда на цифровия свят - сайтове. Нека да помогнем на администратор и да се създаде една полезна джаджа, внимателно следи наличността на всички свои ресурси. И да, от времето, програмката няма да се показва.
дизайн джаджа
Фиг. 1. Хакерски джаджаPing? Не, аз не знам ...
В Java, има забележителен клас InetAddress. като в утробата й е не по-малко забележителен isReachable () метод. Този метод проверява наличността на ресурсите и взема като параметър за определен интервал от време, т.е. времето, след което не отговаря на ресурса, се смята за недостижими:
Стегнато, не е тя? Проблемът е, че този код работи добре на Windows, но Android'e винаги се връща фалшиви, дори ако молбата за разрешение за достъп до Интернет. По някаква причина, за да изпратите ICMP-пакет (Echo-Request) се изисква Root.
Ние няма да претендира нещо, и се процедира, както следва: ние ще се свърже с мястото на HTTP протокол и погледнете в кода на отговора. Ако получите кода 200 (HTTP OK), сайта ви е жива и работи, в противен случай ние вярваме, че нещо не е наред (сайта не е на разположение).
разрешение
Тъй като нашата цел - да сайтове в интернет, трябва да получите съответните разрешения от потребителя в манифеста на проекта (AndroidManifest.xml):
За достъп до мрежови връзки контрол услугата се използва Context.CONNECTIVITY_SERVICE константа, а след това getActiveNetworkInfo метод връща обект от тип В NetworkInfo, който съдържа информация за текущата връзка. Ако връзката е установена, метод isConnected връща истина.
SQLite? № ... Споделени Preferences!
Както се знае, че трябва някъде да се съхранява списък от обекти и техните (не) наличността. Първо исках отново да използват базата данни на SQLite, но реши да не се повтарят и да поговорим за друга полезна Android технология - общи настройки (споделено Предпочитания). Общи настройки - сравнително прост механизъм, основан на двойки от "ключ - стойност" и има за цел да се запазят примитивни данни за кандидатстване (число, низ, булева стойност). От гледна точка на настройките на Android се съхраняват в обикновен XML файл в частна директория на заявлението (данни / данни / package_name / shared_pref /).
За нашите цели, ние напише малък клас (PingPref) за съхраняване и четене на данни:
Фиг. 2. Pref.xml произведенияТолкова е просто - няколко полета за въвеждане (EditText) да е бутон (бутон). Цялата тази красота е показана на фиг. 3. Бутон Processor (. Cm Main.java) чете съдържанието на полето (в сила за събиране на ArrayList) и ги записва върху обща конфигурационен файл с помощта на класа setData PingPref описано по-горе:
Фиг. 3. GUI като GUIуслуга във фонов режим
За да започнете, регистрирайте услуга в манифеста:
Основната работа на службата циреи и кипи отвътре onHandleIntent, текстът на която е даден по-долу (за отстраняване на грешки шрифт присъства):
Тъй като ние не възнамеряваме да поиска всяка ресурс от сайта, в заглавната част на искането смело посочи знак setRequestProperty връзка ( "Връзка", "близо"), което е, след като се изключва сървърните отговор. метод setConnectTimeout определя изчакване съединение и е избран експериментално (в моя случай пет секунди е достатъчно при свързване 3G). Върнатата стойност на метода getResponseCode HttpURLConnection.HTTP_OK определя положителен функция решение. Имайте предвид следното: Ако използвате мобилен достъп до интернет и възможност да се хване IOException MalformedURLException много висока. Това е така, защото обект на метода на isConnected NetworkInfo не винаги е бързо да се реагира на променящите се условия на мрежата, и ние може да дойде при isSiteAvail с отсъствието на съединението. Така че, ако изведнъж всички сайтове няма да бъде достъпен за паника, разбира се, че трябва да бъде, но не веднага.
Към края вече сте запознати създаване на разсрочено намерение да рестартирате услугата чрез най-малко познат мениджър аларма. Само вместо набор метод ще използваме setRepeating, за да бъдем точни - setInexactRepeating. Последно помощ до известна степен да се намали консумацията на енергия, които се събират за извършване на кратки аларма. Ето защо, вместо точния интервал минаваме AlarmManager.INTERVALFIFTEEN_MINUTES постоянни за избирателни сайтове приблизително на всеки 15 минути и AlarmManager.INTERVAL_HALF_HOUR (
30 минути) в отсъствие на съединение за нов опит. Може би искате да зададете друга постоянна AlarmManager обект: INTERVAL_HOUR (з), INTERVAL_HALF_DAY (12 часа), INTERVAL_DAY (веднъж дневно). Имайте предвид, че тези интервали ochen_ климатизирани, и ако е необходимо спазването на усъвършенстване на графика трябва да се използва метод setRepeating, но, както вече бе отбелязано, че е по-алчни. Между другото, ние няма да се събуди устройството - използвайте AlarmManager.ELAPSED_REALTIME, като актуализацията за джаджа, когато екранът е не само не е задължително, но е вероятно да доведе до укорително на колегите от категорията X-Mobile.
Когато стигнаха до средата на статията, прекарахме цялата подготвителна работа, а сега може да продължи с чиста съвест да се основната тема на нашето изследване - създаването на приспособлението.
Приспособлението за Android се реализира под формата на предаването приемник, който отговаря на определени събития (по-точно казано - намерение (намерение)), за да запълни визуално оформление на актуалните данни на таймера, като се използва услугата, кликнете върху и така нататък. Widget развитие започва с регистрацията на своя клас (PingWidget) в манифеста на проекта:
Тук намерение филтър маркер съдържа поне един стандарт действие - android.appwidget.action.APPWIDGET_UPDATE, се използва за актуализиране на съдържанието на джаджа (там е изтрита, активен и неактивен, но те са по желание). Тъй като ние се актуализира джаджа, първо, сами по себе си, и второ, по различно време, ние добавяме още едно действие - com.example.pinger.FORCE_WIDGET_UPDATE за нашия проблем. Освен това, ние се нуждаем от отделен XML-файл, който описва конфигурацията на джаджа (файлови ВЕИ \ XML \ widget_provider.xml):
Атрибути minHeight и minWidth определи минималната допустима височината и ширината на приспособлението. За да се изчисли тези стойности, приложими формула
Началният екран е разделен на Android виртуална мрежа, състояща се от клетки, чиито размери зависят от физическите размери на устройството. Можем да кажем, че прекия път за кандидатстване на началния си екран съвпада с една клетка. Нашата приспособление ще има размери 4 х 2 или 250 DP х 110 DP (устройство независим пиксела). че не възнамеряваме да се променят от потребителя на размера на джаджа, така resizeMode настроен на висота.
UpdatePeriodMillis атрибут определя минималния период между актуализации джаджа (в милисекунди) система, но сега е безинтересна за нас, тъй като ние ще актуализираме джаджа ръчно веднага щом възникне такава необходимост. Представете си нашата услуга във фонов режим не се изпълнява, и виси на екрана джаджа (типичната състоянието на устройството и след рестартиране) - Android го нарича процеса на актуализация веднага, а едва след това през updatePeriodMillis милисекунди. По време на първата актуализация просто стартирате нашата услуга, и веднага след като той започва да работи, по-нататъшно обновяване на информацията в приспособлението ще започне точно това. Така че сега спокойно да сложи 86400000 (т.е. веднъж на ден) и да продължат напред.
Ако искате менюто джаджа вместо икони за кандидатстване носеше красива картина (вж. Фиг. 4), добавете линк към съответния ресурс в PNG формат в previewImage атрибут. За да научите как бързо и лесно да получи предварителен преглед, прочетете страничната лента.
Фиг. 4. Меню джаджаinitialLayout атрибут определя оформлението джаджа в XML формат. Да, не сте наред, в много отношения прилича на оформлението на дейността на джаджа оформление или диалоговия прозорец - същите етикети, копчета, изображения, оформление мениджъри, и така нататък. маркиране фрагмент ни приспособление е показано по-долу (widget.xml):
Така че, от визуалната му страна, за (.. виж фигура 5) постепенно се премине към логиката на своята работа (PingWidget.java клас):
NinePatch срещу PNG
Фиг. 7 можете да видите областта разтягане нашата джаджа (лепенки), маркирани в лилаво. Независимо от размера на джаджа е, логото на любимото си списание, както и заоблени ъгли, няма да бъдат изкривени. Тази област се определя от линии от лявата и горната част на изображението. Обърнете внимание на дебелината на рамката в един пиксел с черни ивици - че тази информация ще бъде добавена към оригиналното изображение.
Фиг. 7. Размер - това е важно!
Фиг. 8 показва района на тъмния цвят за съдържанието (Content). Тук ние виждаме, че всички наши снимки и текстови етикети ще имат малко изместване от обхвата на приспособлението. Тази красота определи линията отдясно и долната част на изображението.
Фиг. 8. В района на съдържание не по-нискорезултат обработка се съхранява във формат PNG гр фигури 9 преди добавяне на разширението на файла (например, widget.9.png). Ако се направи позоваване на графичен точка на ресурсите и девет не е необходимо (т.е. андроид: фон = "@ изтегляемото / джаджа").
Клас AppWidgetProvider, е приемник на предаване, ни предоставя удобни, работещи с джаджа на жизнения цикъл: OnUpdate и onReceive (има и други - onDeleted, onDisabled, onEnabled, но ние не ги разглеждаме). Първият се нарича, когато, както е договорено да се актуализира джаджа интерфейс updatePeriodMillis интервали (виж по-горе.) - просто стартирате услугата (като опция, можете да използвате вече подготвени, но може би без значение на данни - всичко зависи от проблема). На второ място, onReceive, предизвикана от конкретно действие - FORCE_WIDGET_UPDATE, регистрирани по-рано в манифеста на проекта. Той е този код и е отговорен за манипулиране на изображения и текстови полета в програмката за UI. функция updateWidget първо иска от клас обект AppWidgetManager, която се използва за актуализиране на програмката и предоставя информация за тях. По-специално, ние се интересуваме от самоличността на всички джунджурии (appWidgetIds масив), защото може да има няколко и трябва да се актуализира всеки един от тях:
В единния цикъл drawWidget функции се повтаря над всички в момента джаджи. Клас RemoteViews използват като компонент за достъп до маркирането поставен в друг процес за кандидатстване (този, който ми напомня Инжектират?). Ако бяхме се работи с дадена дейност или фрагмент, можете да използвате доста често срещан findViewById. Но нашата джаджа работи в рамките на началния екран, така че да получат достъп до маркировката трябва да е в RemoteViews строителя посочва името на пакета (context.getPackageName ()) и маркирането на ресурсите (R.layout.widget). Използването views.setTextViewText и views.setImageViewResource, сменете етикета и картина (по желание функция getPicture връща препратка към съответния ресурс). След като сме направили промени по всички линии, поправете ги в приспособлението, което води до updateAppWidget.
вместо заключение
Ние свърши страхотна работа, както и нашата джаджа работи като часовник - администратор със сигурност ще останете доволни. Но тук е един въпрос остава не уточни как да се спре на периодичната стартирането на услугата, ако това вече не е необходима? Бързам да ви моля, в кода на приложението (имат поглед към моя сайт или dvd.xakep.ru) стоп вече е изпълнен със специален setStopServiceFlag флаг, започва на натискане на бутона "Назад" в основната дейност прилагане (на "дом" не се прилага). Не забравяйте да погледнете в този въпрос - това ще бъде вашата домашна работа.
Преглед джаджа
В игра Market живее megapoleznoe разработчиците на приложения джаджи - Widget Preview, която ви позволява да вградите една джаджа във всеки регистриран система, а след това прави картината си. Резултатът може да бъде съхранен във файл или да го изпратите по пощата.
Фиг. 6. Така че какъв цвят е вашата рокля?