Aplicatii Java Pentru Dispozitive Mobile

Cuprins

Introducere

CAPITOLUL I

Studiul, analiza și sistemului existent

1.1 Prezentarea unității economico-sociale

1.2 Scurt istoric al unității economice

1.3 Activitățile desfășurate în unitatea economică (caracteristicile generale ale sistemului economic din unitate)

1.4 Studiul sistemului de conducere

1.4.1 Directorul General

1.4.2 Directorul Economic – (CFO)

1.5 Studiul sistemului condus

1.5.1. Departamentul Finanțe și Administrație

1.5.2. Departamentul IT&IS

1.5.3. Departamentul de Marketing

1.5.4. Departamentul Ingineering & Research

CAPITOLUL II

Prezentarea tehnologiilor informatice utilizate

2.1 Obiective generale avute în vedere

2.2 Definirea sistemului de codificare

2.3. Limbaje de programare avansată – Java

2.3.1. Scurt istoric

2.3.2 Evoluție

2.3.3. Java de la „hello world” la applet-uri

CAPITOLUL III

Sisteme software pentru aplicații mobile

3.1. Istoricul sistemelor de operare

3.2. Platforma Android

3.2.1 Versiuni de Android

CAPITOLUL IV

Prezentarea produsului software, implementarea și exploatarea aplicației

4.1. Eficiența și utilitatea aplicației informatice

4.2. Cerințele platformei hardware și software ale produsului

4.3. Sructura aplicației

4.4. Descrierea aplicației

4.5. Limbaj și codificare

4.5.1. Theme si layout-uri

4.5.2. Structura aplicatiei

4.5.3. Splash screen

4.5.4. Sunete și muzică de fundal

4.5.5. Butoane

4.5.6. ExpandableListView

4.5.7 Exit, task & stack

Bibliografie

Anexe

Anexa nr.1 – MainActivity.java

Anexa nr.2 –activity_main.xml

Anexa nr.3 –SplashActivity

Anexa nr.4 –Invata_activity.class(ExpandableListView)

Introducere

Sectorul jocurilor pe dispozitive mobile este relativ nou, având în vedere evoluția sistemelor informatice din ultimele două decenii. Primul calculator (sistem de calcul) 1948, primul joc pe calculator (X si 0) 1952, primul telefon mobil 1973, primul joc pentru telefoane mobile (tetris) 1994, 3 ani mai târziu Nokia a lansat jocul Snake.

Vânzarea de jocuri video a pornit în 1970 o data cu apariția primelor generații de console de jocuri și calculatoare personale. Datorită costurilor scăzute și performanțelor reduse ale calculatoarelor, un singur programator putea dezvolta singur un joc complet. Totuși, aproape de secolul 21, creșterea puterii de procesare a computerelor și așteptărilor sporite ale consumatorilor au pus în dificultate developerii ce produceau de unul singur jocuri simple pentru consolă sau pentru PC.

Noul mileniu a inaugurat în sectorul jocurilor pe mobil o abundență de idei mari, finanțate – mulțumită investitorilor dornici să-și asume acest risc – noilor editori și developeri. Tot mai multe telefoane având ecrane color pentru prima oara, entuziasmul „consumatorilor” fiind inevitabil. În plus, câțiva dintre dezvoltatorii de telefoane mobile au început să integreze în acestea suport pentru cea mai populară versiune a limbajului de programare Java. Împreună, aceste evoluții au accelerat foarte mult dezvoltarea jocurilor de calitate pentru telefoane mobile.

Tema, „Aplicații java pentru dispozitive mobile”, îmbină dezvoltarea rapida a aplicațiilor informatice cu puterea de adaptare și optimizare a limbajului de programare Java.

În prezent companiile producatoare de dispozitive mobile duc o competiție acerbă, încercând să se întreacă una pe cealaltă prin tehnologia folosită, design-ul si performanțele produsului finit dar și prin raport calitate-pret. Cu toate acestea developerii de jocuri și aplicații(pentru dispozitive mobile) trebuie să țina pasul cu acestea și cu cerințele, nevoile clienților întrecându-se la rândul lor de asemenea prin tehnologia folosită, grafica aplicației și piața pe care activează.

CAPITOLUL I

Studiul, analiza și sistemului existent

Prezentarea unității economico-sociale

–DENUMIREA COMPANIEI: PopCap Games Inc.

–SEDIUL CENTRAL: SEATTLE, WA

–FONDATA: 2000

–DOMENIU DE ACTIVITATE: DEZVOLTATOR ȘI EDITOR DE JOCURI VIDEO

–SECTOR: INTERNET

–INDUSTRIE: INTERNET SOFTWARE & SERVICES

–SUB-INDUSTRIE: GAMING

PopCap Games Inc este unul dintre cei mai mari dezvoltatori de jocuri video, având sediul central în Seattle, Washington, Statele Unite ale Americii, fiind o ramură a Electronic Arts. Compania a fost fondată în anul 2000 (numită până atunci „Sexy Action Cool” ) de catre John Vechey, Brian Fiete si Jason Kapalka, și la momentul actual are aproximativ 475 de angajați la nivel mondial (Seattle, San Francisco, Vancouver, BC, Dublin, Seul, Tokyo și Shanghai). Majoritatea jocurilor PopCap sunt jucate gratuit într-o forma limitată, jocul în întregime putând fi achiziționat contracost.

Cel mai bine vandut joc fiind Bejeweled, lansat în 2001, aproape 50 milioane de copii în întreaga lume și continuă să se vândă câte o copie la fiecare 4.3 secunde (generând aproape 300 milioade de dolari în vânzări).

Jocurile PopCap sunt compatibile cu toate platformele și sistemele de operare, Web, PC, Mac, Nintendo DS, Nintendo DSi, Wii, Xbox, Xbox 360, PlayStation 3, Zeebo, cell phones, PDAs, iPod Classic, iOS, Android, BlackBerry Tablet OS, Windows Phone, Windows/RT și alte dispozitive mobile.

Câștigurile companiei cât și numărul de clienți ca o comparație, perioada 2009-2010 înainte ca compania să fie cumpărată de Electronic Arts și perioada 2010-2011, după ce aceasta a fost cumparată se pot vedea în Figura 1.

Înca de la începuturi, compania PopCap Games, a crescut în topurile Marketplace-urilor, din 2005 aceasta se situează pe primele locuri în clasamentul celor mai bune 100 de companii dezvoltatoare de jocuri.

Cele mai populare jocuri fiind: Bejeveled, AstroPop, Feeding Frenzy, Insaniquarium, Plants vs. Zombies, Zuma, Diner Dash.

Scurt istoric al unității economice

PopCap Games Inc. a fost fondată în anul 2000 (numită până atunci „Sexy Action Cool” ) de catre John Vechey, Brian Fiete și Jason Kapalka. Inițial fondatorii au creat jocurile urmând tutorialele altor site-uri de specialitate. Primul joc a fost Bejeweled, care, s-a bucurat de un real succes fiind compatibil cu toate platformele. În 2002 a fost premiat de catre Computer Gaming Woeld Hall of Fame.

Compania s-a extins în 2005 cumpărând Sprout Games (fondată de catre James Gwertzman), o companie mică asemeni PopCap. Sprout Games este creatorul jocului Feeding Frenzy, apoi echipa acestora s-a mutat în Seattle iar împreună cu echipa PopCap au creat un alt joc de succes, Feeding Frenzy2, urmând ca apoi Gwertzman să devină Director of Business Development la compania mamă.

La începutul anului 2006, PopCap International a deschis 2 noi sedii, în Dublin și în Irlanda, acestea ocupându-se de Product localization, mobile games development, marketing, sales, și business development.

Pe 22 august 2006, Valve software a încheiat un parteneriat cu PopCap Games Inc. urmând ca din 30 august 17 jocuri să fie disponibile pe Steam. Ca o tradiție, fiecare joc PopCap oferit prin Steam să fie disponibil gratis sub o formă limitată urmând apoi contracost să ai acces la varianta completă.

Un alt birou a fost deschis la Chicago. În 2007, PopCap games intrând pe piața jocurilor puzzle, arcade și de actiune.

În iulie 2011 compania a fost cumparată de către EA Games pentru 650 milioane de dolari plus 100 milioane de dolari pentru stocul companiei la momentul respectiv.

Pe 21 august 2012, compania a concediat 50 de angajați din America de Nord mutându-și adresa și reprofilându-se pe jocuri pentru dispozitive mobile și Free-to-Play. Biroul de la Dublin închizându-se pe 24 septembrie 2014

În tot acești timp PopCap Games a câștigat 25 de premii în industria jocurilor incluzând Computer Gaming World Hall of Fame pentru jocul Bejeweled.

Activitățile desfășurate în unitatea economică (caracteristicile generale ale sistemului economic din unitate)

PopCap este principalul dezvoltator, editor și operator la nivel mondial de jocuri video (jocuri ocazionale, distractive, usor de învățat, captivante). Acestea sunt compatibile aproape toate generațiile de dispozitive mobile, pc-uri și alte platforme.

1.4 Studiul sistemului de conducere

