widget de scriere pentru Android, care arată disponibilitatea site-ului
În gama de astăzi de IT-tehnologii de administrator calificat - persoana, deși nu întotdeauna vizibilă, dar este un important și foarte ocupat. Lupta off utilizatori enervante, trebuie să păstreze în mod constant un ochi pe habitatul lor natural al lumii digitale - site-uri. Să ne ajute admin nostru și de a crea un widget util, monitorizează cu atenție disponibilitatea tuturor resurselor sale. Și da, vremea, widget-ul nu va arăta.
Design widget
Fig. 1. Hacker widgetPing? Nu, eu nu știu ...
În Java, există o clasă remarcabilă InetAddress. având în pântecele ei nu este mai puțin metoda isReachable remarcabilă (). Această metodă verifică disponibilitatea resursei și ia ca parametru la un time-out, adică timpul după care nu respectă resursa este considerat imposibil de găsit:
Concis, nu-i așa? Problema este că acest cod funcționează bine pe Windows, dar Android'e returnează întotdeauna false, chiar dacă cererea permisiunea de a accesa internetul. Din anumite motive, pentru a trimite pachete ICMP-(Echo-Request) este necesară Root.
Nu vom pretinde nimic, și procedează după cum urmează: ne vom conecta la site-ul de protocol HTTP si uita-te la codul de răspuns. Dacă obțineți codul 200 (HTTP OK), site-ul dvs. este în viață și de lucru, altfel noi credem că ceva este greșit (site-ul este indisponibil).
permisiune
Deoarece scopul nostru - site-uri de pe Internet, trebuie să obțineți permisiunile corespunzătoare din partea utilizatorului în manifestul proiectului (AndroidManifest.xml):
Pentru a accesa serviciul de control Conexiuni în rețea este utilizat Context.CONNECTIVITY_SERVICE constantă, apoi getActiveNetworkInfo metoda returneaza un obiect de tip NetworkInfo, care conține informații despre conexiunea curentă. În cazul în care se stabilește conexiunea, metoda isConnected returneaza true.
SQLite? Nu ... Preferințe comune!
După cum știți voi, avem nevoie de un loc pentru a stoca o listă de site-uri și a lor (ne) disponibilitatea. La început, am vrut să reutilizați baza de date SQLite, dar a decis să nu se repete și să vorbească despre alte tehnologii Android utile - setările generale (Preferințe partajate). Setări generale - un mecanism destul de simplu bazat pe perechi de „cheie - valoare“ și este destinat să păstreze datele aplicației primitive (număr, string, boolean value). În ceea ce privește setările Android sunt stocate în fișier XML simplu într-un director privat al aplicației (date / date / nume_pachet / shared_pref /).
Pentru scopurile noastre, vom scrie o clasa mica (PingPref) pentru stocarea și citirea datelor:
Fig. 2. Lucrări de Pref.xmlEste simplu - mai multe câmpuri de introducere pe butonul (EditText) da (buton). Toate această frumusețe este prezentată în Fig. 3. Butonul Procesor (. Cm Main.java) citește conținutul câmpului (ArrayList de colectare efectivă) și le scrie într-un fișier de configurare comună folosind clasa setData PingPref descrisă mai sus:
Fig. 3. GUI astfel GUIserviciu de fundal
Pentru a începe, înregistra un serviciu în manifest:
Activitatea principală a serviciului fierbe și clocotește în interiorul onHandleIntent, al cărei text este prezentat mai jos (de imprimare de depanare este prezent):
Din moment ce nu intenționează să solicite orice resursă de pe site, în antetul cerere cu indrazneala conexiunea indica setRequestProperty jeton ( „Connection“, „aproape“), care este, după deconecteaza răspuns de la server. Metoda setConnectTimeout stabilește un compus timeout și este ales experimental (în cazul meu cinci secunde este suficient atunci când conectarea 3G). Valoarea returnată a metodei getResponseCode HttpURLConnection.HTTP_OK definește o funcție verdict pozitiv. Rețineți: Dacă utilizați acces la Internet mobil și șansa de a prinde IOException MalformedURLException foarte mare. Acest lucru se datorează faptului că obiectul metodei isConnected NetworkInfo nu este întotdeauna rapid pentru a răspunde la schimbarea condițiilor de rețea, și putem ajunge la isSiteAvail cu absența compusului. Deci, în cazul în care dintr-o dată toate site-urile vor fi inaccesibile în panică, desigur, ar trebui să fie, dar nu imediat.
Spre final vă creați deja intenția de a amânat familiare reporni serviciu prin intermediul a cel puțin un manager de alarmă familiar. Numai în locul metodei stabilite vom folosi setRepeating, pentru a fi exact - setInexactRepeating. Ultimul ajutor într-o anumită măsură, pentru a reduce consumul de energie, pentru a efectua colectarea aproape în timp de alarmă. Prin urmare, în loc de intervalul exact vom trece AlarmManager.INTERVALFIFTEEN_MINUTES constant pentru site-urile de votare aproximativ la fiecare 15 minute și AlarmManager.INTERVAL_HALF_HOUR (
30 min) în absența compusului pentru o nouă încercare. S-ar putea dori să specificați alt obiect AlarmManager constantă: INTERVAL_HOUR (h), INTERVAL_HALF_DAY (12 ore), INTERVAL_DAY (o dată pe zi). Rețineți că aceste intervale ochen_ condiționate, și, dacă este necesar, respectarea rafinați programul care urmează să fie utilizat metoda setRepeating, dar, așa cum sa menționat deja, este mai lacom. Apropo, nu ne vom trezi dispozitivul - utilizați AlarmManager.ELAPSED_REALTIME, ca actualizarea pentru widget-ul atunci când ecranul este nu numai că nu este necesar, dar este probabil să provoace o privire de repros colegilor din categoria X-Mobile.
Când au ajuns la mijlocul articolului, ne-am petrecut toate lucrările pregătitoare și poate continua, acum, cu o conștiință clară la subiectul principal al cercetării noastre - crearea widget-ului.
Widget-ul Android este realizat sub forma unui receptor de difuzare, care răspunde la anumite evenimente (strict vorbind - intenție (intenție)), pentru a umple aspectul vizual al datelor reale pe timer-ul, folosind serviciul, faceți clic pe și așa mai departe. Widget Dezvoltare începe cu înregistrarea clasei sale (PingWidget) în manifestul proiectului:
Aici eticheta de intenție de filtru conține cel puțin o acțiune standard, - android.appwidget.action.APPWIDGET_UPDATE, folosit pentru a actualiza conținutul widget-ul (nu se elimină, ACTIVAT și DEZACTIVAT, dar ele sunt opționale). Din moment ce am actualizat widget, în primul rând, pe cont propriu, și în al doilea rând, la momente diferite, vom adăuga încă o acțiune - com.example.pinger.FORCE_WIDGET_UPDATE pentru problema noastră. În plus, avem nevoie de un fișier XML separat care descrie configurația widget-ului (res fișier \ XML \ widget_provider.xml):
Atributele minHeight și minWidth se determină înălțimea minimă admisibilă și lățimea de widget-ul. Pentru a calcula aceste valori formula aplicabilă
Ecranul de start este împărțit într-o rețea virtuală Android format din celule, dimensiunile care depind de dimensiunea fizică a dispozitivului. Putem spune că comanda rapidă a aplicației de pe ecranul de pornire se potrivește cu o singură celulă. Widget nostru va avea dimensiuni 4 x 2 sau 250 x 110 dp dp (un dispozitiv independent-pixeli). nu avem de gând să schimba utilizatorul de dimensiunea widget-ului, astfel încât resizeMode setat la nici unul.
atribut UpdatePeriodMillis specifică perioada minimă dintre actualizările widget-ul (în milisecunde) de sistem, dar este lipsit de interes pentru noi acum, pentru că vom actualiza widget-ul manual, imediat ce apare necesitatea. Imaginați-vă serviciul nostru de fundal nu se execută, și atârnă pe widget-ul de ecran (starea tipică a dispozitivului după repornirea sistemului) - Android numește procesul de actualizare imediat, și numai apoi prin milisecunde updatePeriodMillis. In timpul primei update doar rulați serviciul nostru, și de îndată ce el începe să lucreze, o actualizare informații suplimentare în widget-ul va iniția exact. Deci, acum a pus în condiții de siguranță 86400000 (de exemplu, o dată pe zi) și merge mai departe.
Dacă doriți meniul widget-ului în loc de pictograme de aplicații purtau destul de imagine (vezi. Fig. 4), se adaugă un link la o resursă corespunzătoare în format PNG în atributul previewImage. Pentru a afla cum să obțineți rapid și ușor o previzualizare, citiți bara laterală.
Fig. widget 4. MeniuinitialLayout atribut specifica aspectul widget-ului în format XML. Da, nu ești greșit, în multe privințe seamănă cu structura activității de aspect widget sau caseta de dialog - aceleași etichete, butoane, imagini, manageri de aspect, și așa mai departe. marcare fragment widget nostru este prezentat mai jos (widget.xml):
Deci, din partea vizuală a widget-ului (.. A se vedea Figura 5) trece treptat la logica muncii sale (clasa PingWidget.java):
NinePatch vs PNG
Fig. 7 puteți vedea zona de întindere widgeturi nostru (patch-uri), marcate în violet. Indiferent de dimensiunea widget-ului a fost, logo-ul revistei dvs. preferate, precum și colțurile rotunjite nu vor fi distorsionate. Această zonă este stabilită de liniile de pe partea stângă și partea de sus a imaginii. Acordați atenție la grosimea ramei într-un pixel cu dungi negre - că aceste informații vor fi adăugate la imaginea originală.
Fig. 7. Dimensiunea - acest lucru este important!
Fig. 8 prezintă regiunea culorii închise pentru conținutul (Conținut). Aici vedem că toate imaginile noastre și etichete de text va avea un mic decalaj față de domeniul de aplicare al widget-ului. Aceasta frumusete definesc linia de pe partea dreaptă și partea de jos a imaginii.
Fig. 8. Zona de conținut nu este inferiorRezultatul de procesare este stocat în format PNG cifrele c 9 înainte de a adăuga extensia de fișier (de exemplu, widget.9.png). Dacă specificați o trimitere la un punct de resurse grafic nouă nu este necesar (de exemplu, Android: fundal = „@ drawable / widget“).
Clasa AppWidgetProvider, este un receptor de difuzare, ne oferă un ciclu de viață widget stivuitoare convenabile: onUpdate și onReceive (există și altele - onDeleted, onDisabled, onEnabled, dar nu le ia în considerare). Prima se numește atunci când, așa cum a fost de acord să actualizeze interfață widget intervalele updatePeriodMillis (vezi mai sus.) - trebuie doar să rulați serviciul (ca o opțiune, puteți utiliza deja preparate, dar datele probabil irelevante - totul depinde de problema). În al doilea rând, onReceive, declanșat de o acțiune specifică - FORCE_WIDGET_UPDATE, înregistrată anterior în manifestul proiectului. Este acest cod și este responsabil pentru manipularea imaginilor și câmpuri de text în widget-ul UI. Funcția updateWidget interogări primul obiect de clasa AppWidgetManager, care este folosit pentru a actualiza widget-ul și oferă informații despre ele. În special, suntem interesați în identitatea tuturor widget-uri (appWidgetIds array), deoarece pot exista mai multe și trebuie să actualizați fiecare dintre ele:
În ciclul unic funcțiile drawWidget sunt reiterate peste toate widget-urile care rulează în prezent. RemoteViews Clasa utilizat ca o componentă pentru accesarea de marcare plasat în interiorul unui alt proces de aplicație (unul care amintește-mi injectează?). Dacă am lucrat cu o activitate sau un fragment, ai putea folosi destul de un findViewById comun. Dar widget nostru funcționează în ecranul de start, astfel încât pentru a avea acces la marcajele trebuie să fie în RemoteViews constructor specificați numele pachetului (context.getPackageName ()) și marcajul de resurse (R.layout.widget). Utilizarea views.setTextViewText și views.setImageViewResource, schimbați eticheta și imaginea (funcția opțională getPicture returnează o referință la resursa corespunzătoare). Odată ce am făcut modificări pe toate liniile, să le fixeze în widget-ul, cauzând updateAppWidget.
în loc de o concluzie
Am făcut o treabă bună, și widget nostru funcționează ca un ceas - admin-ul va fi cu siguranță mulțumit. Dar aici este o întrebare nu a rămas specifica modul de a opri lansarea periodică a serviciului în cazul în care nu mai este necesară? Mă grăbesc să vă rog, în codul de aplicație (au o privire la site-ul meu sau dvd.xakep.ru) de oprire a fost deja pusă în aplicare cu un setStopServiceFlag special de pavilion, începe la apăsarea butonului „Înapoi“ în activitatea principală a aplicației (pe „acasă“ nu se aplică). Asigurați-vă că să se uite în această chestiune - acest lucru va fi temele.
Previzualizare widget
În joc de piață trăiește megapoleznoe dezvoltatori de software widgeturi - Widget previzualizare, care vă permite să încorporați un widget în orice sistem înregistrat, atunci face poza lui. Rezultatul poate fi salvat într-un fișier sau trimite-l prin e-mail.
Fig. 6. Deci, ce culoare este rochia ta?