(c) Miroslav Balík, Ondřej Kroupa, Martin Pelant 11/29/ přednáška. Práce na pozadí. Služby. Notifikace

Podobné dokumenty
KMI / TMA. Tvorba mobilních aplikací. 8. seminář ZS 2017/2018 ČTVRTEK 13:15-15:45

Obsah. Životní cyklus activity Context Intent Spouštění aktivit Interakce s uživatelem. Toast. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant

Uživatelské rozhraní. Layouty FrameLayout LinearLayout RelativeLayout TableLayout ScrollView Taby Dialogy ViewFlipper 11/29/11

3. ŽIVOTNÍ CYKLUS ACTIVITY

Příklad zobrazení toastu s vlastním designem

Začínáme s vývojem pro Android

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 6)

(c) Miroslav Balík, Ondřej Kroupa, Martin Pelant 11/29/ přednáška. Android projekt. Manifest. Activity. Uživatelské rozhraní (základy)

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Car Agent. Struktura chování:

11/29/11. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant. 11. Přednáška. Broadcast receiver Timer Alarmy Widgety

Úvod do programovacích jazyků (Java)

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Generické programování

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Programování v Javě I. Únor 2009

Jazyk C# (seminář 3)

GUI. Systémová integrace pro desktopové aplikace

Java aplety. Předávání parametrů z HTML

5. přednáška. Stylování a themování Themování Android Interface Definition Language Data Sdílení dat 11/29/11

Programování v Javě I. Leden 2008

Principy objektově orientovaného programování

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

typová konverze typová inference

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Typický prvek kolekce pro české řazení

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Teoretické minimum z PJV

SPRÁVA NÁKLADŮ NA PROVOZ AUTOMOBILU PRO ANDROID

8 Třídy, objekty, metody, předávání argumentů metod

20. Projekt Domácí mediotéka

Více o konstruktorech a destruktorech

Výčtový typ strana 67

17. Projekt Trojúhelníky

Java a XML. 10/26/09 1/7 Java a XML

RMI Remote Method Invocation

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

1 Uživatelská dokumentace

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Chain of responsibility

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

NPRG031 Programování II 1 / :25:46

NMIN201 Objektově orientované programování 1 / :36:09

Programátorská příručka

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Android za hranicemi Hello World

Zápis programu v jazyce C#

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

DUM 06 téma: Tvorba makra pomocí VBA

GUI v Javě a událostmi řízené programování

1. Téma 12 - Textové soubory a výjimky

GUI v Javě a událostmi řízené programování

Java GUI události. Událostmi řízené programování. Zpracování = obsluha událostí

Vytváření a použití knihoven tříd

IRAE 07/08 Přednáška č. 7. Začátek (head)

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

PREPROCESOR POKRAČOVÁNÍ

Dynamicky vázané metody. Pozdní vazba, virtuální metody

UJO Framework. revoluční architektura beans. verze

Úvod do programování - Java. Cvičení č.4

Java - výjimky. private void vstup() throws IOException {... }

Vláknové programování část V

Android 100% Java telefon. Petr Musil

Reaktivní programování v.net

Obsah. LayoutInflater. UI model KeyEvent View Tvorba vlastních komponent Canvas Matrix Vlastní EditText

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

11/29/11. (c) Miroslav Balík, Ondřej Kroupa, Martin Pelant. 12. Přednáška. Zjišťování polohy Google Mapy OverlayItem Zálohování.

Projekt Obrázek strana 135

ANT. Aplikační programování v Javě (BI-APJ) - 1 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Úvod do programovacích jazyků (Java)

1. Programování proti rozhraní

Objektově orientované programování

Java - řazení objektů

7. Statické prvky třídy

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

01. HODINA. 1.1 Spuštění programu VB Prvky integrovaného vývojového prostředí. - pomocí ikony, z menu Start.

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

IW5 - Programování v.net a C# 4 Pokročilé konstrukce C#

TELEFONNí LiNKA PREMiUM PRŮVODCE NASTAVENíM SLuŽBY MEET-ME KONFERENCE

Dědičnost (inheritance)

Windows Live Movie Maker

MATLABLINK - VZDÁLENÉ OVLÁDÁNÍ A MONITOROVÁNÍ TECHNOLOGICKÝCH PROCESŮ

ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA EKONOMICKÁ

PŘETĚŽOVÁNÍ OPERÁTORŮ

Knihovna XBMCLib TXV druhé vydání květen 2014 změny vyhrazeny