Sistemul de management al organizației este văzut ca un proces major ce asigură identificarea, înțelegerea și conducerea unitară a proceselor ce-l compun în scopul obținerii eficacității, eficienței și îmbunătățirii sale continue.

Strategia organizației referitoare la responsabilitatea managementului este:

de a defini, documenta, menține și analiza politica în domeniul calității

de a stabili și documenta obiectivele calității precum și de a planifica sistemul de management al calității

de a defini responsabilitățile și autoritățile și a le comunica în cadrul organizației.

de a analiza periodic sistemul de management al calității pentru a se asigura că este corespunzător, adecvat și eficace.

Toți responsabilii de proces din cadrul organizației, fiecare conform responsabilității sale, au obligația de a demonstra angajamentul lor față de calitate astfel:

inițiază, conduc și urmăresc implementarea politicii în domeniul calității, inclusiv implementarea și menținerea sistemului de management al calității;

neacceptarea abaterilor față de politica în domeniul calității și a irosirii resurselor în orice sector sau activitate a organizației;

asigură resurse și instruiri adecvate pentru susținerea implementării și dezvoltării sistemului de management al calității.

1.4.1 Directorul General

În engleză – chief executive officer, abreviat CEO, este funcția cea mai înaltă din cadrul majorității organizațiilor, în special în companii, este responsabil cu Afaceri Corporative si Conformitate , Comunicare si Sustenabilitate , Juridic , Strategie , Dezvoltare Corporativa și Relația cu Investitorii ; Sănătate , Siguranța Muncii , Securitate și Mediu , Resurse Umane , Achiziții Operaționale ,Afaceri Publice Corporative si de Reglementare .

Directorul General este ales de Consiliul de Administrație dintre membrii săi și îndeplinește funcția de conducător efectiv al companiei, este un angajat (salariat) al organizației și face parte, împreună cu directorii adjuncți (vice-președinți, pro-rectori etc.), din managementul de vârf, acesta fiind responsabil pentru organizație în ansamblu și pentru activitatea managerilor de mijloc

În calitate de Director General pune în executare hotărârile Consiliului de Administrație , sens în care emite decizii scrise și dispoziții . Deciziile și dispozițiile sunt executorii imediat și își produc efectele din momentul în care sunt aduse la cunoștință persoanelor care sunt abilitate să le aducă la îndeplinire.

1.4.2 Directorul Economic – (CFO)

Asa cum este numit în literatura de specialitate a nivelului economic poate fi definit într-un cuvânt direct : responabil cu Departamentul Financiar , Controlling , Audit Intern , Global Solution .

Studiul sistemului condus

1.5.1. Departamentul Finanțe și Administrație

Asigură buna gestionare a patrimoniului companiei;

Asigură respectarea legislației fiscale la nivel de companie, organizează contabilitatea acesteia în conformitate cu dispozițiile legale asigurând la timp efectuarea înregistrărilor;

Întocmește bugetul general al companiei , informează și face propuneri de corecție asigură întocmirea in timp și in conformitate cu dispozițiile legale a balanțelor de verificare, bilanțurilor semestriale și anuale cât si situațiile lunare cu privire la principalii indicatori economico-financiari;

Raportează rezultatele finaciare ale companiei, analizează și propune măsuri pentru creșterea rentabilitații;

Implementează sistemul general de evidență a gestiunii companiei;

Organizează și conduce activitatea departamentului financiar – contabil și exercită controlul financiar preventiv;

Răspunde de calitatea activității financiar contabile și de corectitudinea analizelor economice;

Răspunde de menținerea capacitații de plată a societății si de efectuarea corectă si la timp a calculului drepturilor bănești a personalului angajat;

Îndeplinirea la termen și in conformitate cu dispozițispozițiile sunt executorii imediat și își produc efectele din momentul în care sunt aduse la cunoștință persoanelor care sunt abilitate să le aducă la îndeplinire.

1.4.2 Directorul Economic – (CFO)

Asa cum este numit în literatura de specialitate a nivelului economic poate fi definit într-un cuvânt direct : responabil cu Departamentul Financiar , Controlling , Audit Intern , Global Solution .

Studiul sistemului condus

1.5.1. Departamentul Finanțe și Administrație

Asigură buna gestionare a patrimoniului companiei;

Asigură respectarea legislației fiscale la nivel de companie, organizează contabilitatea acesteia în conformitate cu dispozițiile legale asigurând la timp efectuarea înregistrărilor;

Întocmește bugetul general al companiei , informează și face propuneri de corecție asigură întocmirea in timp și in conformitate cu dispozițiile legale a balanțelor de verificare, bilanțurilor semestriale și anuale cât si situațiile lunare cu privire la principalii indicatori economico-financiari;

Raportează rezultatele finaciare ale companiei, analizează și propune măsuri pentru creșterea rentabilitații;

Implementează sistemul general de evidență a gestiunii companiei;

Organizează și conduce activitatea departamentului financiar – contabil și exercită controlul financiar preventiv;

Răspunde de calitatea activității financiar contabile și de corectitudinea analizelor economice;

Răspunde de menținerea capacitații de plată a societății si de efectuarea corectă si la timp a calculului drepturilor bănești a personalului angajat;

Îndeplinirea la termen și in conformitate cu dispozițiile legale a obligațiilor față de bănci;

Respectarea disciplinei financiar – valutare;

1.5.2. Departamentul IT&IS

Atribuțiile departamentului IT sunt următoarele;

Întreținerea rețelelor de calculatoare, a stațiilor de lucru a serverelor și a echipamentelor existente;

Monitorizarea si întreținerea conexiunilor internet;

Actualizarea paginilor Web cu materialele furnizate de celelalte departamente;

Întreținerea aplicațiilor existente si dezvoltarea unor noi aplicații , în funcție de cerințele de lucru ale departamentelor;

Asigură copii de siguranță(backup) pentru bazele de date critice pentru activitatea companiei, respectiv datelor contabile si cele referitoare la sistemul de compensare decontare, registrul si tranzacțiile efectuate;

Propune îmbunătățiri(upgrade) pentru echipamente si software, acordă consultanță de specialitate;

Restaurarea informațiilor referitoare la întregul soft specializat în caz de incident;

Stabilirea configurației utilizatorilor modului de comunicații, operare și supravegherea softului aferent, prin: salvarea tuturor informațiilor referitoare la întregul soft, stabilirea si monitorizarea grupurilor de utilizatori, definirea drepturilor de acces la aplicație pentru fiecare grup de utilizatori, definirea utilizatorilor, introducerea datelor, a sistemului de comunicații și internet;

Implementarea programelor informatice necesare susținerii activității companiei;

Întreținerea programelor informatice prin acordarea de asistență în proiectarea; noilor cerințe, dezvoltarea de programe auxiliare programelor deja existente, testarea noilor programe;

Eliberarea specificațiilor acolo unde este cazul pentru programele încredințate.

1.5.3. Departamentul de Marketing

Departamentul de Marketing al unei companii are mai multe atribuții principale, enumerate în cele ce urmează:

– prospectarea pieței interne;
– prospectarea pieței externe;
– propunerea structurii, volumului și a eșalonării produselor și serviciilor de realizat în firmă;
– propunerea de modalități în vederea accelerării și amplificării vânzării produselor;
– prospectarea nevoilor de consum;
– fundamentarea strategiei societății și la elaborarea programelor și planurilor de desfășurare a producției și serviciilor;
– pregătirea pieței pentru primirea produsului printr-o alegere judicioasă a circuitelor și formelor de distribuție, precum și printr-o campanie publicitară adecvată;
– propunerea structurii, volumului și eșalonării în timp a produselor și serviciilor pe care trebuie să le realizeze societatea, precum și a modalitaților de accelerare și amplificare a desfacerii acestora;
– introducerea și testarea noilor prototipuri de produse prin intermediul piețelor de probă;
– stabilirea unor politici de prețuri a produselor în toate fazele ciclului de viață;
– organizarea judicioasă a procesului de vânzare și a unor prestații post-vânzare;
– lansarea produsului pe piață, insoțită de o comunicare continuă cu clienții;
– elaborarea de strategii în vederea imbunătățirii produselor oferite de firmă;
– monitorizarea măsurii în care produsele oferite de firmă satisfac standardele clienților;
– asigurarea pregătirii profesionale și actualizarea cunoștințelor prin măsuri de perfecționare a pregătirii personalului din serviciul marketing.

1.5.4. Departamentul Ingineering & Research

Departamentul Ingineering & Research din cadrul unei companii se ocupă atât de dezvoltarea produselor pe care aceasta le dezvoltă cât și de realizarea statisticilor cu privire la noile tendințe (în materie de jocuri), feedback-ul clienților, numărul de utilizatori, etc.

CAPITOLUL II

Prezentarea tehnologiilor informatice utilizate

2.1 Obiective generale avute în vedere

Majoritatea jocurilor pe console și PC-uri sunt în general dezvoltate în etape. Prima dată, în pre-producție sunt scriși pașii, prototipurile și documentele de proiectare ale jocului.

Dacă o idee este aprobată și developerii primesc finanțare, atunci se pornește dezvoltarea la scală largă. De obicei acest proces implică o echipă de 20 până la 100 de persoane, fiecare având diferite responsabilități ca designeri, artiști, programatori, testeri, etc.

Jocul trece prin mai multe stadii de dezvoltare, alpha, beta, până când varianta finală este lansată. Jocurile moderne sunt promovate din timp pentru a trezii interesul publicului țintă, în scurt timp se lansează un demo al jocului, urmărind în detaliu feedback-ul jucătorilor, urmând ca apoi să fie lansat în varianta completă. Cu toate acestea multe jocuri nu ajung să fie profitabile.

Jocurile pentru dispozitive mobile sunt în general mai usor de dezvoltat decât majoritatea jocurilor pe console si PC-uri. De obicei acestea sunt lansate cât mai repede posibil, chiar și la câteva luni de la dezvoltare, pentru a vedea modul în care acestea evoluează. Prin urmare jocurile pe dispozitive mobile pot fi dezvoltate și de un singur developer, un studio mare poate avea până la 100 de persoane lucrând la același proiect asemeni echipelor de dezvoltare a jocurilor pe console și PC-uri.

2.2 Definirea sistemului de codificare

Android este o platformă software și un sistem de operare pentru dispozitivele și telefoanele mobile, bazată pe nucleul Linux, dezvoltată inițial de compania Google, iar mai târziu de consorțiul comercial Open Handset Alliance. Android permite dezvoltatorilor să scrie cod gestionat în limbajul Java, controlând dispozitivul prin intermediul bibliotecilor Java dezvoltate de Google. 

Venind în sprijinul tuturor programatorilor, PopCap Games a lansat și un kit de dezvoltare (PopCap Games Framework, denumirea oficială a fost SexyApp Framework) pentru C++. Acesta este special conceput pentru a permite programatorilor să creeze usor și rapid jocuri în stilul PopCap, este deasemenea și o parte a programului de dezvoltare ce încurajează ceatorii de jocuri să își distribuie creațiile/jocurile prin intermediul PopCap Games. Acest kit este gratuit și ajută la crearea de jocuri asemeni Bejeweled-ului și Cake Mania. Framework-ul rulează official doar pe sistemul de operare Windows, dar, unele jocuri au fost adaptate și pe Mac. Se fac însa eforturi mari pentru a adapta framework-ul și pentru Linux.

2.3. Limbaje de programare avansată – Java

2.3.1. Scurt istoric

Limbajul de programare Java a fost lansat în anul 1995, pe timpul când internetul se afla în plină dezvoltare. Inițial limbajul a fost lansat incluzând Hot Java Web Browser, scris și el deasemenea în Java. Acesta a facut posibilul ca browserele sa execute programe ca și appleturile într-o pagina web. În scurt timp, Netscape și Microsoft și-au adaptat browserele să poată suporta appleturile java.

Cu toate acestea, Java este un limbaj de programare orientat-obiect, puternic tipizat, conceput de către James Gosling (la Sun Microsystems – acum filiala Oracle) la începutul anilor ’90.

Istoric al versiunilor:

23 ianuarie 1996, JDK 1.0 – versiunea inițială

19 februarie 1997, JDK 1.1

8 decembrie 1998, J2SE 1.2

8 mai 2000, J2SE 1.3

6 februarie 2002, J2SE 1.4

30 septembrie 2004, J2SE 5.0, numărul de versiune 1.5 este păstrat ca număr intern de versiune

11 decembrie 2006, Java SE 6

14 februarie 2012, Java SE 7

18 martie 2014, Java SE 8

2.3.2 Evoluție

Cele mai multe aplicații distribuite sunt scrise în Java, iar noile evoluții tehnologice permit utilizarea sa și pe dispozitive mobile (telefon, agendă electronică, palmtop, etc). În felul acesta se creeaza o platformă unică, la nivelul programatorului, deasupra unui mediu eterogen extrem de diversificat. Acesta este utilizat în prezent cu succes și pentru programarea aplicațiilor destinate intraneturilor.

Limbajul împrumută o mare parte din sintaxa de la C și C++, dar are un model al obiectelor mai simplu și prezintă mai puține facilitați de nivel jos. Un program Java compilat, corect scris poate fi rulat fără modificare pe orice platforma care e instalată o mașină virtuală Java (JVM). Acest nivel de portabilitate (inexistent pentru limbajele mai vechi cum ar fi C) este posibil deoarece sursele Java sunt compilate într-un format standard numit cod de octeți (byte-code) intermediar între codul mașina (dependent de tipul calculator) și codul sursă.

Mașina virtuală Java este mediul în care se execută programele Java. În prezent, există mai multi furnizori de JVM, printer care Oracle, IBM, Bea, FSF.

În 2006 Sun a anunțat că face disponibilă varianta de JVM ca open-source.

Există 4 platforme Java furnizate de Oracle:

Java Card – pentru smartcard-uri (carduri cu cip),

Java Platform, Micro Edition (Java ME) – pentru hardware cu resurse limitate (PDA sau telefoane mobile),

Java Platform, Standard Edition (Java SE) – pentru sisteme workstation, este ceea ce se regăseste în PC-uri,

Java Platform, Enterprise Edition (Java EE) – pentru sisteme de calcul mari, eventual distribuite.

2.3.3. Java de la „hello world” la applet-uri

Pentru a putea scrie un program în limbajul Java, avem nevoie de un IDE(integrated development environment – mediu de dezvoltare integrat), acesta este un mediu de lucru care permite dezvoltarea de aplicații folosind anumite limbaje de programare.

În cazul de față, pentru Java, sunt folosite urmatoarele:

JCreator

Eclipse

NetBeans

BEA Workshop

BlueJ

CodeGuide

DrJava

IntelliJ IDEA

JBuilder

JDeveloper

Kdeveloper

Amintim principalele caracteristici ale limbajului:

simplitate, elimina supraîncarcarea operatorilor, moștenirea multiplă și toate "facilitațile" ce pot provoca scrierea unui cod confuz.

robustețe, elimina sursele frecvente de erori ce apar în programare prin eliminarea pointerilor, administrarea automată a memoriei și eliminarea fisurilor de memorie printr-o procedură de colectare a 'gunoiului' care rulează în fundal. Un program Java care a trecut de compilare are proprietatea ca la execuția sa nu "crapa sistemul".

complet orientat pe obiecte – elimină complet stilul de programare procedural

usurința în ceea ce privește programarea în retea

securitate, este cel mai sigur limbaj de programare disponibil în acest moment, asigurând mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamica a codului pentru detectarea secventelor periculoase, impunerea unor reguli stricte pentru rularea programelor lansate pe calculatoare aflate la distanță, etc

neutru din punct de vedere architectural

portabililtate, cu alte cuvinte Java este un limbaj independent de platforma de lucru, aceeași aplicație rulând, fără nici o modificare, pe sisteme diferite cum ar fi Windows, UNIX sau Macintosh, lucru care aduce economii substanțiale firmelor care dezvoltă aplicații pentru Internet.

compilat și interpretat

asigura o performanță ridicată a codului de octeti

permite programarea cu fire de execuție (multitheaded)

dinamicitate

este modelat dupa C și C++, trecerea de la C, C++ la Java facându-se foarte usor.

permite creearea unor documente Web îmbunatățite cu animație și multimedia.

În funcție de modul de execuție al programelor, limbajele de programare se împart în două categorii :

interpretate : instrucțiunile sunt citite linie cu linie de un program numit interpretor și traduse în instrucțiuni mașina; avantaj : simplitate; dezavantaje : viteza de execuție redusă

compilate : codul sursa al programelor este transformat de compilator într-un cod ce poate fi executat direct de procesor; avantaj : execuție rapida; dezavantaj : lipsa portabilității, codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe platforma pe care a fost compilat.

Programele Java sunt atât interpretate cât și compilate.
Codul de octeți este diferit de codul mașină. Codul mașină este reprezentat de o succesiune de 0 și 1; codurile de octeți sunt seturi de instrucțiuni care seamănă cu codul scris în limbaj de asamblare. Codul mașină este executat direct de catre procesor și poate fi folosit numai pe platforma pe care a fost creat; codul de octeți este interpretat de mediul Java și de aceea poate fi rulat pe orice platformă care folosește mediul de execuție Java. 

Cea mai simplă aplicație scrisă în Java se caracterizează prin declararea unei variabile(string) și afișarea unui text(„hello world”).

Codul sursă al programului „Hello world”:

class FirstApp {

public static void main( String args[]) {

System.out.println("Hello world");

}

}

Toate aplicațiile Java conțin o clasa principală(primară) în care trebuie să se gasească metoda „main”. Clasele aplicației se pot gasi într-un fisier sau mai multe.

Fișierul salvat are extensia .java, el contine codul sursă al clasei primare ce trebuie să aiba același nume cu clasa primară a aplicației (clasa care conține metoda „main”).

CAPITOLUL III

Sisteme software pentru aplicații mobile

3.1. Istoricul sistemelor de operare

Sistemele de operare pentru telefoane mobile joacă un rol foarte important în viața de astăzi, majoritatea lor se bazează pe Linux, astfel există o compatibilitate privind aplicațiile. Aceste sisteme de operare au apărut odata cu avansul tehnologic și mai ales cu evoluția procesoarelor și memoriilor RAM care au permis rularea mai multor procese și implicit multitasking.