Java Výjimky Java, zimní semestr

GUI v Javě a událostmi řízené programování

KTE / ZPE Informační technologie

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Transkript:

9. přednáška Práce na pozadí Služby Notifikace 2

3 Práce na pozadí Jeden z hlavních rozdílů oproti iphonu je možnost provádět téměř libovolné úkony na pozadí Vlákna Používají se ke spouštění kódu na pozadí, zatímco uživatel interaguje s UI (načítání stránek ve webovém prohlížeči, náročné výpočty) Služby Používají se pro pravidelné a nepřetržité provádění akci, které nevyžadují UI (např. hudební přehrávač, automatické stahování )

Vlákna Aplikace musí vždy odpovědět do 5 vteřin, jinak Android nabídne uživateli aby ji zabil Někdy je však potřeba provést úkony, které trvají déle než 5 vteřin nebo je potřebujeme provádět paralelně 4

5 Vlákna Aktivity, Služby a Broadcast Receivery běží v hlavním (UI) vlákně aplikace, kde je aplikován limit 5s Pro vytváření vláken slouží Thread nebo AsyncTask

Thread Jednoduchý způsob, jak něco provést na pozadí Stejné chování jaké známe z Java SE 1. new Thread(){ 2. public void run() { 3.... 4. 5..start(); 6

7 Handler Pouze hlavní vlákno může přistupovat ke GUI Pro spuštění kódu z jiného vlákna ve hlavním vlákně slouží Handler Funguje na bázi odesílání a přijímání zpráv Přijímání zpráv v hlavním vlákně: 1. private Handler mhandler = new Handler() { 2. //nasledujici kod se spusti v hlavnim (GUI) vlakne 3. public void handlemessage(message msg) { 4. Bundle bundle = msg.getdata(); 5. mytextview.settext(bundle.getstring("text")); 6. ; 7. ;

8 Handler Odeslání zprávy z jiného vlákna Musíme mít odkaz na vytvořený Handler mhandler.obtainmessage(); je efektivnější, než vytváření nové zprávy 2 intové hodnoty lze předat jako arg1 a arg2 u Message bez nutnosti vytvářet Bundle 1. new Thread() { 2. public void run() { 3.... 4. Message msg = mhandler.obtainmessage(); 5. Bundle b = new Bundle(); 6. b.putstring("text", "novy text"); 7. msg.setdata(b); 8. mhandler.sendmessage(msg); 9. 10..start();

9 ProgressDialog - opakování protected Dialog oncreatedialog(int id) { case DIALOG_PROGRESS: mprogressdialog = new ProgressDialog(AlertDialogSamples.this); mprogressdialog.seticon(r.drawable.alert_dialog_icon); mprogressdialog.settitle(r.string.select_dialog); mprogressdialog.setprogressstyle(progressdialog.style_horizontal); mprogressdialog.setmax(max_progress); mprogressdialog.setbutton(dialoginterface.button_positive, gettext(r.string.alert_dialog_hide), new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { ); mprogressdialog.setbutton(dialoginterface.button_negative, gettext(r.string.alert_dialog_cancel), new DialogInterface.OnClickListener() { public void onclick(dialoginterface dialog, int whichbutton) { ); return mprogressdialog;

10 ProgressDialog - pokračování public void onclick(view v) { showdialog(dialog_progress); Dialog je možné ovládat přes Handler mprogress = 0; mprogressdialog.setprogress(0); mprogresshandler.sendemptymessage(0); mprogresshandler = new Handler() { @Override public void handlemessage(message msg) { super.handlemessage(msg); Na zprávu Handler zareaguje if (mprogress >= MAX_PROGRESS) { zvýšením čítače pokroku mprogressdialog.dismiss(); else { mprogress++; mprogressdialog.incrementprogressby(1); mprogresshandler.sendemptymessagedelayed(0, 100); ;

11 AsyncTask Zjednodušuje volání metod v hlavním vlákně Kombinace metod, z nichž jedna běží ve vedlejším vlákně a průběžné výsledky se spouští v hlavním AsyncTask<Params, Progress, Result> má 4 základní metody: void onpreexecute() provede kód v hlavním vlákně těsně před tím, než se spustí vedlejší result doinbackground(params... params) zde se spustí kód na pozadí void onpostexecute(result result) spustí se v hlavním vlákně, jakmile se doinbackground ukončí void onprogressupdate(progress... values) spustí se když, se v doinbackground zavolá publishprogress(progress); Spustí se zavoláním asynctask.execute(params);

12 AsyncTask 1. mytask = new AsyncTask<String, Integer, Double>() { 2. @Override 3. protected void onpreexecute() { 4. mytextview.settext("loading..."); 5. super.onpreexecute(); 6. 7. @Override 8. protected Double doinbackground(string... params) { 9. Double result; 10. int progress; 11.... 12. publishprogress(progress);//progress se preda do onprogressupdate 13.... 14. return result;//preda se do onpostexecute 15. 16. @Override 17. protected void onprogressupdate(integer... values) { 18. mytextview.settext("running, progress= " + values[0]); 19. super.onprogressupdate(values); 20. 21. @Override 22. protected void onpostexecute(double result) { 23. mytextview.settext("finished, result= " + result); 24. super.onpostexecute(result); 25. 26.; 27.myTask.execute("param");//param se preda do doinbackground

13 Service Vhodné, pokud potřebujeme provést úkon nezávislý na GUI Přehrávání hudby Stahování velkého objemu dat Běží v hlavním vlákně (platí zde 5s limit) Mají větší prioritu, než neaktivní aktivity Pokud jsou přeci jen sestřeleny, systém je po získání potřebných prostředků restartuje Jsou spouštěny, zastavovány a kontrolovány z jiných komponent aplikace (např. jiné služby, Activity nebo BroadcastReceivery)

14 Service MyService.java 1. public class MyService extends Service{ 2. @Override 3. public int onstartcommand(intent intent, int flags, int startid) { 4. //provedeni potrebneho ukonu 5. return START_STICKY; 6. 7. @Override 8. public IBinder onbind(intent intent) { 9. return null; 10. 11. MainActivity.java 1. startservice(new Intent(this, MyService.class)); 2. stopservice(new Intent(this, MyService.class)); AndroidManifest 1. <service android:enabled="true" android:name=".myservice" />

15 Service Běžná praktika: V onstartcommand se spustí nové vlákno, které provede potřebné úkony Jakmile dokončí svou práci, zastaví se - stopself(); onstartcommand vrací konstanty, které určují, jak se bude služba chovat, když ji systém odstřelí (kvůli nedostatku prostředků): START_STICKY standardní chování Služba se vždy restartuje (intent v onstartcommand ale bude null) Typické pro služby, které jsou explicitně spouštěny a zastavovány pomocí startservice a stopservice (přehrávač hudby) START_NOT_STICKY Služba se restartuje, pouze pokud čekají startservice požadavky Typické pro služby, které se spouští periodicky a po skončení požadovaného úkonu se samy ukončí pomocí stopself(); (aktualizace stavů) START_FLAG_RETRY Služba se restartuje, pouze pokud čekají startservice požadavky nebo pokud před odstřelením nedokončila svoji práci (byla sestřelena před zavoláním stopself) Po restartu je předán do onstartcommand původní intent

16 Service Na rozdíl od aktivity má daná služba vždy maximálně jednu instanci Po opětovném zavolání startservice se pouze opětovně zavolá onstartcommand v již běžící službě oncreate a ondestroy se chová stejně jako u aktivity Pro zjištění, jak se služba spustila slouží atribut flags, který může nabývat těchto hodnot: START_FLAG_REDELIVERY indikuje, že služba byla restartována systémem (kvůli nedostatku prostředků) před ukončením činnosti a původní Intent je znovu předán START_FLAG_RETRY indikuje, že služba byla restartována systémem (kvůli nedostatku prostředků) a měla nastaveno START_STICKY

17 Service 1. @Override 2. public int onstartcommand(intent intent, int flags, int startid) { 3. if ((flags & START_FLAG_RETRY) == 0) { 4. //jedna se o restart, intent = null 5.... 6. else { 7.... 8. 9. return Service.START_STICKY; 10.

18 Provázání služby Pokud chceme mít odkaz na konkrétní instanci služby a možnost přistupovat k jejím metodám, musíme jí provázat s aktivitou pomocí bindservice V dané službě musíme také naimplementovat onbind Vhodné pro aktivity, které potřebují komplexnější komunikaci se službou

19 Provázání služby V dané službě vytvoříme třídu která dědí od Binder a vrací odkaz na danou instanci služby Odkaz na instanci této třídy vrátíme v onbind 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. private final IBinder binder = new MyBinder(); public class MyBinder extends Binder { MyService getservice() { return MyService.this; @Override public IBinder onbind(intent intent) { return binder;

20 Provázání služby V aktivitě vytvoříme třídu dědící od ServiceConnection 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. // odkaz na sluzbu private MyService service; // ma na starosti spojeni mezi sluzbou a aktivitou private ServiceConnection mconnection = new ServiceConnection() { // spusti se jakmile se povede navazat spojeni public void onserviceconnected(componentname classname, IBinder service) { //ziskame instanci nasi sluzby service = ((MyService.MyBinder) service).getservice(); // spusti se jakmile se spojeni ukonci public void onservicedisconnected(componentname classname) { service = null; ; Její instanci poté předáme do bindservice 1. Intent i = new Intent(this, MyService.class); 2. bindservice(i, mconnection, Context.BIND_AUTO_CREATE);

21 Notifikace Slouží k upozornění uživatele na nějakou událost bez použití Activity Indikují také probíhající služby (služby, které mají zvýšenou prioritu) Mohou mít tyto funkce: Zobrazení ikonky ve statusbaru Zobrazení podrobnějších informací a spouštění Intentů po rozbalení statusbaru Blikání notifikačních LED diod Zvukové upozornění

22 Notification Manager Systémová služba starající se o notifikace Umožňuje vytvářet nové notifikace, upravovat staré nebo odstranit již nepotřebné 1. String svcname = Context.NOTIFICATION_SERVICE; 2. NotificationManager notificationmanager; 3. notificationmanager = (NotificationManager)getSystemService(svcName);

23 Notifikace Vytvoření notifikace a nastavení základních parametrů 1. 2. 3. 4. 5. 6. 7. 8. 9. // Vybereme ikonku, ktera se bude zobrazovat u notifikace int icon = R.drawable.icon; // Text ktery se objevi pri aktivace notifikace String tickertext = "Notifikace"; // Cas, podle ktereho se urcuje poradi notifikaci long when = System.currentTimeMillis(); Notification notification = new Notification(icon, tickertext, when); //Nastavime pocet, ktery bude zobrazen pres ikonku notifikace notification.number=10;

24 Notifikace Nastavení defaultního View po rozbalení statusbaru a Intentu, který se spustí po kliku na notifikaci 1. Context context = this; 2. // Text ktery se zobrazi po roztahnuti statusbaru 3. String expandedtext = "Podrobny text notifikace"; 4. // Titulek notifikace po roztahnuti statusbaru 5. String expandedtitle = "Titulek notifikace"; 6. // Intent ktery spusti aktivitu po kliknuti na notifikaci 7. Intent intent = new Intent(this, MainActivity.class); 8. PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0); 9. //Nastavime defaultni View 10. notification.setlatesteventinfo(context, expandedtitle, expandedtext, pi); Zobrazení notifikace 1. 2. int id=0; notificationmanager.notify(id, notification);

25 PendingIntent Zapouzdří Intent, který pak může být použit systémem nebo jinými aplikacemi Existují 3 typy, podle toho, co bude dělat: Spustí aktivitu (jako zavolání Context.startActivity(Intent)) Spustí službu (jako zavolání Context.startService(Intent)) Vyšle broadcast (jako zavolání Context.sendBroadcast()) Obdrží se zavoláním patřičné metody 1. pi=pendingintent.getactivity(context, requestcode, intent, flags); 2. pi=pendingintent.getservice(context, requestcode, intent, flags); 3. pi=pendingintent.getbroadcast(context, requestcode, intent, flags);

26 Notifikace probíhající služba Defaultně služba běží na pozadí když systém potřebuje prostředky, odstřelí ji a nepředpokládají se větší škody Pokud potřebujeme zvýšit prioritu služby (např. hudební přehrávač), musíme jí dostat do popředí nastavením notifikace Je téměř zaručeno, že systém tuto službu neodstřelí V tomto případě nepoužijeme NotificationManager, ale metodu na to speciálně určenou, která automaticky po skončení služby odstraní notifikaci 1. startforeground(id, notification);

27 Notifikace další parametry notification.contentview nastavení vlastního layoutu notifikace po rozbalení statusbaru notification.defaults možnosti upozornění (DEFAULT_LIGHTS DEFAULT_SOUND DEFAULT_VIBRATE) notification.flags upřesnění notifikace (viz dokumentace) notification.sound Uri souboru pro zvukové upozornění notification.vibrate Pole s hodnotame, v jaké frekvenci bude telefon vibrovat notification.ledargb Barva LED diody