Primul sistem de operare mobil s-a numit Symbian, sistem de operare care a utilizat aceași interfață ani la rând apoi au urmat și alte sisteme mult mai rapide ce au știut să se adapteze vremurilor precum Android sau iOS.

Sistemele de operare au avut un impact foarte mare asupra pieței telefoanelor mobile, denumite smartphone-uri. Acestea au acaparat piața în detrimentul telefoanelor clasice. Avantajele sunt posibilitatea rulării mai multor aplicații simultan (multitasking), viteza de lucru sporită, o multitudine de programe, însă marele dezavantaj il reprezintă securitatea.

Practic sistemul de operare reprezintă un asamblu de programe și drivere ce fac legătura între software și hardware. Performanța sistemelor de operare depinde de optimizarea și kerne-ul lor. În timp ce unele sisteme de operare rulează foarte bine cu doar 256 MB de RAM și procesor mic de doar 1 Ghz, altele necesită un minim de 512 MB de RAM și procesor mai nou (cel puțin dual core) pentru a nu avea lag în meniu.

Ca si evolutie/aparitie a sistemelor de operare avem:

-1996 – Palm OS – cu urmatoarele aplicații – To Do List, Memo Pad, Date Book, RIM Applications address ,

-2000 – Pocket PC 2000

– 2005 – Blackberry OS 4.1 si primele versiuni de beta Android 1.0

– 2007 – iOS

– 2008 – Lansarea oficială versiunii finale de Android 1.0; Symbian^1

– 2009 – Samsung Bada 1.0; Hp Web OS

3.2. Platforma Android

În iulie 2005 Android Inc a fost achiziționată de catre Google, o mică companie de tip start-up cu sediul în Palo Alto, California, SUA. Cofondatorii companiei Android, au continuat să lucreze la Google, au fost Andy Rubin (cofondator – Danger), Rich Miner (cofondator – Wildfire Communications, Inc), Nick Sears (fost vicepreședinte – T-Mobile) și Chris White (unul dintre primii ingineri ai WebTV). Achizițioanrea Android Inc. a cauzat zvonuri cum ca Google planuiește să intre pe piața telefoniei mobile, nefiind clar ce funcție ar putea indeplini în această piață.

La Google, echipa condusă de Rubin a dezvoltat un sistem de operare pentru dispozitive mobile bazat pe Linux, pe care l-au prezentat producatorilor de telefoane mobile și operatorilor de rețele de telefonie mobilă, cu perspectiva de a asigura un sistem flexibil, upgradabil. Google a raportat că a aliniat deja o serie de parteneri producători de componente hardware și software la noul concept, a semnalat operatorilor de rețele de telefonie mobilă că era deschis la diferite grade de cooperare din partea acestora. Mai multe speculații precum că Google ar fi putut intra pe piața telefoniei mobile au apărut în decembrie 2006. Rapoarte de la BBC și Wall Street Journal au remarcat faptul că Google își dorea un web search și aplicații pe telefoane mobile și că se lucra din greu pentru acest țel. Presa și site-urile de știri au publicat curând zvonuri că ar dezvolta un dispozitiv mobil marca Google. A urmat și mai multă speculație, susținând că în timp ce Google definea specificațiile tehnice, ar fi demonstrat prototipuri producătorilor de telefoane mobile și operatorilor de rețea. S-a raportat că până la 30 de telefoane prototip operau deja pe piață.

În septembrie 2007 InformationWeek a publicat un studiu al companiei Evalueserve care dezvăluia că Google a depus cereri pentru mai multe brevete de invenție în domeniul telefoniei mobile.

Lansarea platformei Android la 5 noiembrie 2007 a fost anunțată prin fondarea Open Handset Alliance, un consorțiu de 48 de companii de hardware, software și de telecomunicații, consacrat dezvoltării de standarde deschise pentru dispozitive mobile. Google a lansat cea mai mare parte a codului Android sub licența Apache, o licență de tip free-software și open source.

3.2.1 Versiuni de Android

Lista versiunilor sistemului de operare Android începe cu lansarea Android 1.0 (versiune beta) din noiembrie 2007.

Până în prezent Android are un număr mare de update-uri, acestea elimină bug-urile și adaugă caracteristici noi. Din aprilie 2009 fiecare versiune a dezvoltat un nume de cod bazat pe deserturi. Aceste versiuni au fost lansate în ordine alfabetica: Cupcake 1.5(briosa), Donut 1.6(gogoasa), Eclair 2.0(ecler),Froyo 2.2.x(iaurt inghetat), Gingerbread 2.3.x(turta dulce), Honeycomb 3.x(fagure de miere), ice cream sandwich 4.0.x(sandwich de inghetata), jelly bean 4.1.x(jeleu in forma de fasole) si KittKatt 4.4.x. Urmatoarea versiune „L version” fiind în faza de developer preview. Versiunile prelansate au fost numite Astro și Bender, dar acestea nu au putut fi aplicate în varianta oficială din cauza mărcii comerciale.

Caracteristici Android 1.0 (API 1):

Android Market, magazinul de aplicații și update-uri

Aplicație cameră – totuși, această versiune a fost lipsită de capacitățile de a schimba rezoluția camerei, balansul de alb, calitatea, etc.

Browser web, care să arate, să mărească și să miște paginile web în HTML și XHTML- paginile multiple apărând drept ferestre

Camera support – however this version lacked the option to change the camera's resolution, white balance, quality, etc.

Foldere care permiteau gruparea unui număr de icoane de aplicații într-o singură iconiță de folder pe ecranul Home (Acasă).

Folders allowing the grouping of a number of app icons into a single folder icon on the Home screen.

Acces la serverele de web-email, prin POP3, IMAP4 și SMTP.

Sincronizare Gmail cu aplicația Gmail

Sincronizarea Contactelor Google cu aplicația People (Oameni)

Sincronizarea Calendarului Google cu aplicația Calendar

Capacitatea Hărților Google, Google Latitude și Google Street View de a pune la dispoziție imagini cu hărți și din satelit, și de asemenea, capacitatea de a găsi afaceri locale și obținerea de direcții de navigare folosind GPS

Google Sync, care permite administrarea sincronizării OTA (over-the-air) a Gmail, People (Oameni) și Calendar

Căutarea Google, care permite utilizatorilor să caute pe internet aplicații de telefon, contacte, calendar, etc.

Google Talk, mesagerie instantanee

Mesagerie instantanee, SMS și MMS

Media player, care permite administrarea ,importarea și redarea fișierelor media – lipsit însă de suportul video și stereo al Bluetooth

Notificările care apar în bara de statusuri, cu opțiuni de setare a tonului de apel, LED și alertele de aplicații

Notifications appear in the Status bar, with options to set ringtone, LED or vibration alerts

Operatorul voce care permite apelarea și plasarea apelurilor fără tastarea unui număr de telefon

Fundalul, care permite utilizatorului să seteze o imagine de fundal în spatele icoanelor de ecran din Home (Acasă) și a widget-urilor

Video player YouTube

Alte aplicații incluse: Alarmă, calculatorul, operator (telefon), ecranul de pornire, poze (Galerie) și setări

Suport Wi-Fi și Bluetooth

Caracteristici Android 4.4 KitKat (API 19):

Interfața modificată cu elemente albe în schimbul celor albastre

Ceasul nu mai este afișat cu caractere bolduite, cifrele sunt subțiri.

Posibilitatea aplicațiilor de a deveni translucente în bările de navigare și status

Abilitatea aplicațiilor de a folosi „immersiv mode” și pastrarea bărilor de navigare și status ascunse în timpul interacțiunii cu utilizatorul

Butoanele de acțiune ale meniului sunt întotdeauna vizibile

Optimizarea performanțelor pentru dispozitive cu specificații slabe, incluzând suport zRAM și „low RAM” device API

Posibilitatea de a printa prin wireless

NFC host card emulation

WebViews bazat pe motorul Chromium (parte a Chrome pentru android)

Mărirea funcționalității pentru notificarile de tipul listner services

Un nou framework pentru tranzițiile UI

Sensor batching

Setarile aplicațiilor acum fac posibila selectarea unui default text massaging și ome application

Imbunătățiri majore aduse calității sunetului

Posibilitatea de a înregistra activitățile de pe ecran

Emițător infrarosu integrat

Mărirea accesibilității API-ului și setarilor de subtitrare închise la nivel de sistem

Suport MAP

Dezactivarea accesului la statisticile bateriei pentru alte aplicații

Setarile aplicațiilor nu mai folosesc un layout multi-pane pentru dispozitivele cu ecrane mari

Indicatorii de wi-fi și date mobile sunt mutați în setări rapide

Adaptarea textului la lațimea telefonului în interiorul browserelor este dezactivată

Îmbunătațirea auto-focusului, contrastului și HDR+ pentru camera lui Nexus 5

O compatibilitate mai bună pentru runtime-ul experimental ART

Aplicația camerei încarca pozele pe Google+ în locul galeriei atunci când se iese din aplicație

Securitatea este îmbunătațită și sunt rezolvate bug-urile

Schimbarea interfetei Dialer-ului

Îmbunătațirea performanțelor browserului pentru a fi compatibil cu HTML5

Eliminarea vulnerabilității OpenSSLman-in-the-middle și CVE-2014-0224.

CAPITOLUL IV

Prezentarea produsului software, implementarea și exploatarea aplicației

4.1. Eficiența și utilitatea aplicației informatice

Aplicația „How to Java” are la baza concepția de învățare prin joc (Educational games sau Learning games), transpunând învățarea unui limbaj de programare cu ajutorul unei interfete user friendly, dar având și posibilitatea de a aprofunda în acest domeniu fără a juca propriu zis jocul.

Jocurile educative sunt jocuri proiectate în mod explicit cu scop educativ, sau care au o valoare educațională principală sau secundară, acestea sunt concepute special pentru a ajuta oamenii să învețe despre un anumit subiect, explicând conceptele, consolidând dezvoltarea, întelegerea, pe masură ce aceștia se joacă respectivul joc.

4.2. Cerințele platformei hardware și software ale produsului

Softul este conceput pentru o gamă largă de versiuni de android (de la v2.2 până la v4.4), astfel încât poate rula pe majoritatea telefoanelor mobile existente pe piață.

Cerințe minime de sistem:

RAM: 256MB

CPU: 600MHz ARM 11

GPU: Adreno 200

Hdd: 25MB

4.3. Sructura aplicației

4.4. Descrierea aplicației

4.5. Limbaj și codificare

Android software development este un proces prin care noi aplicații sunt create pentru sistemele de operare android. Aplicațiile sunt de obicei dezvoltate în limbajul de programare Java utilizând Android Software Development Kit, dar deasemenea mai sunt și alte software-uri de dezvoltare disponibile.

În iulie 2013, peste 1 milion de aplicații au fost lansate pentru android, având un total de 25 miliarde de descarcari. Un studiu efectuat în iunie 2011 a indicat ca peste 67% din totalul de dezvoltatori au folosit aceasta platforma.

Elemente care fac aceasta platforma asa de raspandită în randul dezvoltatorilor:

platforma de dezvoltare este gratuită si open-source,

arhitectura bazată pe componente inspirat de mashup-uri de Internet, în sensul ca unele componente de cod pot fi reutilizate în cadrul altor aplicații sau unele componente predefinite pot fi reimplementate de catre dezvoltator;

utilizarea unor servicii "out-of-box": GPS, conexiune la baza de date SQL;

management automat al ciclului de viață al aplicatiei – Android este optimizat pentru putere slabă, telefoane cu memorie mică, ceea ce alte platforme nu au reușit;

grafica și sunete de calitate înaltă (OpenGL);

portabilitatea – o gama largă de hardware curente și viitoare.

Pentru a dezvolta o aplicație pentru android sunt necesare urmatoarele soft-uri:

Android SDK, include o varietate de custom tool-uri care ajută dezvoltatorul, Android Emulator (un device mobil virtual care rulează pe calculator, este utilizat pentru a vizualiza design-ul aplicației și a face debug prin testearea acesteia), Android Development Tools Plugin(Eclipse IDE),

Android Debug Bridge (ADB),

Fastboot.

Cele mai importante părți din codul unei aplicații sunt :

AndroidManifest.xml, fișier de control – înștiințează sistemul despre cum trebuie să utilizeze elementele care alcatuiesc aplicația,

Activity, un obiect care are un ciclu de viață – sectiune de cod care furnizează o anumită funcționalitate,

View, un obiect care „cunoaste” cum trebuie să arate partea grafică,

Intent, un obiect de tip mesaj care reprezintă de fapt „intentie” de a face ceva,

Notification, reprezintă o mica iconița care apare în cadrul barei de status pentru a înștiința userul asupra unui anumit eveniment ce s-a petrecut într-una din aplicații,

Service, un bloc de instrucțiuni care rulează în background.

4.5.1. Theme si layout-uri

O interfață grafică performantă este foarte importantă pentru o aplicație, fiind primul punct de contact cu utilizatorul. Având în vedere ca toate operațiile care țin de interfața se execută pe main thread, o aplicație care nu beneficiază de un UI(User Interface) optimizat poate rula încet, se poate să înghete(freez) și chiar bloca. Optimizarea interfeței fiind esențială pentru contactul cu utilizatorul.

Android iși așează componentele grafice într-o ierarhie de layout-uri, view-uri și widget-uri. Layout-urile pot conține view-uri, dar și alte layout-uri care la randul lor conțin alte view-uri și layout-uri. Aceasta imbricare a componentelor duce la realizarea unei structuri arborescente.

Aplicațiile mobile android se bazează pe eficiența și utilitatea pe interfețe compuse din ferestre de dialog, controale vizuale variate, grafica 2D și alte elemente multimedia. Platforma Android permite programatorilor să utilizeze doua metode de proiectare a interfețelor utilizator, procedural prin utilizarea de instrucțiuni cod sau declarativ prin definirea de fișiere descriptive XML.

Procedural înseamnă să utilizezi cod Java pentru proectarea interfetei cu utilizatorul. Acest lucru este ceva obisnuit în proiectarea interfețelor swing pe platforma JSE sau în proiectarea interfețelor utilizator în MIDlet-uri J2ME. Pentru că fiecare element al interfeței cu utilizatorul să fie gestionat de instante ale unor diferite clase, proiectarea interfeței înseamnă să construiești și sa gestionezi aceste instante.

Declarativ înseamnă să folosești un limbaj de marcare descriptiv, XHTML sau XML, pentru a descrie interfață cu utilizatorul. Acest lucru este similar cu modul în care paginile HTML sunt construite. Designerul scrie aspectul paginii și browserul Web interpretează și generează interfața cu utilizatorul.

Fiecare layout trebuie să conțină exact un root element, ce trebuie să fie de tipul obiect, View sau ViewGroup. Odată ce s-a definit root element-ul se pot adăuga elementele de layout, widget-uri, ca și child elements, treptat construind un View ierarhic ce definește layout-ul aplicației. De exemplu urmatorul layout XML folosește un LinearLayout vertical ce conține un element de tipul TextView și unul de tipul Button:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Acesta este un element de tipul TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Acesta este un element de tipul Button" />
</LinearLayout>

Cand se ruleaza aplicația, fiecare fisier layout XML este compilat în resursa View. Resursele layout se încarcă în codul propriu zis al aplicației, implementândule în funcția callback implementation – Activity.onCreate(). Se apleaza setContentView() facând referință la resursa layout-ului respectiv: R.layout.<numele layout-ului>. De exemplu pentru implementarea unui XML layout cu numele „main_layout.xml”:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
}

Fiecare subclasa a unei clase ViewGroup asigură o metoda unică de afișare a aplicației create de utilizator. Cele mai folosite layout-uri pentru construirea unei aplicații pe platforma android sunt:

Linear Layout (acest layout organizează elementele „children” într-o singură coloana, verticală sau orizontală, și crează un scrollbar în cazul în care lungimea ferestrei este mai mare decât a ecranului dispozitivului pe care se rulează),

Relative Layout (acest layout permite developerului să specifice locația obiectelor „child” în fereastra la care lucrează, de exemplu: child A în stânga respectiv child B în dreapta sau alinierea lui child A la top ori alinierea la parent),

Web View (acest layout afișează designul ferestrei raportat la un Web Page)

4.5.2. Structura aplicatiei

Structura aplicației este reprezentată în fereastra Package Explorer a Android Developer Tools-ului. În funcție de setarea targetul SDK-ului(minim), ADT-ul crează un pachet cu numele „appcompat_v7” destinat suportului librăriilor și referințelor necesare ca aplicația să ruleze și pe versiunile de android anterioare.

Pachetul HowToJava(<nume aplicatie>) conține toate resursele necesare pentru a rula aplicația.

Subdirectorul „src” conține întreg codul sursa structurat pe clase și funcții alea layout-urilor.

În subdirectorul „gen” se află un fisier cu ID-uri catre resurse.

În „bin” se salvează programul compilat.

Subdirectorul „res” conține atât directoarele „drawable” destinate elementelor grafice folosite în aplicație, redimensionate astfel încat să se pastreze raportul layout-ului în funcție de dimensiunea

display-ului pe care se rulează(hdpi – high-density,

mdpi – medium-density, ldpi – low-density, xhdpi – extra high-density, xxhdpi – extra extra high density), cât și directoarele „layout” conținând interfața grafică separată de codul programului, directorul „raw” destinat sunetelor aplicației și melodiilor de background, fisierul „AndroidManifest.xml” utilizat pentru a declara componentele aplicației, permisiunile utilizatorilor, nivelul minim al API-ului necesar rulării aplicației, specificații hardware și software și alte caracteristici.

4.5.3. Splash screen

Un Splash screen este un activity ce apare pentru o perioadă de timp prestabilită atunci când aplicația pornește iar după acea perioadă de timp se redirectionează către ecranul principal al aplicației. Se folosește indeosebi pentru a face reclama companiei ce a dezvoltat aplicația și pentru a îmbunătați impactul vizual mascand delay-ul și lag-ul la încarcarea elementelor vizuale alea acesteia.

Spre deosebire de iOS, android nu are un mecanism inbuilt ce afisează splash screen-ul automat ci trebuie implementat în cateva linii intr-o clasa separată de cea principala.

Pentru inceput se declară splashscreenul ca și launcher activity în AndroidManifest.xml:

<activity

android:name=".SplashAct">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

Se crează un layout în directorul /res/layout/, Splash.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/screen1"

android:orientation="vertical" >

</LinearLayout>

În directorul /src/graphic.bustudio.howtojava/, se crează un activity separat de cel principal:

package graphics.bustudio.howtojava;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.Window;

import android.view.WindowManager;

public class SplashAct extends Activity {

private static String TAG = SplashAct.class.getName();

private static short SLEEP_TIME = 5;

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

//seteaza timpul si trimitere catre main

IntentLauncher launcher = new IntentLauncher();

launcher.start(); }

private class IntentLauncher extends Thread {

public void run() {

try{

Thread.sleep(SLEEP_TIME*500);

}catch (Exception e) {

Log.e(TAG, e.getMessage()); }

Intent intent = new Intent(SplashAct.this, MainActivity.class);

SplashAct.this.startActivity(intent);

SplashAct.this.finish(); }}}

4.5.4. Sunete și muzică de fundal

Atunci când se apasa un buton, printr-o funcție special declarată, se poate reda un sunet pentru a confirma acționarea acestuia și functionalitatea lui.

Pentru a rula un sunet la apăsarea unui buton mai întai este nevoie de sunetul ce trebuie redat, acesta se adaugă în folderul /res/raw/ apoi în activity-ul în care se doreste rularea:

– se declara o variabilă ce tine locul sunetului:

final MediaPlayer buttonSoundcorect = MediaPlayer.create(this, R.raw.corect);

-în autogenerarea metodei onClick a butonului se apelează variabila astfel:

buttonSoundcorect.start();

Muzica de fundal, spre deosebire de sunetele butoanelor, trebuie adaugată în MainActivity deoarece se doreste rularea ei începand cu primele momente ale aplicației și terminarea ei atunci cand utilizatorul minimizeaza sau paraseste aplicatia.

Asemeni sunetelor butoanelor, se adaugă sunetul în folderul /res/raw/ apoi se declara o variabilă ce tine locul melodiei dupa care se apelează cu condiția de a se repeta până intervine un moment de sistem:

backgroundsound = MediaPlayer.create(MainActivity.this, R.raw.muzica_fundal);

backgroundsound.setLooping(true);

backgroundsound.start();

4.5.5. Butoane

Butoanele fac parte din UI(User Interface), asadar ele trebuie declarate mai întâi în interiorul layout-ul unde se dorește afișarea lor:

<Button

android:id="@+id/but_setari"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="@drawable/setari_icon_stare1" />

Apoi se va face referire în activity-ul ce va utiliza layout-ul în care sunt declarate butoanele:

//declararea butonului

Button but1 = (Button) findViewById(R.id.but_setari);

//atributii buton

but1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),SetariActivity.class);

startActivityForResult(intent, 0);

}});

4.5.6. ExpandableListView

Un caz particular de lista este ExpandableListView, care permite asocierea conținuturilor în grupuri, acestea putând fi expandate.

Elementele sunt însotite de un idicator ce specifica starea sa (grup – expandat sau nu, respectiv element al grupului, evidentiindu-se ultimul din sublista), existând astfel elemente de demarcație în modurile de dispunere implicite, ele putand fi de asemenea precizate de utilizator prin intermediul proprietatilor groupIndicator, respectiv childIndicator.

4.5.7 Exit, task & stack

O aplicație de obicei contine multe activities, fiecare activity trebuie dezvoltat în jurul unor actiuni specifice astfel incat utilizatorul sa poata accesa si alte activity-uri.

Un activity poate să pornească alte activity-uri care există independent pe device-ul utilizatorului. De exemplu, daca o aplicatie vrea să trimita un e-mail, se poate defini un intent ce este acționat prin actiunea „send” incluzand datele necesare pentru a facilita aceasta operație, adresa de e-mail a destinatarului cât și mesajul pe care aplicașia sa il transmită. Când e-mailul este trimis, activity-ul aplicației arată ca și cum e-mail activity facea parte din acea aplicație. Chiar daca aceste activity-uri sunt părti ale unor aplicații diferite, android menține același user experience ținand ambele activity-uri sub acelasi task.

Un task este o colecție de activity-uri prin care utilizatorul interactionează realizând un anumit lucru. Activity-urile sunt aranjate în stack-uri, în ordinea în care acestea au fost deschise.

Ecranul principal este locul de unte cele mai multe task-uri pornesc, cand userul apasa un icon al unei aplicatii, task-ul aplicației respective vine deasupra ecranului principal. În cazul în care aplicatia nu este inchisa, se creaza un nou task clona pentru ecranul principal, clona ce vine deasupra task-urilor precedente in stack, acest principiu de rearanjare este numit task focus.

Cele mai utilizate metode pentru a curata istoricul stack-urilo și task-urilor sporind performantele dispozitivelor utilizate sunt:

FLAG_ACTIVITY_CLEAR_TOP (folosit atunci cand un activity este relansat, pentru a nu se mai clona se sterge toata activitatea precedenta si activity-ul apelat revine pe pozitia 1);

FLAG_ACTIVITY_CLEAR_TASK (folosti pentru a curata toate activity-urile asociate cu activity-ul apelat din cadrul aplicatie curente).

Bibliografie

Materiale printate

"Java de la 0 la expert", Polirom, Stefan Tanasa, Cristian Olaru, Stefan Andrei, 2003,

“Beginning Android 4 Application Development”, Wei Meng Lee, Wiley, 2012,

“Pro Android 4”, Satya Komatineni, Dave McClean, Apress, 2012

Materiale online

Adresa exacta – titlu – autor – data – data ultimei accesari

„Advances in Computers”, Volume 89 , Domenico Amalfitano, Anna Rita Fasolino, Porfirio Tramontana, Bryan Robbins, 2013, ultima accesare 3 iulie 2014,

http://www.sciencedirect.com/science/bookseries/00652458/89/supp/C

„Digital Investigation”, In Press, Cosimo Anglano, 27 May 2014, ultima accesare 10 iunie 2014, http://www.sciencedirect.com/science/journal/aip/17422876

„Android Forensics”, Andrew Hoog, 2011, data ultimei accesari 2 iulie 2014,

http://www.sciencedirect.com/science/book/9781597496513

„Computers in Human Behavior”, „Learning Java: a programmed instruction approach using Applets”, H.H Emurian, X Hu, J Wang, A.G Durham, 2011, ultima accesare 10 iunie 2014,

http://www.sciencedirect.com/science/journal/07475632/27/3

„Computers in Human Behavior”, „The concept of flow in collaborative game-based learning”, Wilfried Admiraal, Jantina Huizenga, Sanne Akkerman, Geert ten Dam , 2011, ultima accesare 20 mai 2014, http://www.sciencedirect.com/science/journal/07475632/27/3

„Computers in Human Behavior”, „Exploring students’ behaviors in a competition-driven educational game”, Zhi-Hong Chen , 2011, ultima accesare 20 mai 2014, http://www.sciencedirect.com/science/journal/07475632/27/3

„Introducere in android”, Magda Badita, 2012, ultima accesare 07 iulie 2014,

http://www.e-learn.ro/tutorial/android/introducere-in-android/174/1/558.htm

„From Android L to Google Fit: All the new products and features from Google I/O”, Brad Chacos, Jun 25, 2014, ultima accesare 07 iulie 2014,

http://www.pcworld.com/article/2367746/from-android-l-to-google-fit-all-the-announcements-from-google-i/from-android-l-to-google-fit-all-t.html

Anexe

Anexa nr.1 – MainActivity.java

package graphics.bustudio.howtojava;

import android.app.Activity;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.Bundle;

//import android.view.Menu;

//import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

//player asignment

MediaPlayer buttonSound;

MediaPlayer buttonSound2;

//bg sound

MediaPlayer backgroundsound;

@Override

protected void onCreate(Bundle savedInstanceState) {

//auto

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//sunet buton

buttonSound = MediaPlayer.create(this, R.raw.sound_beep);

buttonSound2 = MediaPlayer.create(this, R.raw.sound_button);

//bg sound

backgroundsound = MediaPlayer.create(MainActivity.this, R.raw.muzica_fundal);

backgroundsound.setLooping(true);

backgroundsound.start();

//referinte buton

Button but1 = (Button) findViewById(R.id.but_setari);

Button but2 = (Button) findViewById(R.id.but_exit);

Button but3 = (Button) findViewById(R.id.but_info);

Button but4 = (Button) findViewById(R.id.but_start);

Button but5 = (Button) findViewById(R.id.but_invata);

//buton 1 setari

but1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

buttonSound.start();

//startActivity(new Intent("graphics.bustudio.howtojava.MAINACTIVITY")); – eroare cu intent

Intent intent = new Intent(v.getContext(),SetariActivity.class);

startActivityForResult(intent, 0); }});

//buton 2 exit

but2.setOnClickListener(new View.OnClickListener() {

private Intent intent;

@Override

public void onClick(View v) {

buttonSound2.start(); intent.setFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

finish();

System.exit(0);

}

});

//buton 3 info

but3.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),InfoActivity.class);

startActivityForResult(intent, 0);

}

});

//buton 4 start

but4.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),StartActivity.class);

startActivityForResult(intent, 0);

}

});

//buton 5 invata

but5.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),InvataActivity.class);

startActivityForResult(intent, 0);

}

});

} }

Anexa nr.2 –activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/background_app"

tools:context="${packageName}.${activityClass}" >

<Button

android:id="@+id/but_setari"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="@drawable/setari_icon_stare1" />

<Button

android:id="@+id/but_exit"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignBottom="@+id/but_setari"

android:layout_alignLeft="@+id/but_info"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:background="@drawable/iesire_stare1" />

<Button

android:id="@+id/but_info"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:background="@drawable/info_stare1" />

<LinearLayout

android:id="@+id/linearLayout1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:orientation="vertical" >

</LinearLayout>

<Button

android:id="@+id/but_invata"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/but_start"

android:layout_below="@+id/but_start"

android:layout_marginTop="15dp"

android:background="@drawable/buton_invata_state1" />

<Button

android:id="@+id/but_start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/imageView1"

android:layout_centerHorizontal="true"

android:layout_centerInParent="false"

android:layout_marginTop="16dp"

android:background="@drawable/buton_start_state2" />

<ImageView

android:id="@+id/imageView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/linearLayout1"

android:layout_centerHorizontal="true"

android:layout_centerInParent="true"

android:layout_marginTop="10dp"

android:src="@drawable/logo_screen" />

</RelativeLayout>

Anexa nr.3 –SplashActivity

SplashAct.java

package graphics.bustudio.howtojava;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.Window;

import android.view.WindowManager;

public class SplashAct extends Activity {

private static String TAG = SplashAct.class.getName();

private static short SLEEP_TIME = 5; //sleep for some time

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.splash2);//splash

IntentLauncher launcher = new IntentLauncher();

launcher.start();

}

private class IntentLauncher extends Thread {

public void run() {

try{

Thread.sleep(SLEEP_TIME*500);

}catch (Exception e) {

Log.e(TAG, e.getMessage());

}

Intent intent = new Intent(SplashAct.this, MainActivity.class);

SplashAct.this.startActivity(intent);

SplashAct.this.finish();

}}}

Splash.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/screen2"

android:orientation="vertical" >

</LinearLayout>

Anexa nr.4 –Invata_activity.class(ExpandableListView)

MyExpandableAdapter.java

package graphics.bustudio.howtojava;

import java.util.ArrayList;

import android.app.Activity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseExpandableListAdapter;

import android.widget.CheckedTextView;

import android.widget.TextView;

import android.widget.Toast;

public class MyExpandableAdapter extends BaseExpandableListAdapter {

private Activity activity;

private ArrayList<Object> childtems;

private LayoutInflater inflater;

private ArrayList<String> parentItems, child;

public MyExpandableAdapter(ArrayList<String> parents, ArrayList<Object> childern) {

this.parentItems = parents;

this.childtems = childern;

}

public void setInflater(LayoutInflater inflater, Activity activity) {

this.inflater = inflater;

this.activity = activity;

}

@Override

public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

child = (ArrayList<String>) childtems.get(groupPosition);

TextView textView = null;

if (convertView == null) {

convertView = inflater.inflate(R.layout.group, null);

}

textView = (TextView) convertView.findViewById(R.id.textView1);

textView.setText(child.get(childPosition));

convertView.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

Toast.makeText(activity, child.get(childPosition),

Toast.LENGTH_LONG).show();

}

});

return convertView;

}

@Override

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = inflater.inflate(R.layout.row, null);

}

((CheckedTextView) convertView).setText(parentItems.get(groupPosition));

((CheckedTextView) convertView).setChecked(isExpanded);

return convertView;

}

@Override

public Object getChild(int groupPosition, int childPosition) {

return null;

}

@Override

public long getChildId(int groupPosition, int childPosition) {

return 0;

}

@Override

public int getChildrenCount(int groupPosition) {

return ((ArrayList<String>) childtems.get(groupPosition)).size();

}

@Override

public Object getGroup(int groupPosition) {

return null;

}

@Override

public int getGroupCount() {

return parentItems.size();

}

@Override

public void onGroupCollapsed(int groupPosition) {

super.onGroupCollapsed(groupPosition);

}

@Override

public void onGroupExpanded(int groupPosition) {

super.onGroupExpanded(groupPosition);

}

@Override

public long getGroupId(int groupPosition) {

return 0;

}

@Override

public boolean hasStableIds() {

return false;

}

@Override

public boolean isChildSelectable(int groupPosition, int childPosition) {

return false;

}

}

InvataActivity.java

package graphics.bustudio.howtojava;

import java.util.ArrayList;

import android.app.ExpandableListActivity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.MenuItem;

import android.widget.ExpandableListView;

public class InvataActivity extends ExpandableListActivity {

private ArrayList<String> parentItems = new ArrayList<String>();

private ArrayList<Object> childItems = new ArrayList<Object>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_invata);

//–––––––––––––-expandible list begin

ExpandableListView expandableList = getExpandableListView(); // you can use (ExpandableListView) findViewById(R.id.list)

expandableList.setDividerHeight(2);

expandableList.setGroupIndicator(null);

expandableList.setClickable(true);

setGroupParents();

setChildData();

MyExpandableAdapter adapter = new MyExpandableAdapter(parentItems, childItems);

adapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);

expandableList.setAdapter(adapter);

expandableList.setOnChildClickListener(this);

}

public void setGroupParents() {

parentItems.add("Despre Java");

parentItems.add("Curs 1 – Elemente JAVA de baza");

parentItems.add("Curs 2 – Elemente Java de baza");

parentItems.add("Curs 3 – Evenimente JAVA – OOP");

parentItems.add("Curs 4 – Referinte la obiecte");

parentItems.add("Curs 5 – Programe interactive pentru web Applet-uri");

parentItems.add("Curs 6 – Utilizarea claselor legate de gragica, fonturi si culori");

parentItems.add("Curs 7 – Operatii grafice de baza flosind JAVA2D");

parentItems.add("Curs 8 – Folosirea imaginilor, animatiei si sunetului");

parentItems.add("Curs 9 – Crearea de interfete grafice pentru appleturi");

parentItems.add("Curs 10 – Crearea de interfete grafice pentru appleturi (II)");

parentItems.add("Curs 11 – Interaciunea utilizatorului cu un applet");

}

.

.

.

.

//menu actionbar

getActionBar().setDisplayHomeAsUpEnabled(true);

}

// menu actionbar

@Override

public boolean onOptionsItemSelected(MenuItem item) {

if (item.getItemId() == android.R.id.home) {

finish();

}

//terminare menu actionbar

return super.onOptionsItemSelected(item);

}

}

Bibliografie

Materiale printate

"Java de la 0 la expert", Polirom, Stefan Tanasa, Cristian Olaru, Stefan Andrei, 2003,

“Beginning Android 4 Application Development”, Wei Meng Lee, Wiley, 2012,

“Pro Android 4”, Satya Komatineni, Dave McClean, Apress, 2012

Materiale online

Adresa exacta – titlu – autor – data – data ultimei accesari

„Advances in Computers”, Volume 89 , Domenico Amalfitano, Anna Rita Fasolino, Porfirio Tramontana, Bryan Robbins, 2013, ultima accesare 3 iulie 2014,

http://www.sciencedirect.com/science/bookseries/00652458/89/supp/C

„Digital Investigation”, In Press, Cosimo Anglano, 27 May 2014, ultima accesare 10 iunie 2014, http://www.sciencedirect.com/science/journal/aip/17422876

„Android Forensics”, Andrew Hoog, 2011, data ultimei accesari 2 iulie 2014,

http://www.sciencedirect.com/science/book/9781597496513

„Computers in Human Behavior”, „Learning Java: a programmed instruction approach using Applets”, H.H Emurian, X Hu, J Wang, A.G Durham, 2011, ultima accesare 10 iunie 2014,

http://www.sciencedirect.com/science/journal/07475632/27/3

„Computers in Human Behavior”, „The concept of flow in collaborative game-based learning”, Wilfried Admiraal, Jantina Huizenga, Sanne Akkerman, Geert ten Dam , 2011, ultima accesare 20 mai 2014, http://www.sciencedirect.com/science/journal/07475632/27/3

„Computers in Human Behavior”, „Exploring students’ behaviors in a competition-driven educational game”, Zhi-Hong Chen , 2011, ultima accesare 20 mai 2014, http://www.sciencedirect.com/science/journal/07475632/27/3

„Introducere in android”, Magda Badita, 2012, ultima accesare 07 iulie 2014,

http://www.e-learn.ro/tutorial/android/introducere-in-android/174/1/558.htm

„From Android L to Google Fit: All the new products and features from Google I/O”, Brad Chacos, Jun 25, 2014, ultima accesare 07 iulie 2014,

http://www.pcworld.com/article/2367746/from-android-l-to-google-fit-all-the-announcements-from-google-i/from-android-l-to-google-fit-all-t.html

Anexe

Anexa nr.1 – MainActivity.java

package graphics.bustudio.howtojava;

import android.app.Activity;

import android.content.Intent;

import android.media.MediaPlayer;

import android.os.Bundle;

//import android.view.Menu;

//import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

public class MainActivity extends Activity {

//player asignment

MediaPlayer buttonSound;

MediaPlayer buttonSound2;

//bg sound

MediaPlayer backgroundsound;

@Override

protected void onCreate(Bundle savedInstanceState) {

//auto

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//sunet buton

buttonSound = MediaPlayer.create(this, R.raw.sound_beep);

buttonSound2 = MediaPlayer.create(this, R.raw.sound_button);

//bg sound

backgroundsound = MediaPlayer.create(MainActivity.this, R.raw.muzica_fundal);

backgroundsound.setLooping(true);

backgroundsound.start();

//referinte buton

Button but1 = (Button) findViewById(R.id.but_setari);

Button but2 = (Button) findViewById(R.id.but_exit);

Button but3 = (Button) findViewById(R.id.but_info);

Button but4 = (Button) findViewById(R.id.but_start);

Button but5 = (Button) findViewById(R.id.but_invata);

//buton 1 setari

but1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

buttonSound.start();

//startActivity(new Intent("graphics.bustudio.howtojava.MAINACTIVITY")); – eroare cu intent

Intent intent = new Intent(v.getContext(),SetariActivity.class);

startActivityForResult(intent, 0); }});

//buton 2 exit

but2.setOnClickListener(new View.OnClickListener() {

private Intent intent;

@Override

public void onClick(View v) {

buttonSound2.start(); intent.setFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);

finish();

System.exit(0);

}

});

//buton 3 info

but3.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),InfoActivity.class);

startActivityForResult(intent, 0);

}

});

//buton 4 start

but4.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),StartActivity.class);

startActivityForResult(intent, 0);

}

});

//buton 5 invata

but5.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

buttonSound.start();

Intent intent = new Intent(v.getContext(),InvataActivity.class);

startActivityForResult(intent, 0);

}

});

} }

Anexa nr.2 –activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/background_app"

tools:context="${packageName}.${activityClass}" >

<Button

android:id="@+id/but_setari"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="@drawable/setari_icon_stare1" />

<Button

android:id="@+id/but_exit"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignBottom="@+id/but_setari"

android:layout_alignLeft="@+id/but_info"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:background="@drawable/iesire_stare1" />

<Button

android:id="@+id/but_info"

android:layout_width="40dip"

android:layout_height="40dip"

android:layout_alignParentBottom="true"

android:layout_alignParentRight="true"

android:background="@drawable/info_stare1" />

<LinearLayout

android:id="@+id/linearLayout1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentLeft="true"

android:orientation="vertical" >

</LinearLayout>

<Button

android:id="@+id/but_invata"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/but_start"

android:layout_below="@+id/but_start"

android:layout_marginTop="15dp"

android:background="@drawable/buton_invata_state1" />

<Button

android:id="@+id/but_start"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/imageView1"

android:layout_centerHorizontal="true"

android:layout_centerInParent="false"

android:layout_marginTop="16dp"

android:background="@drawable/buton_start_state2" />

<ImageView

android:id="@+id/imageView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@+id/linearLayout1"

android:layout_centerHorizontal="true"

android:layout_centerInParent="true"

android:layout_marginTop="10dp"

android:src="@drawable/logo_screen" />

</RelativeLayout>

Anexa nr.3 –SplashActivity

SplashAct.java

package graphics.bustudio.howtojava;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.util.Log;

import android.view.Window;

import android.view.WindowManager;

public class SplashAct extends Activity {

private static String TAG = SplashAct.class.getName();

private static short SLEEP_TIME = 5; //sleep for some time

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.requestWindowFeature(Window.FEATURE_NO_TITLE);

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

setContentView(R.layout.splash2);//splash

IntentLauncher launcher = new IntentLauncher();

launcher.start();

}

private class IntentLauncher extends Thread {

public void run() {

try{

Thread.sleep(SLEEP_TIME*500);

}catch (Exception e) {

Log.e(TAG, e.getMessage());

}

Intent intent = new Intent(SplashAct.this, MainActivity.class);

SplashAct.this.startActivity(intent);

SplashAct.this.finish();

}}}

Splash.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/screen2"

android:orientation="vertical" >

</LinearLayout>

Anexa nr.4 –Invata_activity.class(ExpandableListView)

MyExpandableAdapter.java

package graphics.bustudio.howtojava;

import java.util.ArrayList;

import android.app.Activity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.BaseExpandableListAdapter;

import android.widget.CheckedTextView;

import android.widget.TextView;

import android.widget.Toast;

public class MyExpandableAdapter extends BaseExpandableListAdapter {

private Activity activity;

private ArrayList<Object> childtems;

private LayoutInflater inflater;

private ArrayList<String> parentItems, child;

public MyExpandableAdapter(ArrayList<String> parents, ArrayList<Object> childern) {

this.parentItems = parents;

this.childtems = childern;

}

public void setInflater(LayoutInflater inflater, Activity activity) {

this.inflater = inflater;

this.activity = activity;

}

@Override

public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {

child = (ArrayList<String>) childtems.get(groupPosition);

TextView textView = null;

if (convertView == null) {

convertView = inflater.inflate(R.layout.group, null);

}

textView = (TextView) convertView.findViewById(R.id.textView1);

textView.setText(child.get(childPosition));

convertView.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View view) {

Toast.makeText(activity, child.get(childPosition),

Toast.LENGTH_LONG).show();

}

});

return convertView;

}

@Override

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = inflater.inflate(R.layout.row, null);

}

((CheckedTextView) convertView).setText(parentItems.get(groupPosition));

((CheckedTextView) convertView).setChecked(isExpanded);

return convertView;

}

@Override

public Object getChild(int groupPosition, int childPosition) {

return null;

}

@Override

public long getChildId(int groupPosition, int childPosition) {

return 0;

}

@Override

public int getChildrenCount(int groupPosition) {

return ((ArrayList<String>) childtems.get(groupPosition)).size();

}

@Override

public Object getGroup(int groupPosition) {

return null;

}

@Override

public int getGroupCount() {

return parentItems.size();

}

@Override

public void onGroupCollapsed(int groupPosition) {

super.onGroupCollapsed(groupPosition);

}

@Override

public void onGroupExpanded(int groupPosition) {

super.onGroupExpanded(groupPosition);

}

@Override

public long getGroupId(int groupPosition) {

return 0;

}

@Override

public boolean hasStableIds() {

return false;

}

@Override

public boolean isChildSelectable(int groupPosition, int childPosition) {

return false;

}

}

InvataActivity.java

package graphics.bustudio.howtojava;

import java.util.ArrayList;

import android.app.ExpandableListActivity;

import android.content.Context;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.MenuItem;

import android.widget.ExpandableListView;

public class InvataActivity extends ExpandableListActivity {

private ArrayList<String> parentItems = new ArrayList<String>();

private ArrayList<Object> childItems = new ArrayList<Object>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_invata);

//–––––––––––––-expandible list begin

ExpandableListView expandableList = getExpandableListView(); // you can use (ExpandableListView) findViewById(R.id.list)

expandableList.setDividerHeight(2);

expandableList.setGroupIndicator(null);

expandableList.setClickable(true);

setGroupParents();

setChildData();

MyExpandableAdapter adapter = new MyExpandableAdapter(parentItems, childItems);

adapter.setInflater((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), this);

expandableList.setAdapter(adapter);

expandableList.setOnChildClickListener(this);

}

public void setGroupParents() {

parentItems.add("Despre Java");

parentItems.add("Curs 1 – Elemente JAVA de baza");

parentItems.add("Curs 2 – Elemente Java de baza");

parentItems.add("Curs 3 – Evenimente JAVA – OOP");

parentItems.add("Curs 4 – Referinte la obiecte");

parentItems.add("Curs 5 – Programe interactive pentru web Applet-uri");

parentItems.add("Curs 6 – Utilizarea claselor legate de gragica, fonturi si culori");

parentItems.add("Curs 7 – Operatii grafice de baza flosind JAVA2D");

parentItems.add("Curs 8 – Folosirea imaginilor, animatiei si sunetului");

parentItems.add("Curs 9 – Crearea de interfete grafice pentru appleturi");

parentItems.add("Curs 10 – Crearea de interfete grafice pentru appleturi (II)");

parentItems.add("Curs 11 – Interaciunea utilizatorului cu un applet");

}

.

.

.

.

//menu actionbar

getActionBar().setDisplayHomeAsUpEnabled(true);

}

// menu actionbar

@Override

public boolean onOptionsItemSelected(MenuItem item) {

if (item.getItemId() == android.R.id.home) {

finish();

}

//terminare menu actionbar

return super.onOptionsItemSelected(item);

Similar Posts