Ανάπτςξη Εκπαιδεςτικού Οδηγού για το Android

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Ανάπτςξη Εκπαιδεςτικού Οδηγού για το Android"

Transcript

1 ΑΣΕΙ ΘΕΑΛΙΑ ΧΟΛΗ ΣΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ Σμήμα Μηχανικών Πληροφορικής ΣΕ Ανάπτςξη Εκπαιδεςτικού Οδηγού για το Android ΠΣΤΧ ΙΑ ΚΗ ΕΡΓΑΙΑ Νεόφυτος άββα T-2803 Επιβλέπων: <Κρ. Κακαρόντζας Γεώργιος > ΛΑΡΙΑ 2014

2 -ii-

3 «Εγώ ν/ε Νεόθπηνο Σάββα δειώλω ππεύζπλα όηη ε παξνύζα Πηπρηαθή Εξγαζία κε ηίηιν <Αλάπηπμή Εθπαηδεπηηθόο Οδεγόο κε ην Android> είλαη δηθή κνπ θαη βεβαηώλω όηη: Σε όζεο πεξηπηώζεηο έρω ζπκβνπιεπηεί δεκνζηεπκέλε εξγαζία ηξίηωλ, απηό επηζεκαίλεηαη κε ζρεηηθή αλαθνξά ζηα επίκαρα ζεκεία. Σε όζεο πεξηπηώζεηο κεηαθέξω ιόγηα ηξίηωλ, απηό επηζεκαίλεηαη κε ζρεηηθή αλαθνξά ζηα επίκαρα ζεκεία. Με εμαίξεζε ηέηνηεο πεξηπηώζεηο, ην ππόινηπν θείκελν ηεο πηπρηαθήο απνηειεί δηθή κνπ δνπιεηά. Αλαθέξω ξεηά όιεο ηηο πεγέο βνήζεηαο πνπ ρξεζηκνπνίεζα. Σε πεξηπηώζεηο πνπ ηκήκαηα ηεο παξνύζαο πηπρηαθήο έγηλαλ από θνηλνύ κε ηξίηνπο, αλαθέξω ξεηά πνηα είλαη ε δηθή κνπ ζπλεηζθνξά θαη πνηα ηωλ ηξίηωλ. Γλωξίδω πωο ε ινγνθινπή απνηειεί ζνβαξόηαην παξάπηωκα θαη είκαη ελήκεξνο(-ε) γηα ηελ επέιεπζε ηωλ λνκίκωλ ζπλεπεηώλ» <Νεόθπηνο άββα>

4 Δγθξίζεθε από ηελ ηξηκειή εμεηαζηηθή επηηξνπή Σόπορ: Ημεπομηνία: ΕΠΙΣΡΟΠΗ ΑΞΙΟΛΟΓΗΗ ii-

5 Πεξίιεςε Η παξνύζα πηπρηαθή εξγαζία είλαη έλα εγρεηξίδην πξνγξακκαηηζκνύ ζε πεξηβάιινλ Android. Βαζηθόο ζηόρνο ηεο δηπισκαηηθήο είλαη λα βνεζήζεη ηνλ αλαγλώζηε λα θαηαλνήζεη βαζηθέο έλλνηεο πξνγξακκαηηζκνύ ζην ιεηηνπξγηθό Android. ην ηέινο ηεο αλάγλσζεο ν αλαγλώζηεο ζα πξέπεη λα είλαη ζε ζέζε λα δεκηνπξγήζεη απιέο θαη πην ζύλζεηεο εθαξκνγέο κόλνο ηνπ, αιιά λα έρεη απνθηήζεη θαη ην ζρεηηθό ππόβαζξν, ώζηε λα είλαη ζε ζέζε λα εκβαζύλεη κόλνο ηνπ ζε δηάθνξα πην ζύλζεηα ηκήκαηα ηνπ πξνγξακκαηηζκνύ. Η δνκή θάζε θεθαιαίνπ ζα κπνξνύζακε λα πνύκε όηη ρσξίδεηαη ζε δύν κέξε. ην πξώην κέξνο παξνπζηάδνληαη θάπνηεο βαζηθέο έλλνηεο θάζε ελόηεηαο, ελώ ζην δεύηεξν κέξνο παξνπζηάδεηαη ν θώδηθαο γηα ηελ δεκηνπξγία κηαο εθαξκνγήο, ώζηε λα ν αλαγλώζηεο λα βιέπεη ζηελ πξάμε πσο ρξεζηκνπνηνύληαη δηάθνξεο εληνιέο θαη πνην είλαη ην απνηέιεζκά ηνπο. -i-

6

7 Δπραξηζηίεο Δπραξηζηώ ην θαζεγεηή Κύξην Καθαξόληδα Γεώξγην γηα ηεο ζπκβνπιέο πνπ κνπ έδσζε γηα ηελ Πηπρηαθή Δξγαζηα. Όπσο επίζεο ηελ Αλλνύια, ην ηαπξό, θαη ηελ νηθνγέλεηα κνπ γηα ηε ζηήξημε θαη ηε βνήζεηα πνπ κνπ παξείραλ. Νεόθπηνο άββα 18/9/2014 -iii-

8

9 Πεξηερόκελα ΠΔΡΗΛΖΦΖ...I ΔΤΥΑΡΗΣΗΔ...III ΠΔΡΗΔΥΟΜΔΝΑ... V 1 ΔΗΑΓΧΓΖ ΔΓΚΑΣΑΣΑΖ ΠΡΟΓΡΑΜΜΑΣΧΝ ΔΓΚΑΣΑΣΑΖ JAVA DEVELOPMENT KIT (JDK) ΔΓΚΑΣΑΣΑΖ ANDROID DEVELOPMENT TOOLS (ADT) ΔΓΚΑΣΑΣΑΖ ΣΟΤ ECLIPSE PLUG-IN ΠΛΑΣΦΟΡΜΔ ΚΑΗ ΠΑΚΔΣΑ ΣΟΝ ANDROID SDK MANAGER ADT TRANSLATION MANAGER PLUGIN ΓΖΜΗΟΤΡΓΗΑ ΠΡΧΣΖ ΔΦΑΡΜΟΓΖ ΓΖΜΗΟΤΡΓΗΑ AVD MANAGER (ΔΞΟΜΟΗΩΣΖ ) ΔΚΣΔΛΔΖ ΔΦΑΡΜΟΓΖ ΣΟΝ ΔΞΟΜΟΗΩΣΖ ACTION BAR ΠΡΟΘΖΚΖ ACTION BAR ΠΡΟΘΖΚΖ ΚΟΤΜΠΗΩΝ Πποζθήκη κοςμπιού μέζω wizard Πποζθήκη κοςμπιού μέζω κώδικα XML Κώδικαρ ενεπγειών κοςμπιών ΠΡΟΘΖΚΖ ACTION BUTTONS ΓΗΑΥΔΗΡΗΖ ΚΤΚΛΟΤ ΕΧΖ ΔΦΑΡΜΟΓΖ ΞΔΚΗΝΩΝΣΑ ΔΝΑ ACTIVITY ΚΑΘΟΡΗΜΟ ACTIVITY ΈΝΑΡΞΖ ΔΦΑΡΜΟΓΖ ΓΖΜΗΟΤΡΓΗΑ ΝΔΟΤ ΣΗΓΜΗΟΣΤΠΟΤ ΚΑΣΑΣΡΟΦΖ ΣΟΤ ACTIVITY ΠΑΤΖ ΚΑΗ ΤΝΔΥΗΖ ΜΗΑ ΓΡΑΣΖΡΗΟΣΖΣΑ v-

10 5.5.1 Παύζη δπαζηηπιόηηηαρ Σςνέσιζη μια δπαζηηπιόηηηαρ ΓΗΑΚΟΠΖ ΚΑΗ ΔΠΑΝΔΚΚΗΝΖΖ ACTIVITY Διακοπή ενόρ activity Εκκίνηζη / Επανεκκίνηζη Activity ΔΠΑΝΑΓΖΜΗΟΤΡΓΗΑ ΔΝΟ ACTIVITY ΓΖΜΗΟΤΡΓΗΑ ΓΤΝΑΜΗΚΧΝ UI ΓΖΜΗΟΤΡΓΗΑFRAGMENT ΓΖΜΗΟΤΡΓΗΑ FRAGMENTLAYOUT ΑΠΟΘΖΚΔΤΖ ΓΔΓΟΜΔΝΧΝ ΑΠΟΘΖΚΔΤΖ ΕΔΤΓΟΤ ΚΛΔΗΓΗΟΤ-ΣΗΜΖ (KEY-VALUE) ΑΠΛΩΝ ΣΤΠΩΝ ΓΔΓΟΜΔΝΩΝ ΑΠΟΘΖΚΔΤΖ ΑΡΥΔΗΩΝ Επιλογή εζωηεπικήρ (Internal) ή εξωηεπικήρ (External) αποθήκεςζηρ Αποθήκεςζη και ανάγνωζη από εζωηεπική αποθήκεςζη (internalstorage) Αποθήκεςζη και ανάγνωζη από εξωηεπική αποθήκεςζη (externalstorage) ΑΠΟΘΖΚΔΤΖ Δ ΒΑΖ ΓΔΓΟΜΔΝΩΝ ΓΗΑΓΡΑΦΖ ΔΓΓΡΑΦΩΝ ΠΗΝΑΚΑ ΑΛΛΖΛΔΠΗΓΡΑΖ ΜΔ ΑΛΛΔ ΔΦΑΡΜΟΓΔ ΓΖΜΗΟΤΡΓΗΑ IMPLICIT INTENT ΔΤΡΔΖ ΚΑΣΑΛΛΖΛΖ ΔΦΑΡΜΟΓΖ ΔΠΗΣΡΟΦΖ ΑΠΟΣΔΛΔΜΑΣΟ ΑΠΟ ACTIVITY ΈΝΑΡΞΖ ΓΗΚΟΤ ΜΑ ACTIVITY ΑΠΟ ΑΛΛΔ ΔΦΑΡΜΟΓΔ ΔΠΗΣΡΟΦΖ ΑΠΟΣΔΛΔΜΑΣΟ ΓΗΑΥΔΗΡΗΖ AUDIOCONTROL ΈΛΔΓΥΟ ΔΝΣΑΖ ΖΥΟΤ ΚΑΗ ΑΝΑΠΑΡΑΓΩΓΖ ΑΡΥΔΗΟΤ ΥΡΖΖ ΠΛΖΚΣΡΩΝ ΤΚΔΤΖ ΓΗΑ ΔΛΔΓΥΟ ΔΝΣΑΖ ΖΥΟΤ ΥΡΖΖ ΠΛΖΚΣΡΩΝ ΤΚΔΤΖ ΓΗΑ ΑΝΑΠΑΡΑΓΩΓΖ ΖΥΟΤ vi-

11 9.4 ΓΗΑΥΔΗΡΗΖ AUDIOFOCUS Αίηηζη για Audio Focus Χειπιζμόρ απώλειαρ AudioFocus ΓΗΑΥΔΗΡΗΖ ΦΧΣΟΓΡΑΦΗΚΖ ΚΑΜΔΡΑ ΥΡΖΖ ΚΑΜΔΡΑ Ω ΦΩΣΟΓΡΑΦΗΚΖ ΜΖΥΑΝΖ ΚΑΣΑΓΡΑΦΖ ΒΗΝΣΔΟ ΓΗΑΥΔΗΡΗΖ ΔΠΑΦΧΝ ΑΝΑΚΣΖΖ ΛΗΣΑ ΔΠΑΦΩΝ ΔΗΑΓΩΓΖ ΚΑΗ ΔΠΔΞΔΡΓΑΗΑ ΔΠΑΦΖ Ειζαγωγή επαθήρ Επεξεπγαζία ήδη ςπάπσοςζαρ επαθήρ ΓΖΜΗΟΤΡΓΗΑ ΔΦΑΡΜΟΓΧΝ ΜΔ ΓΝΧΖ ΣΡΔΥΟΤΑ ΘΔΖ ΥΡΖΖ LOCATION SERVICES API ΚΑΘΟΡΗΜΟ ΓΗΚΑΗΩΜΑΣΩΝ ΔΦΑΡΜΟΓΖ ΈΛΔΓΥΟ ΓΗΑ GOOGLE PLAY SERVICES ΔΤΡΔΖ ΣΡΔΥΟΤΑ ΘΔΖ ΤΚΔΤΖ ΑΤΣΟΜΑΣΖ ΑΝΑΝΔΩΖ ΣΡΔΥΟΤΑ ΘΔΖ ΥΡΖΣΖ ΤΜΠΔΡΑΜΑΣΑ ΒΗΒΛΗΟΓΡΑΦΗΑ vii-

12 1 Δηζαγσγή Σν Android δεκηνπξγήζεθε από ηνλ νξγαληζκό OPEN HANDSET ALLIANCE & GOOGLE. Δίλαη κηα κνληέξλα αλνηθηή πιαηθόξκα γηα θηλεηά ηειέθσλα θαη βξίζθεηαη ζε ζεκείν αλαηξνπήο θαη αλάπηπμεο [1]. Πξηλ ην Android, νη πξνγξακκαηηζηέο εθαξκνγώλ θηλεηώλ ηειεθώλσλ αληηκεηώπηδαλ πνιιά πξνβιήκαηα ζηε δεκηνπξγία εθαξκνγώλ,ζηελ θαηαζθεπή ηεο θαιύηεξεο εθαξκνγήο, ηεο αληαγσληζηηθήο εθαξκνγήο, ηεο πβξηδηθήο θαηαζθεπήο θαη ζηελ ελζσκάησζε θνηλώλ εξγαζηώλ όπσο ηελ απνζηνιή κελπκάησλ θαη ηελ πξαγκαηνπνίεζε θιήζεσλ. Σν Android είλαη κηα πιαηθόξκα αλνηρηνύ ινγηζκηθνύ πνπ έρεη θαηαρσξεζεί κε ηελ άδεηα ρξήζεο General Public License Version 2. Οη εθαξκνγέο είλαη γξακκέλεο ζε Java. Σν Android επηηξέπεη ζηνπο πξνγξακκαηηζηέο λα γξάθνπλ εθαξκνγέο νη νπνίεο εθκεηαιιεύνληαη βαζηθέο ιεηηνπξγίεο όπσο ε πεξηήγεζε ζην Web, ε εύξεζε ζην ράξηε, ε δηαρείξηζε ησλ επαθώλ θαη ε απνζηνιή κελπκάησλ. Η πξώηε ζπζθεπή android ήηαλ ην Σ-mobile G1 από ηελ ΗΣC κε ηε Σ-mobile λα παξέρεη όιεο ηηο απαξαίηεηεο ππεξεζίεο θηλεηήο ηειεθσλίαο. Μέξνο ηεο πηπρηαθήο εξγαζίαο είλαη λα θαιύςεη εηζαγσγηθέο έλλνηεο όπσο ε εγθαηάζηαζε ησλ απαξαίηεησλ εξγαιείσλ ζηνλ ππνινγηζηή αιιά θαη πην ζύλζεηεο έλλνηεο όπσο νη πξνγξακκαηηζηηθέο δηαζπλδέζεηο (ΑΡΙs) ηνπ android γηα ζέκαηα όπσο απνζήθεπζε δεδνκέλσλ ζε βάζε δεδνκέλσλ, ν εληνπηζκόο ζέζεο (geolocation)θαη ηα πνιπκέζα (multimedia). -1-

13

14 2 Δγθαηάζηαζε Πξνγξακκάησλ Ο ζθνπόο ηνπ θεθαιαίνπ είλαη ε ρξήζε θαη ε εγθαηάζηαζε ησλ απαηηνύκελσλ εξγαιείσλ γηα ηελ αλάπηπμε εθαξκνγώλ android κε ην Eclipse. ηηο επόκελεο ελόηεηεο ζα δείμνπκε πσο γίλεηαη ε εγθαηάζηαζε ηνπ JavaDevelopmentKit (JDK), ηνπ AndroidDevelopmentToolkit (ADT), ηνπ Eclipse Plug-In, ADT Translation Manager Plug-in. 2.1 Δγθαηάζηαζε Java Development Kit (JDK) Η γιώζζα πξνγξακκαηηζκνύ γηα εθαξκνγέο Android είλαη ε Java. Γηα λα κπνξέζνπκε λα γξάςνπκε θώδηθα ζε Java ζα πξέπεη λα έρνπκε εγθαηεζηεκέλν ην JavaDevelopmentKit. Γηα ηελ εγθαηάζηαζε ηνπ ζα πξέπεη λα κπνύκε ζηελ ζειίδα: Με δηπιό θιηθ πάλσ ζην εηθνλίδην : Δηθόλα 1 : εηθνλίδην γιώζζαο java Δκθαλίδεηαη ην επόκελν παξάζπξν, ζην νπνίν ζα πξέπεη λα θάλνπκε επηινγή ηνπ ιεηηνπξγηθνύ ηνπ ππνινγηζηή καο θαη λα επηιέμνπκε accept γηα ηελ άδεηα ρξήζεο. -3-

15 Δηθόλα 2 : ιεηηνπξγηθό ηνπ ππνινγηζηή καο Όηαλ νινθιεξσζεί ην θαηέβαζκα, ηξέρνπκε ηελ εγθαηάζηαζε ηνπ JavaSEDEVELOPMENT ζηνλ Τπνινγηζηή καο. Δηθόλα 3:Απνδνρή ηεο java λα ηξέμεη ζην ιεηηνπξγηθό καο -4-

16 Δηθόλα 4: εξγαιεία πνπ πεξηέρεη ε γιώζζα java Δηθόλα 5: εγθαηάζηαζε java Καη κεηά, όηαλ νινθιεξσζεί ε δηαδηθαζία παηάκε Close. -5-

17 2.2 Δγθαηάζηαζε Android Development Tools (ADT) Σν ADT Bundle πεξηιακβάλεη όια όζα ρξεηάδεζηε γηα λα μεθηλήζεηε ηελ αλάπηπμε εθαξκνγώλ: Eclipse + ADT plugin Android SDK tools Android πιαηθόξκα - εξγαιεία Σελ πην πξόζθαηε πιαηθόξκα Android Σελ ηειεπηαία Android εηθόλα ηνπ ζπζηήκαηνο γηα ηνλ εμνκνησηή ηελ ζειίδα θαηεβάδνπκε ηoadtbundle επηιέγνληαο ην ιεηηνπξγηθό ηνπ Τπνινγηζηή καο θαζώο θαη ηελ παιηθόξκα (64 ή 32 bit). Δηθόλα6: εηθνλίδην android developer tools Δηθόλα 7: άδεηα ρξήζεο θαη ην ιεηηνπξγηθό ηνπ Τπνινγηζηή καο -6-

18 Όηαλ ηειεηώζεη ην θαηέβαζκα θάλνπκε απνζπκπίεζε ην θάθειν!! Δηθόλα 8: θαηέβαζκα ζπκπηεζκέλνπ αξρείνπ Μεηά ηελ απνζπκπίεζε πξέπεη λα έρνπκε απηά ηα 3 εηθνλίδηα. Δηθόλα 9: εηθνλίδην απνζπκπίεζεο αξρείνπ ADT Bundles Πεγαίλνπκε ζην θάθειν ηνπ Eclipse θαη αλνίγνπκε ην εηθνλίδην. Δηθόλα 10 : εηθνλίδην eclipse Γεκηνπξγήζηε έλα θάθειν project, ζηνλ νπνίν ζα απνζεθεύνληαη ηα έξγα (projects) πνπ ζα δεκηνπξγείηε. Δηθόλα 11: ηόπνο απνζήθεπζεο εθαξκνγώλ -7-

19 2.3 Δγθαηάζηαζε ηνπ Eclipse Plug-in Απόην Menu Help Install New Software Add Δηθόλα 12: ηνπνζεζία Help Πιεθηξνινγνύκε ηα ζηνηρεία πνπ δείρλεη ε εηθόλα 13. Δηθόλα 13: δίλνπκε όλνκα θαη κηα url δηεύζπλζε γηα ην ADT plug-in Δπηιεγνύκε Developer Tools θαη παηάκε Νext. 2.4 Πιαηθόξκεο θαη παθέηα ζηνλ Android SDK Manager Ο AndroidSDKManager καο παξνπζηάδεη κηα ζύλνςε ηνπ ηη είλαη εγθαηεζηεκέλν ζηνλ ππνινγηζηή καο. Μπνξνύκε λα πξνζζέηνπκε θαη λα αθαηξνύκε παθέηα θαη πιαηθόξκεο. ην κελνύ, επηιέγνπκε Windows, θαη θάλνπκε δηπιό θιηθ ζην αξρείν SDKManager.exe ζηε ξίδα ηνπ θαηαιόγνπ AndroidSDK. -8-

20 Δηθόλα 14: ηνπνζεζία Windows ζην Menu Ωο ειάρηζηε ξύζκηζε γηα SDK ζαο, ζπληζηάηαη λα εγθαηαζηήζεηε ηα παθέηα : Σα ηειεπηαία παθέηα Δξγαιεία ( ειέγμηε ην θάθειν Tools ). Σελ ηειεπηαία έθδνζε ηνπ Android (ειέγμηε ην πξώην θάθειν Android ). Σελ Βηβιηνζήθε Τπνζηήξημε Android ( αλνίμηε ην θάθειν Extras θαη ειέγμηε Android Τπνζηήξημε Βηβιηνζήθε ). Αθνύ έρεηε επηιέμεη ηα παθέηα ζαο, θάληε θιηθ ζην θνπκπί Δγθαηάζηαζε. Δηθόλα 15: επηινγή αδεηώλ ρξήζεο γηα ηα παθέηα πνπ επηιέμακε 2.5 ADT Translation Manager Plugin Γηα λα εγθαηαζηήζεηε ην ADT Translation Manager Plug-in, ζα επηιέμνπκε από ηελ κπάξα ηνπ κελνύ ηνπ Eclipse Help InstallNewSoftware Add. Πιεθηξνινγνύκε όηη ππάξρεη ζηελ εηθόλα 16 θαη ζηελ ζπλέρεηα παηάκε Οθ. -9-

21 Δηθόλα 16 : δίλνπκε όλνκα θαη κηα url δηεύζπλζε πνπ ρξεηάδεηαη ην ADT Translation Manager Κάληε θιηθ ζην OK. ηελ ζπλέρεηα επηιεγνύκε ην Android Developer Tools Translation Manager θαη κεηά παηάκε Next. Δηθόλα 17: επηινγή ζην ADT Manager ησλ εξγαιείσλ Δπηιέγνπκε Νext θαη απνδερόκαζηε ηελ άδεηα ρξήζεο θαη παηάκε Finish. -10-

22 Δηθόλα 18 : επηινγή Next Δηθόλα19:άδεηαρξήζεοADTTranslationManager Όηαλ ηειεηώζνπλ όια ηα παξαπάλσ, ηόηε ζα καο βγάιεη κήλπκα πνπ ζα πξέπεη λα θάλνπκε επαλεθθίλεζε ηνπ ADT. Δπηιεγνύκε Yes. -11-

23

24 3 Γεκηνπξγία πξώηεο εθαξκνγήο ΌηαλαλνίμνπκεηνeclipseεπηιεγνύκεαπόηνMenu File New Android ApplicationProject. Δηθόλα 19: εθθίλεζε δεκηνπξγίαο androidproject Θέηνπκε ην όλνκα ηεο εθαξκνγήο καο, όπσο βιέπνπκε θαη ζηελ Δηθόλα 21 θαη παηάκε Next. Δηθόλα 20: όλνκα εθαξκνγήο, όλνκα project θαη όλνκα παθέησλ γηα ην project -13-

25 Δπηιέγνπκε Νext θαη αθήλνπκε ηεο πξνεπηιεγκέλεο ηηκέο κέρξη ην ηέινο θαη κεηά Finish. Δηθόλα 21 : δεκηνπξγία λέαο εθαξκνγήο Δηθόλα 22: επηινγή εηθνληδίνπ εθαξκνγήο -14-

26 Δηθόλα 23: όλνκα δξαζηεξηόηεηαο Όηαλ νινθιεξσζεί ε δηαδηθαζία εκθαλίδεηαη ε αθόινπζε εηθόλα, ε νπνία εκθαλίδεη ηελ βαζηθή νζόλε ηεο εθαξκνγήο καο, γηα λα ηελ επεμεξγαζηνύκε, εάλ ζέινπκε. Δηθόλα 24: απνηέιεζκα εθαξκνγήο -15-

27 Αξηζηεξά όπσο βιέπνπκε ππάξρεη ε παιέηα (Palette),ε νπνία πεξηέρεη όια ηα controls πνπ κπνξνύκε λα ρξεζηκνπνηήζνπκε ζε κηα εθαξκνγή, θαη είλαη ρσξηζκέλε ζε δηάθνξα groups. Σα θπξηόηεξα groups από ηα νπνία ρξεζηκνπνηνύκε αληηθείκελα είλαη ηα εμήο: FormWidgets : πεξηιακβάλεη δηάθνξα αληηθείκελα πνπ κπνξνύκε λα βάινπκε επάλσ ζηελ θόξκα, όπσο checkbox, radiobutton, radiobutton group, progressbar, textview γηα εηζαγσγή θεηκέλνπ (Εηθόλα 25). TextFields : είλαη εηδηθά controls θεηκέλνπ, ηα νπνία δέρνληαη κηα ζπγθεθξηκέλε κνξθή θεηκέλνπ. Αλ π.ρ. επηιέμεηε ην textfield , ηόηε ην control πεξηκέλεη όηη ην θείκελν πνπ ζα εηζάγεηε ζα πεξηέρεη αιθαξηζκεηηθά θαη ηνλ Δηθόλα 25: Text Fields Controls Layouts : πεξηέρεη έηνηκεο δηαηάμεηο γηα ην UI. Δηθόλα 26: Layout Controls -16-

28 Images&Media : δηάθνξα controls γηα δηαρείξηζε ήρνπ, εηθόλαο θαη βίληεν. Δηθόλα 27: Images&MediaControls Έλαο άιινο ηξόπνο εηζαγσγήο control ζηελ νζόλε είλαη κε θώδηθα ζην.xml αξρείν. Δάλ παηήζνπκε ζην tab fragment_main.xml(εηθόλα 25) κπνξνύκε λα δεκηνπξγήζνπκε controls κε θώδηθα XML. Δηθόλα 28: Δπεμεξγαζία UI κε θώδηθα -17-

29 Μπνξνύκε λα πξνζζέζνπκε controls κε θώδηθα αιιά επίζεο κπνξνύκε λα επεμεξγαζηνύκε ηηο ηδηόηεηεο ησλ controls πνπ έρνπκε ήδε ηνπνζεηήζεη επάλσ ζηελ θόξκα, όπσο π.ρ. ηηο δηαζηάζεηο ηνπο ή λα ζέζνπκε ηε δηαρείξηζε θάπνηνπ ζπκβάληνο (event) όπσο γηα παξάδεηγκα ην click ζε θάπνην πιήθηξν (button). 3.1 Γεκηνπξγία AVD Manager (εμνκνησηήο ) Έλα ρξήζηκν εξγαιείν πνπ παξέρεη ην παθέην ινγηζκηθνύ SDK είλαη ν εμνκνησηήο AVD. Με ην ΑVD ζα δεκηνπξγήζνπκε κηα εηθνληθή ζπζθεπή ηειεθώλνπ όπνπ ζα ηξέρνπκε ηελ εθαξκνγή καο. ΔπηιεγνύκεWindows AndroidVirtualDeviceManager DeviceDefinition Ne wdevice. Γίλνπκε έλα όλνκα ζηελ εηθνληθή ζπζθεπή καο θαη ηεο δίλνπκε ηα απαξαίηεηα ζηνηρεία. Έπεηηα παηάκε CreateDevice Ok Δηθόλα 29: Αξρή δεκηνπξγίαο εμνκνησηή Από ην DeviceDefinition επηιεγνύκε New θαη ζπκπιεξώλνπκε ηα ζηνηρεία κηαο εηθνληθήο ζπζθεπήο (αλάινγα κε ην πώο ζέινπκε λα καο εκθαλίδεηαη ε ζπζθεπή καο ) θαη παηάκε CreateDevice. -18-

30 Δηθόλα 30: Ολνκαζία εμνκνησηή θαη ηη κέγεζνο ζα έρεη ε νζόλε Όηαλ ηειεηώζνπκε θαη θάλνπκε κηα εηθνληθή ζπζθεπή παηάκε CreateAVD. Δπηιέγνπκε σο Skin: HVGA(εηθόλα 33) θαη επηιέγνπκε Ok. Μεηά ζην παξάζπξν επηιέγνπκε Start(εηθόλα 34). Δηθόλα 31: Γεκηνπξγία ζπζθεπήο εμνκνησηή -19-

31 Δηθόλα 32: Σηκέο πνπ έρεη ν εμνκνησηήο Δηθόλα 33: Δθθίλεζε εμνκνησηή Καη ζην κήλπκα πνπ ζα καο βγάιεη παηάκε Launch -20-

32 Δηθόλα 34 : Σηκέο πξνθαζνξηζκέλνπ εμνκνησηή Σν απνηέιεζκα ηεο όιεο δηαδηθαζίαο πνπ θάλακε είλαη ην εμήο: Δηθόλα 35 : Απνηέιεζκα εμνκνησηή -21-

33 3.2 Δθηέιεζε εθαξκνγήο ζηνλ εμνκνησηή Γηα λα ηξέμνπκε ηελ εθαξκνγή ζηνλ εμνκνησηή από ην Menu Run RunAs AndroidApplication Δηθόλα 36 : Γηαδηθαζία εθηέιεζεο εμνκνησηή Καη ην απνηέιεζκα ηεο εθηέιεζεο είλαη ην αθόινπζν Δηθόλα 37 : Απνηέιεζκα εμνκνησηή -22-

34 4 Action Bar Η actionbar είλαη έλα από ηα ζεκαληηθόηεξα ζηνηρεία ηνπ ζρεδηαζκνύ κηαο εθαξκνγήο. Παξέρεη δηάθνξεο δπλαηόηεηεο ζην UI (UserInterface) ηεο εθαξκνγήο, θάλνληάο ηελ πην εύρξεζηε, ελώ δίλεηαη ε δπλαηόηεηα αιιειεπίδξαζεο κε άιιεο εθαξκνγέο. Η actionbar είλαη κηα ιεηηνπξγηθόηεηα ε νπνία πξνζηέζεθε ζηελ έθδνζε 3.0. Γηα λα κπνξέζεηε λα πξνζζέζεηε κηα actionbar, ζα πξέπεη ην ζέκα πνπ έρεηε επηιέμεη λα ππνζηεξίδεη ηε ζπγθεθξηκέλε ιεηηνπξγηθόηεηα. Οη βαζηθέο ιεηηνπξγίεο πνπ κπνξεί λα ζπκπεξηιεθζνύλ ζηελ actionbar[2]: 1. Πιεξνθνξίεο ζρεηηθά κε ηελ ηαπηόηεηα ηεο εθαξκνγήο θαη πιεξνθνξίεο γηα ην ζεκείν πνπ βξίζθεηαη εθείλε ηελ ζηηγκή ν ρξήζηεο. 2. Πξόζβαζε ζε ζεκαληηθέο ιεηηνπξγίεο, όπσο π.ρ. ε αλαδήηεζε ζηελ εθαξκνγή. 3. Τπνζηήξημε πινήγεζεο θαη ελαιιαγήο νζνλώλ, είηε κε tabs είηε κε drop-down lists. ε απηό ην θεθάιαην ζα αζρνιεζνύκε κε ηελ πξνζζήθε κηαο actionbar θαη ηελ πξνζζήθε θνπκπηώλ θαη νκάδσλ ζηελ κπάξα. 4.1 Πξνζζήθε Action Bar Αθόκα θαη ζηελ πην απιή κνξθή ηεο ε κπάξα εκθαλίδεη ζην αξηζηεξό κέξνο ηεο νζόλεο ηνλ ηίηιν θαη ην εηθνλίδην ηεο εθαξκνγήο. Αθόκε θαη ζηηο πην απιέο εθαξκνγέο ε actionbar είλαη ρξήζηκε γηα όιεο ηηο ελέξγεηεο, ώζηε λα ελεκεξώλνπλ ηνλ ρξήζηε γηα ην πνπ βξίζθεηαη θαη λα δηαηεξείηαη κηα ζηαζεξή ηαπηόηεηα ηεο εθαξκνγήο. Γεκηνπξγνύκε έλα λέν Android Project, θαη ην νλνκάδνπκε ActionBar [3] -23-

35 Δηθόλα 38 : Γεκηνπξγία λένπ project ηελ επηινγή Minimun Required SDK, ζα πξέπεη λα επηιέμνπκε ην ιηγόηεξν ηελ επηινγή "API 11: Android 3.0 (Honeycomb)", ελώ σο Theme ζα πξέπεη λα επηιέμνπκε όπνην Holo Theme ζέινπκε. Δάλ νινθιεξώζνπκε ηελ δηαδηθαζία δεκηνπξγίαο λένπ project, πιένλ ζε θάζε activity ηεο εθαξκνγήο καο ζα ππάξρεη επάλσ ε actionbar. ηελ actionbar εκθαλίδεηαη ην όλνκα ηεο εθαξκνγήο, ε εηθόλα πνπ έρνπκε επηιέμεη γηα ηελ εθαξκνγή θαη ηέξκα δεμηά εκθαλίδνληαη ηξεηο θάζεηεο ηειείεο. Αλ παηήζνπκε επάλσ ζηηο ηειείεο εκθαλίδνληαη ηα θνπκπηά πνπ έρνπκε πξνζζέζεη ζηελ actionbar. -24-

36 Δηθόλα 39 : Action bar 4.2 Πξνζζήθε θνπκπηώλ Όια ηα θνπκπηά ηεο ActionBar, θαη ηα ActionButtons αιιά θαη ηα ιηγόηεξν ζεκαληηθά, ζα πξέπεη λα ηα πξνζζέζνπκε ζην XML ηνπ menu resources, ζην path ActionBar res- menu main.xml -25-

37 Δηθόλα 40 : Γηαδξνκή main.xml Με δηπιό θιηθ πάλσ ζην αξρείν.xml αλνίγεη ε επόκελε νζόλεο ηελ νπνία κπνξνύκε λα πξνζζέζνπκε θνπκπηά ζηελ actionbar ηεο εθαξκνγήο. -26-

38 Δηθόλα 41 : Οζόλε αξρείνπ main.xml Τπάξρνπλ δπν ηξόπνη λα πξνζζέζνπκε θνπκπηά. Δίηε παηώληαο Add κέζσ ηνπ wizard πνπ αλνίγεη, είηε επηιέγνπκε ην Tab main.xml γξάθνπκε θαηεπζείαλ ηνλ θώδηθα γηα ην θνπκπί πνπ ζέινπκε Πξνζζήθε θνπκπηνύ κέζσ wizard. Παηώληαο ην θνπκπί Add κπνξνύκε λα πξνζζέζνπκε θνπκπί ή group. Δηθόλα 42 : Έλαξμε δηαδηθαζίαο πξνζζήθε θνπκπηνύ ή/θαη group -27-

39 ην επόκελν παξάζπξν πνπ αλνίγεη καο δίλεηε ε δπλαηόηεηα λα δεκηνπξγήζνπκε είηε απιό θνπκπί είηε έλα group. Δηθόλα 43 : Δπηινγή πξνζζήθεο θνπκπηνύ ή group Σα group είλαη κηα νκαδνπνίεζε θνπκπηώλ, πάλσ ζηα νπνία έρνπκε έλα θεληξηθό έιεγρν. Γηα παξάδεηγκα κπνξνύκε λα ηα θάλνπκε όια καδί αόξαηα ή νξαηά, λα ηα θάλνπκε ελεξγά ή αλελεξγά θιπ. Δπηιέγνληαο group θαη παηώληαο ΟΚ δεκηνπξγνύκε έλα λέν group. -28-

40 Δηθόλα 44 : Γεκηνπξγεκέλν group θαη νη παξάκεηξνί ηνπ ην δεμί κέξνο, ζηνλ πίλαθα Attributes for group1 (Group) νξίδνπκε ηηο παξακέηξνπο ηνπ group. Id: είλαη ην ID ηνπ group θαη είλαη κνλαδηθό. Menu category : θαζνξίδεη ηελ πξνηεξαηόηεηα ηνπ group. Οη δπλαηέο επηινγέο είλαη : i. container : γηα ηα θνπκπηά πνπ απνηεινύλ κέξνο ελόο container ii. system : γηα θνπκπηά πνπ παξέρνληαη από ην ζύζηεκα iii. secondary : γηα θνπκπηά πνπ είλαη δεπηεξεύνπζεο επηινγέο γηα ηνλ ρξήζηε. iv. alternative : γηα ηα θνπκπηά πνπ πξνζθέξνπλ ελαιιαθηηθέο ελέξγεηεο ζρεηηθά κε ηα δεδνκέλα πνπ εκθαλίδνληαη εθείλε ηε ζηηγκή. Order in Category : ε ζεηξά κε ηελ νπνία ζα εκθαληζηεί. Checkable behavior : αλ ζα κπνξεί ν ρξήζηεο λα επηιέμεη κε check θάπνην ή όια ηα θνπκπηά ηνπ group. Οη δπλαηέο επηινγέο είλαη i. none : θαλέλα ii. all : κπνξεί λα επηιέμεη όζα ζέιεη (κε checkbox) iii. single : κπνξεί λα επηιέμεη κόλν έλα (κε radiobutton). Visible : αλ ζα είλαη νξαηό ην group Enabled : αλ ζα είλαη ελεξγνπνηεκέλν. Γελ είλαη αλάγθε λα ζπκπιεξσζνύλ όιεο νη πξνεγνύκελεο παξάκεηξνη. Μπνξεί αλ ζέινπκε λα κελ ζπκπιεξώζνπκε θαη θακία. Έρνληαο επηιεγκέλν ην group παηάκε μαλά Add θαη εκθαλίδεηαη ην αθόινπζν παξάζπξν: -29-

41 Δηθόλα 45 : Δπηινγή πξνζζήθεο θνπκπηώλ ζε group Δδώ βιέπνπκε όηη ην παξάζπξν είλαη δηαθνξνπνηεκέλν από όηη ζηελ Δηθόλα 44. Η δεύηεξε επηινγή καο δίλεη ηελ δπλαηόηεηα λα δεκηνπξγήζνπκε έλα θνπκπί κέζα ζην group. Αληίζεηα αλ επηιέμνπκε ηελ πξώηε επηινγή, νη επηινγέο πνπ ζα εκθαληζηνύλ είλαη ίδηεο κε πξνεγνπκέλσο. Παηάκε ΟΚ θαη ηώξα έρεη πξνζηεζεί έλα θνπκπί ζην group -30-

42 Δηθόλα 46 : Πξνζζήθε θνπκπηνύ ζε group ην δεμί κέξνο, ζηνλ πίλαθα Attributes for item 1 (Item) νξίδνπκε ηηο παξακέηξνπο ηνπ θνπκπηνύ. Id: είλαη ην ID ηνπ θνπκπηνύ θαη είλαη κνλαδηθό. Menu category : θαζνξίδεη ηελ πξνηεξαηόηεηα ηνπ θνπκπηνύ. Οη δπλαηέο επηινγέο είλαη ίδηεο κε ηνπ group. Order in Category : ε ζεηξά κε ηελ νπνία ζα εκθαληζηεί. Title: ην ιεθηηθό πνπ ζα εκθαλίδεηαη πάλσ ζην θνπκπί. Θα πξέπεη λα είλαη string resource ζην αξρείν strings.xml. Σν πεδίν είλαη ππνρξεσηηθό. Title condensed : ζπλνπηηθό ιεθηηθό. Υξεζηκνπνηείηαη όηαλ ην θαλνληθό ιεθηηθό είλαη πνιύ κεγάιν. Θα πξέπεη λα είλαη string resource ζην αξρείν strings.xml Icon : εηθόλα πνπ ζα εκθαλίδεηαη πάλσ ζην θνπκπί. Θα πξέπεη λα είλαη resource ζηνλ αληίζηνηρν θάθειν res drawbale Alphabetic shortcut : δήισζε ραξαθηήξα γηα ζπληόκεπζε πιήθηξνπ. Numeric shortcut : δήισζε αξηζκνύ γηα ζπληόκεπζε πιήθηξνπ. Checkable : εάλ ην θνπκπί ζα κπνξεί λα ηζεθαξηζηεί. Checked : εάλ ην θνπκπί είλαη εμ' νξηζκνύ ηζεθαξηζκέλν. Visible : εάλ ην θνπκπί είλαη νξαηό. Enabled : αλ ζα είλαη ελεξγνπνηεκέλν OnClick : ην όλνκα ηεο κεζόδνπ πνπ ζα ηξέρεη όηαλ παηεζεί ην θνπκπί. -31-

43 Show as Action : θαζνξίδεη ην πσο θαη ην πόηε ζα εκθαλίδεηαη έλα θνπκπί ζηελ ActionBar. Οη δπλαηέο επηινγέο είλαη νη εμήο: i. ifroom: εκθαλίδεηαη κόλν εάλ ρσξάεη ii. withtext : λα εκθαλίδεηαη καδί κε ην ιεθηηθό πνπ βάιακε ζηελ παξάκεηξν Title. iii. never : λα κελ εκθαλίδεηαη πνηέ iv. always : λα εκθαλίδεηαη πάληα v. collapseaction View : ην actionview πνπ ζρεηίδεηαη κε ην θνπκπί είλαη πηπζζόκελν. Action Layout : πνην layout ζα ρξεζηκνπνηείηαη σο actionview ηνπ θνπκπηνύ. Action View Class : ην όλνκα κηαο θιάζεο γηα λα ρξεζηκνπνηείηαη σο actionview. Γηα παξάδεηγκα κπνξνύκε λα ρξεζηκνπνηήζνπκε ην όλνκα "android.widget.searchview" γηα λα ρξεζηκνπνηήζνπκε ην SearchView σο action view. Action provider class: ην όλνκα κηαο θιάζεο γηα ηελ ActionProvider, γηα λα ρξεζηκνπνηεζεί ζηελ ζέζε ηνπ itemaction. Γηα παξάδεηγκα κπνξνύκε λα ρξεζηκνπνηήζνπκε ην όλνκα "android.widget.shareactionprovider " γηα λα ρξεζηκνπνηήζνπκε ην ShareActionProvider. Γηα λα ζέζνπκε ζην θνπκπί έλα Title παηάκε πάλσ ζην θνπκπί Browse Δηθόλα 47 : Άλνηγκα παξαζύξνπ γηα επηινγή ιεθηηθνύ θνπκπηνύ. ην νπνίν αλνίγεη ην επόκελν παξάζπξν -32-

44 Δηθόλα 48 : Δπηινγή ιεθηηθνύ ή δεκηνπξγία λένπ Δάλ έρνπκε ήδε πεξάζεη ζην αξρείν strings.xml ην ιεθηηθό πνπ ζέινπκε, ην επηιέγνπκε από ηελ ιίζηα. Αιιηώο παηάκε ην θνπκπί NewString... ην επόκελν παξάζπξν γξάθνπκε ην ιεθηηθό πνπ ζέινπκε θαη παηάκε ΟΚ γηα λα απνζεθεπηεί. -33-

45 Δηθόλα 49 : Γεκηνπξγία λένπ ιεθηηθνύ ην πεδίν String ζέηνπκε ην ιεθηηθό πνπ ζα εκθαλίδεηαη θαη ζην πεδίν NewR.string ην όλνκα ηνπ resource. Παηώληαο ΟΚ επηζηξέθνπκε ζην πξνεγνύκελν παξάζπξν, ζην νπνίν έρεη πξνζηεζεί θαη ην λέν resource πνπ πξνζζέζακε. -34-

46 Δηθόλα 50 : Δπηινγή ιεθηηθνύ πνπ θηηάμακε. Σν επηιέγνπκε, παηάκε ΟΚ θαη πιένλ ην θνπκπί καο έρεη σο ιεθηηθό ην resource Δηθόλα 51 : Σέινο δηαδηθαζίαο επηινγήο ιεθηηθνύ -35-

47 4.2.2 Πξνζζήθε θνπκπηνύ κέζσ θώδηθα XML Έλαο άιινο ηξόπνο λα πξνζζέζνπκε έλα ή πεξηζζόηεξα θνπκπηά είλαη κέζσ θώδηθα XML.Αλ παηήζνπκε ην tab main.xml ζα καο εκθαλίζεη ηελ επόκελε εηθόλα, ζηελ νπνία κπνξνύκε λα γξάςνπκε θώδηθα θαη λα πξνζηεζεί απηόκαηα θνπκπί. Δηθόλα 52 : Κώδηθαο αξρείνπ main.xml Ο θώδηθαο πνπ βιέπνπκε είλαη απνηέιεζκα ηεο δηαδηθαζίαο πνπ θάλεηε πξνεγνπκέλσο κέζσ wizard. Δάλ ηξέμνπκε ηώξα ηελ εθαξκνγή ην απνηέιεζκα πνπ ζα δνύκε είλαη ην εμήο: -36-

48 Δηθόλα 53 : Δθαξκνγή κε θνπκπηά ζηελ actionbar Κώδηθαο ελεξγεηώλ θνπκπηώλ Ο θώδηθαο γηα ηηο δηάθνξεο ελέξγεηεο πνπ πξαγκαηνπνηνύληαη κε ηελ αιιειεπίδξαζε εθαξκνγήο - ρξήζηε γξάθεηαη ζην αξρείν MainActivity.java. Σν ζπγθεθξηκέλν αξρείν είλαη ε θιάζε πνπ δηαρεηξίδεηαη ηελ ιεηηνπξγηθόηεηα ηνπ activity_main.xml. ην αξρείν MainActivity.java ππάξρεη ε public boolean onoptionsitemselected(menuitem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getitemid(); if (id == R.id.action_settings) { return true; return super.onoptionsitemselected(item); -37-

49 Η ζπγθεθξηκέλε κέζνδνο δηαρεηξίδεηαη ηα θιηθ πάλσ ζηα θνπκπηά ηνπ κελνύ. Όηαλ εκείο ζέινπκε ην θνπκπί πνπ πξνζζέζακε λα εθηειεί κηα ελέξγεηα ην κόλν πνπ κέλεη είλαη λα πξνζζέζνπκε ηνλ θαηάιιειν θώδηθα ζε απηό ην ζεκείν. ην ζπγθεθξηκέλν παξάδεηγκα όηαλ ν ρξήζηεο ζα παηάεη ην θνπκπί πνπ πξνζζέζακε ζα εκθαλίδεηαη έλα ελεκεξσηηθό κήλπκα όηη πάηεζε ην ζπγθεθξηκέλν θνπκπί. Όπσο είδακε πξνεγνπκέλσο, ην id ηνπ θνπκπηνύ πνπ πξνζζέζακε είλαη ην item1. Άξα ν θώδηθαο πνπ πξέπεη λα πξνζζέζνπκε είλαη ν public boolean onoptionsitemselected(menuitem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getitemid(); if (id == R.id.action_settings) { return true; if (id ==R.id.item1){ return true; return super.onoptionsitemselected(item); Γηα λα ειέγμνπκε ηελ ιεηηνπξγηθόηεηα ηνπ θνπκπηνύ πνπ πξνζζέζακε, πξνζζέηνπκε κηα κέζνδν ε νπνία ζα εκθαλίδεη ην κήλπκα πνπ ζέινπκε private void Button1_Clicked(){ Toast.makeText(getApplicationContext(), "Menu's button 1 was clicked",toast.length_long).show(); Καη θαινύκε ηελ κέζνδν κέζα από ηελ public boolean onoptionsitemselected(menuitem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getitemid(); if (id == R.id.action_settings) { return true; if (id ==R.id.item1){ Button1_Clicked(); return true; return super.onoptionsitemselected(item); -38-

50 Δάλ ηξέμνπκε ηώξα μαλά ηελ εθαξκνγή θαη παηήζνπκε ην θνπκπί Button 1 ηόηε ζα εκθαληζηεί ην κήλπκα πνπ κόιηο γξάςακε Δηθόλα 54 : Απνηέιεζκα εθηέιεζεο θώδηθα ηεο onoptionsitemselected() 4.3 Πξνζζήθε Action Buttons Σα πην ζεκαληηθά θνπκπηά ηεο κπάξαο, απηά πνπ ζπλνδεύνληαη από εηθόλα ή/θαη θείκελν νλνκάδνληαη ActionButtons, θαη κπνξνύκε λα ηα ηνπνζεηήζνπκε θαηεπζείαλ επάλσ ζηελ ActionBar. πλήζσο απηά ηα θνπκπηά έρνπλ ζρέζε κε ην πεξηερόκελν ηεο ηξέρνπζαο δξαζηεξηόηεηαο (activity) πνπ βξίζθεηαη ν ρξήζηεο ζηελ εθαξκνγή. Όια ηα ππόινηπα θνπκπηά κπνξνύκε λα ηα ηνπνζεηήζνπκε ζηε ιίζηα πνπ αλνίγεη παηώληαο ην θνπκπί κε ηηο ηξεηο θάζεηεο ηειείεο. Γηα λα ηα πξνζζέζνπκε ζα πξέπεη λα δεκηνπξγήζνπκε έλα λέν αξρείν ζηνλ θάθειν res menu. Μέζα ζην project παηάκε δεμί θιηθ θαη επηιέγνπκε New File -39-

51 Δηθόλα 55 : Πξνζζήθε λένπ αξρείνπ menu ην επόκελν παξάζπξν πνπ αλνίγεη επηιέγνπκε ηνλ θάθειν menu θαη βάδνπκε σο όλνκα αξρείνπ ην main_activity_actions.xml -40-

52 Δηθόλα 56: Γεκηνπξγία αξρείνπ main_activity_actions.xml Δάλ παηήζνπκε Finish θαη αλνίμνπκε ηνλ θάθειν menu, ζα δνύκε ην αξρείν πνπ δεκηνπξγήζακε έρεη πξνζηεζεί. -41-

53 Δηθόλα57 : Πξνζζήθεαξρείνπ main_activity_actions.xml Αλνίγνπκε ην αξρείν θαη παηάκε ην tab main_activity_actions.xml, ώζηε λα πξνζζέζνπκε θαηεπζείαλ ηα θνπκπηά πνπ ζέινπκε. -42-

54 Δηθόλα58 : Κώδηθαο αξρείνπ main_activity_actions.xml Δδώ ηώξα ζα πξνζζέζνπκε έλα actionbutton πνπ ζα ην νλνκάζνπκε Search. <menuxmlns:android=" <!-- Search, should appear as action button --> <itemandroid:id="@+id/action_search" android:icon="@drawable/ic_action_search" android:title="@string/action_search" android:showasaction="ifroom" /> </menu> -43-

55 Παξαηεξνύκε όηη ην actionbuttonsearch έρεη σο ηίηιν έλα resource από ην αξρείν strings.xml. Γηα λα ην δειώζνπκε αλνίγνπκε ην αξρείν strings.xml Δηθόλα 59 : Δπηινγή αξρείνπ strings.xml θαη επηιέγνπκε ην Tab strings.xml, ζην νπνίν πξνζζέηνπκε ηελ εμήο γξακκή <stringname="action_search">search</string> Αληίζηνηρα βιέπνπκε όηη έρεη σο εηθόλα έλα resource από ην θάθειν drawable. Γηα λα ην πξνζζέζνπκε βξίζθνπκε ηελ εηθόλα πνπ ζέινπκε, ηελ θάλνπκε Αληηγξαθή θαη κέζα ζην project καο ηελ θάλνπκε επηθόιιεζε ζηνλ θάθειν πνπ ζέινπκε. -44-

56 Δηθόλα 60: Δπηθόιιεζε εηθόλαο ζηνλ θάθειν drawable θαη πιένλ ε εηθόλα πνπ ζέινπκε έρεη πξνζηεζεί σο resource. Δηθόλα 61 : Η εηθόλα πξνζηέζεθε σο resource -45-

57 Αθνύ δεκηνπξγήζακε ην λέν αξρείν κε ην menu, ζα πξέπεη λα ην δειώζνπκε ζην αξρείν MainActivity.java ζηνλ θάθειν src com.example.actionbar. Η δήισζε ησλ menu γίλεηαη ζηελ callback κέζνδν oncreateoptionsmenu(). ηελ ήδε ππάξρνπζα κέζνδν πξνζζέηνπκε κηα γξακκή θώδηθα ώζηε λα εκθαλίδεηαη θαη ην λένπ κελνύ πνπ public boolean oncreateoptionsmenu(menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); getmenuinflater().inflate(r.menu.main_activity_actions, menu); return true; Όηαλ ηώξα ηξέμνπκε ηελ εθαξκνγή ην απνηέιεζκα είλαη ην εμήο. ` -46-

58 5 Γηαρείξηζε θύθινπ δσήο Δθαξκνγήο Όζν ν ρξήζηεο πεξηεγείηαη κέζα ζηελ εθαξκνγή ζαο, ηα ActivityInstances ηεο εθαξκνγήο ζαο πεξλνύλ από δηάθνξεο θάζεηο. Γηα παξάδεηγκα, όηαλ μεθηλάεη ε εθαξκνγή ζαο, έξρεηαη κπξνζηά ζηελ νζόλε, ώζηε λα ιάβεη πξνζνρή από ηνλ ρξήζηε. Καηά ηελ δηάξθεηα απηήο ηεο δηαδηθαζίαο, ην Android θαιεί θαη εθηειεί κηα ζεηξά από κεζόδνπο δηαρείξηζεο ηνπ θύθινπ δσήο, ζηηο νπνίεο έρεηε γξάςεη θώδηθα ώζηε λα δεκηνπξγεζεί ην UI, λα ηξέμνπλ δηάθνξεο κεζόδνπο πνπ έρεηε ξπζκίζεη λα ηξέρνπλ θαηά ηελ εθθίλεζε θ.ν.θ. Δάλ ν ρξήζηεο μεθηλήζεη θάπνηα άιιε εθαξκνγή, ή ζηείιεη ηελ δηθή ζαο εθαξκνγή ζην παξαζθήλην, θαινύληαη θάπνηεο άιιεο κεζόδνπο δηαρείξηζεο ηεο εθαξκνγήο, ελώ ε εθαξκνγή παξακέλεη αλεπεξέαζηε ζην παξαζθήλην θαη δελ θιείλεη, νύησο ώζηε αλ ν ρξήζηεο ηελ επαλαθέξεη ζην πξνζθήλην λα ζπλερίζεη από εθεί πνπ ζηακάηεζε [3]. Σν πώο ζα ζπκπεξηθέξεηαη ε εθαξκνγή θαηά ηελ θιήζε απηώλ ησλ κεζόδσλ, όηαλ δειαδή ν ρξήζηεο θεύγεη από ηελ εθαξκνγή θαη κεηά ηελ μαλαθαιεί, κπνξείηε λα ην δηαρεηξηζηείηε εζείο κε θώδηθα. Γηα παξάδεηγκα εάλ έρεηε δεκηνπξγήζεη κηα εθαξκνγή γηα video streaming, κπνξείηε εζείο λα θαζνξίζεηε εάλ θεύγνληαο από ηελ εθαξκνγή ζα ζηακαηάεη ε αλαπαξαγσγή ή ζα ζπλερίδεηαη, ή εάλ όηαλ επαλέξρεηαη ζην πξνζθήλην ε εθαξκνγή ζα ζπλερίδεηαη ην video από εθεί πνπ ζηακάηεζε ή ζα μεθηλάεη από ηελ αξρή. ε απηό ην θεθάιαην ζα δνύκε βαζηθέο κεζόδνπο (lifecycle callback methods) πνπ δηαρεηξίδεηαη θάζε ActivityInstance, θαη πσο κπνξείηε λα ηηο δηαρεηξηζηείηε εζείο, ώζηε λα κελ ηξέρεη ε εθαξκνγή όηαλ δελ είλαη ζην πξνζθήλην, θαηαλαιώλνληαο άζθνπα πόξνπο ηνπ ζπζηήκαηνο, ελώ όηαλ επαλέξρεηαη ζην πξνζθήλην λα ζπκπεξηθέξεηαη κε έλα ηέηνην ηξόπν, ώζηε ν ρξήζηεο λα ζπλερίδεη από εθεί πνπ ζηακάηεζε. -47-

59 5.1 Ξεθηλώληαο έλα Activity Όπσο είδακε θαη ζε πξνεγνύκελν θεθάιαην, νη Android εθαξκνγέο δελ μεθηλνύζαλ θαιώληαο κηα main() κέζνδν, αιιά έλα Activity, ηξέρνληαο παξάιιεια ζπγθεθξηκέλεο callback κεζόδνπο, νη νπνίεο αληαπνθξίλνληαη ζηελ ηξέρνπζα θαηάζηαζε ηεο εθαξκνγήο. Τπάξρεη κηα αιιεινπρία κεζόδσλ πνπ μεθηλάεη έλα Activity θαη ππάξρεη άιιε αιιεινπρία κεζόδσλ πνπ ηξέρνπλ όηαλ θιείλεη έλα Activity. Καηά ηελ δηάξθεηα δσήο ελόο activity, ην ζύζηεκα θαιεί έλα ζύλνιν lifecycle κεζόδσλ, κε κηα ζεηξά παξόκνηα κε απηή ηεο ππξακίδαο, όπσο θαίλεηαη ζηελ παξαθάησ εηθόλα: Δηθόλα 62: Αιιεινπρία lifecycle callback κεζόδσλ Όηαλ ην ζύζηεκα δεκηνπξγεί έλα activity instance, θάζε callback method πνπ θαιείηαη "ζπξώρλεη" ην activity έλα βήκα πην θνληά ζηελ θνξπθή. Όηαλ θηάζεη ζηελ θνξπθή ζεκαίλεη όηη ε εθαξκνγή είλαη ζην πξνζθήλην θαη ν ρξήζηεο κπνξεί λα αιιειεπηδξάζεη καδί ηεο. Όηαλ ν ρξήζηεο μεθηλάεη λα βάδεη ζην παξαζθήλην ηελ εθαξκνγή, ην ζύζηεκα θαιεί άιιεο κεζόδνπο νη νπνίεο "ζπξώρλνπλ" ηελ θαηάζηαζε ηνπ activity έλα βήκα πην θάησ, κε ηειηθό πξννξηζκό ηελ θαηάζηαζε "Destroyed", πνπ έρεη σο απνηέιεζκα λα "θαηαζηξαθεί" ην activity instance. ε δηάθνξεο πεξηπηώζεηο όκσο γίλεηαη κόλν έλα βήκα πξνο ηα θάησ, όπσο όηαλ ν ρξήζηεο ζέηεη ηελ εθαξκνγή ζην παξαζθήλην αλνίγνληαο θάπνηα άιιε εθαξκνγή. Από απηό ην ζεκείν ην activity κπνξεί λα κεηαθηλεζεί θαη πξνο ηα επάλσ, εάλ ν ρξήζηεο επαλέιζεη ζηελ εθαξκνγή. -48-

60 Γελ είλαη απαξαίηεην ζε θάζε εθαξκνγή λα ππάξρνπλ όιεο νη κέζνδνη δηαρείξηζεο ηνπ θύθινπ δσήο. Απηό εμαξηάηαη από ηελ πνιππινθόηεηα ηεο εθαξκνγήο. Θα πξέπεη λα γίλεη θαηαλνεηό ην ηη θάλεη ε θάζε κέζνδνο θαη λα ρξεζηκνπνηεζνύλ εθείλεο νη κέζνδνη πνπ ζα εμαζθαιίδνπλ όηη ε εθαξκνγή ζπκπεξηθέξεηαη όπσο αλακέλνπλ νη ρξήζηεο. Γειαδή : Γελ ζα θαηαξξέεη ε εθαξκνγή αλ ν ρξήζηεο ιακβάλεη έλα ηειεθώλεκα ή αλ κεηαβαίλεη ζε άιιε εθαξκνγή, ελώ ρξεζηκνπνηεί ηελ εθαξκνγή ζαο. Γελ ζα θαηαλαιώλεη πνιύηηκνπο πόξνπο ηνπ ζπζηήκαηνο, όηαλ ν ρξήζηεο ηελ έρεη ζην παξαζθήλην. Δάλ ν ρξήζηεο εγθαηαιείςεη ηελ εθαξκνγή θαη επηζηξέςεη αξγόηεξα, ζα πξέπεη λα ζπλερίζεη από ην ζεκείν πνπ ζηακάηεζε. Γελ ζα θαηαξξέεη ε εθαξκνγή εάλ γίλεηαη πεξηζηξνθή ηεο νζόλεο. Τπάξρνπλ δηάθνξεο θαηαζηάζεηο θαηά ηηο νπνίεο αιιάδεη ε θαηάζηαζε ηνπ activity κεηαμύ ησλ θαηαζηάζεσλ πνπ θαίλνληαη ζηελ εηθόλα. Αιιά κόλν ηξεηο θαηαζηάζεηο είλαη ζηαηηθέο (κπνξεί ην activity λα βξίζθεηαη ζε απηή ηελ θαηάζηαζε γηα παξαηεηακέλν ρξόλν). Απηέο νη θαηαζηάζεηο είλαη νη εμήο: Resumed: ή αιιηώο "running" state. ε απηή ηελ θαηάζηαζε ε εθαξκνγή βξίζθεηαη ζην πξνζθήλην θαη ν ρξήζηεο αιιειεπηδξά καδί ηεο. Paused : ζε απηή ηελ πεξίπησζε ε εθαξκνγή δελ βξίζθεηαη ζην πξνζθήλην, αιιά κηα άιιε εθαξκνγή ηείλεη λα κπεη ζην πξνζθήλην. Απηό ζεκαίλεη όηη ε άιιε εθαξκνγή δελ θαιύπηεη όιε ηελ νζόλε θαη ε εθαξκνγή καο δελ έρεη θύγεη εληειώο από ην πξνζθήλην. ηελ ζπγθεθξηκέλε θαηάζηαζε ε εθαξκνγή δελ αιιειεπηδξά κε ηνλ ρξήζηε θαη δελ εθηειείηαη θάπνηνο θώδηθαο. Stopped : ε απηή ηελ θαηάζηαζε ε εθαξκνγή είλαη εληειώο ζην παξαζθήλην, θαη κε νξαηή ζηνλ ρξήζηε. Γελ εθηειείηαη θαλέλαο θώδηθαο, αιιά ην activity instance θαη νη δηάθνξεο πιεξνθνξίεο ζρεηηθά κε ηελ θαηάζηαζή ηνπ δηαηεξνύληαη. Οη άιιεο δύν θαηαζηάζεηο (Created θαη Started) είλαη παξνδηθέο θαη ην ζύζηεκα θηλείηαη άκεζα ζηελ επόκελε θαηάζηαζε θαιώληαο ηελ επόκελε lifecycle callback κέζνδν. Απηό ζεκαίλεη όηη κεηά ηελ oncreate(), θαιείηαη ακέζσο ε onstart(), ε νπνία αθνινπζείηαη ακέζσο από ηελ onresume(). -49-

61 5.2 Καζνξηζκόο Activity Έλαξμεο Δθαξκνγήο Όηαλ ν ρξήζηεο εθθηλεί ηελ εθαξκνγή ζαο, ην ζύζηεκα θαιεί ηελ κέζνδν oncreate() γηα ην Activity πνπ είλαη δεισκέλν λα είλαη ην main ή ην launcher ηεο εθαξκνγήο. Η δήισζε απηή ηνπ activity γίλεηαη ζην αξρείν AndroidManifest.xml. Δηθόλα 63 : Γηαδξνκή αξρείνπ AndoidManifest.xml Ο θώδηθαο ηνπ ζπγθεθξηκέλνπ αξρείνπ είλαη ν εμήο <activity android:name=".mainactivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> Μέζα ζην <activity>γίλεηαη ε δήισζε όισλ ησλ activities πνπ δεκηνπξγνύκε κέζα ζην θάθειν res layout. Σν main activity ηεο εθαξκνγήο ζα πξέπεη λα έρεη δεισκέλν έλα <intentfilter>, ην νπνίν ζα πεξηιακβάλεη ην MAINaction θαη ηε LAUNCHER θαηεγνξία. -50-

62 Δάλ δελ ππάξρεη δεισκέλν MAINaction ή LAUNCHER θαηεγνξία ζε θαλέλα activity, ηόηε ην εηθνλίδην ηεο εθαξκνγήο ζαο δελ ζα εκθαλίδεηαη ζηελ ιίζηα εθαξκνγώλ ηεο ζπζθεπήο ζηελ νπνία έγηλε εγθαηάζηαζε. 5.3 Γεκηνπξγία λένπ ζηηγκηόηππνπ Οη πεξηζζόηεξεο εθαξκνγέο πεξηιακβάλνπλ πνιιά δηαθνξεηηθά activities πνπ δίλνπλ ηελ δπλαηόηεηα ζηνλ ρξήζηε λα πξαγκαηνπνηήζεη δηάθνξεο ελέξγεηεο. Δίηε ην activity είλαη ην main_activity πνπ δεκηνπξγείηαη όηαλ ν ρξήζηεο μεθηλάεη ηελ εθαξκνγή είηε είλαη έλα activity πνπ δεκηνπξγείηαη σο απνηέιεζκα κηαο ελέξγεηαο ηνπ ρξήζηε, ην ζύζηεκα δεκηνπξγεί έλα λέν ζηηγκηόηππν (instance) ηνπ activity, θάλνληαο θιήζε ζηελ κέζνδν oncreate() ηνπ ζπγθεθξηκέλνπ activity. ηελ oncreate() ν θώδηθαο πνπ ζα γξαθηεί ζα πξέπεη λα ζρεηίδεηαη κε ηελ βαζηθή ινγηθή ηεο εθθίλεζεο ηνπ activity. Γηα παξάδεηγκα ζηελ ζπγθεθξηκέλε κέζνδν ζα πξέπεη λα θαζνξηζηεί ην UI ηνπ θαη πηζαλόλ λα αξρηθνπνηεζνύλ θάπνηεο κεηαβιεηέο πνπ ζα ρξεζηκνπνηεζνύλ αξγόηεξα. Κάζε activity πνπ δεκηνπξγείηε ζην res layout ζα πξέπεη λα έρεη ην αληίζηνηρν source file ζηνλ θάθειν src pakage_name. Π.ρ. κπνξνύκε λα πξνζζέζνπκε έιεγρν γηα ηελ έθδνζε ηνπ ινγηζκηθνύ ζην νπνίν ηξέρεη ε εθαξκνγή καο, ώζηε αλάινγα ηελ έθδνζε λα εκθαλίδεη θαη δηαθνξεηηθό UI. ην παξάδεηγκα πνπ αθνινπζεί ειέγρνπκε αλ ε έθδνζε είλαη από 3.0 θαη πάλσ ώζηε λα εκθαληζηεί ε actionbar. protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){ android.app.actionbaractionbar= getactionbar(); actionbar.sethomebuttonenabled(false); Όηαλ ηειεηώζεη ε εθηέιεζε ηεο oncreate(), ην ζύζηεκα ακέζσο θαιεί ηελ onstart() θαη ζηελ ζπλέρεηα ηελ onresume(), ζε ηαρεία ελαιιαγή. Σν activity δελ παξακέλεη πνηέ ζε θαηάζηαζε Created ή Started. Σερληθά, ην activity γίλεηαη νξαηό ζην ρξήζηε όηαλ θιεζεί ε oncreate(), αιιά ε θιήζε ηεο onresume() γίλεηαη άκεζα θαη ην activity παξακέλεη ζε απηή ηελ θαηάζηαζε κέρξη λα ζπκβεί θάηη, όπσο π.ρ. λα ππάξρεη -51-

63 θάπνηα εηζεξρόκελε θιήζε ή ν ρξήζηεο λα κεηαβεί ζε έλα άιιν activity ή λα ζβήζεη ε νζόλε ηεο ζπζθεπήο. Δηθόλα 64 : εηξά εθηέιεζεο κεζόδσλ γηα ηελ δεκηνπξγία ελόο activity 5.4 Καηαζηξνθή ηνπ Activity Η ηειεπηαία callback κέζνδνο πνπ θαιείηαη όηαλ ζέινπκε λα "θαηαζηξέςνπκε" εληειώο έλα activity είλαη ε ondestroy(). Η ζπγθεθξηκέλε κέζνδνο είλαη ην ηειηθό ζήκα ζην ζύζηεκα όηη ην ζπγθεθξηκέλν activity ζα θαηαζηξαθεί εληειώο θαη ζα πξέπεη λα ην δηαγξάςεη από ηελ κλήκε ηνπ ζπζηήκαηνο. Οη πεξηζζόηεξεο εθαξκνγέο δελ ρξεηάδεηαη λα θαιέζνπλ ηελ ζπγθεθξηκέλε κέζνδν, επεηδή νη ηνπηθέο θιάζεηο πνπ δειώλνληαη θαηαζηξέθνληαη καδί κε ην activity θαη επεηδή ην activity ζα πξέπεη λα "θαζαξίδεηαη" θπξίσο ζην onpaused() θαη ζην onstopped(). Αλ όκσο ε εθαξκνγή ζαο ρξεζηκνπνηεί πόξνπο πνπ ελδέρεηαη λα νδεγήζνπλ ζε απώιεηα κλήκεο (π.ρ. λα κελ κπνξέζεη ε εθαξκνγή λα θαζαξίζεη ηελ κλήκε), ζα πξέπεη λα γίλεη θιήζε ηεο ondestroy(), ώζηε λα απειεπζεξώζεη απηνύο ηνπο πόξνπο θαη λα θαζαξίζεη ηελ κλήκε. -52-

64 5.5 Παύζε θαη ζπλέρηζε κηα δξαζηεξηόηεηαο Καηά ηελ θπζηνινγηθή ρξήζε κηαο εθαξκνγήο, ην activity πνπ βξίζθεηαη ζην πξνζθήλην κπνξεί λα δηαθνπεί από θάπνηα άιιν activity, κε απνηέιεζκα ην πξώην activity λα νδεγεζεί ζε παύζε. Όζν ην activity είλαη κεξηθώο νξαηό αιιά ε εζηίαζε δελ είλαη ζε απηό, ε θαηάζηαζε πνπ βξίζθεηαη είλαη Paused. Όηαλ όκσο παξεκπνδίδεηαη πιήξσο από θάπνην άιιν activity θαη δελ είλαη θαζόινπ νξαηό, ηόηε ε θαηάζηαζή ηνπ είλαη Stopped. Όηαλ ην activity εηζέξρεηαη ζε θαηάζηαζε Paused, ην ζύζηεκα θαιεί ηε κέζνδν onpaused(), ε νπνία ζαο δίλεη ηελ δπλαηόηεηα λα ζηακαηήζεηε ελέξγεηεο πνπ ηξέρνπλ εθείλε ηελ ζηηγκή θαη ζα πξέπεη λα ζηακαηήζνπλ (π.ρ. λα ζηακαηήζεηε ηελ αλαπαξαγσγή ελόο βίληεν ή ελόο κνπζηθνύ θνκκαηηνύ) ή λα δηαηεξήζεηε δηάθνξεο πιεξνθνξίεο πνπ πξέπεη λα απνζεθεπηνύλ ζε πεξίπησζε πνπ ν ρξήζηεο θιείζεη εληειώο ηελ εθαξκνγή ζαο. Δάλ ν ρξήζηεο επηζηξέςεη ζην activity από κηα Paused θαηάζηαζε, ην ζύζηεκα επαλέξρεηαη θαη θαιεί ηελ κέζνδνο onresume(). Δηθόλα 65 : Αιιειεπίδξαζε κεζόδσλ κεηαμύ θαηαζηάζεσλ Paused θαη Resumed -53-

65 5.5.1 Παύζε δξαζηεξηόηεηαο Όηαλ ην ζύζηεκα θαιεί ηελ onpause() γηα ην ηξέρνλ activity, ζεκαίλεη όηη ην activity είλαη κεξηθώο νξαηό θαη ππάξρεη ε πηζαλόηεηα ν ρξήζηεο λα επηζηξέςεη ζε απηό. Βέβαηα ην ζπλεζέζηεξν είλαη ν ρξήζηεο λα εγθαηαιείςεη εληειώο ην ζπγθεθξηκέλν activity, κε απνηέιεζκα ην activity λα έξζεη ζε θαηάζηαζε Stopped.Οη ζπλεζέζηεξεο ελέξγεηεο θαηά ηελ θιήζε ηεο onpaused() είλαη νη εμήο : Να ζηακαηνύλ βίληεν, κνπζηθή ή δηάθνξα animations, ώζηε λα κελ γίλεηαη άζθνπε θαηαλάισζε ηεο CPU. Να ζώδνληαη δηάθνξεο κε απνζεθεπκέλεο αιιαγέο, αιιά κόλν απηέο πνπ ζα πεξίκελε ν ρξήζηεο λα απνζεθεπηνύλ, όπσο π.ρ. έλα κε απεζηαικέλν . Απνδέζκεπζε πόξσλ ζπζηήκαηνο, όπσο GPS, θάκεξα θαη γεληθά νηηδήπνηε θαηαλαιώλεη κπαηαξία θαη δελ ην ρξεηάδεηαη ν ρξήζηεο ζηελ εθαξκνγή. Γηα παξάδεηγκα αλ ζην oncreate() ηνπ activity αλνίγνπκε ηελ θάκεξα ηνπ θηλεηνύ, είλαη κηα θαιή επηινγή ζην OnPaused() λα ηελ απνδεζκεύζνπκε. private Camera protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mcamera = public void onpause() { super.onpause(); if (mcamera!= null) { mcamera.release(); mcamera = null; Γεληθά, ε onpaused() δελ ζα πξέπεη λα ρξεζηκνπνηείηαη γηα ηελ απνζήθεπζε δεδνκέλσλ, εθηόο από πεξηπηώζεηο πνπ ν ρξήζηεο πεξηκέλεη λα γίλεη autosave, όπσο π.ρ. ην draft ελόο . Θα πξέπεη λα απνθεύγνληαη εξγαζίεο πνπ θνζηίδνπλ πνιύ ζε CPU, όπσο ε απνζήθεπζε δεδνκέλσλ ζε κηα βάζε δεδνκέλσλ, γηαηί ζα θαζπζηεξεί ε κεηάβαζε από έλα activity ζην άιιν. Απηέο νη ρξνλνβόξεο εξγαζίεο ζα πξέπεη λα γίλνληαη ζην onstop(). -54-

66 5.5.2 πλέρηζε κηα δξαζηεξηόηεηαο Όηαλ ην activity είλαη ζε Paused θαηάζηαζε, ην instance παξακέλεη ζηελ κλήκε ηνπ ζπζηήκαηνο, έηζη ώζηε όηαλ ν ρξήζηεο μαλαθέξεη ην activity ζην πξνζθήλην, λα θαιεζηεί ην ζπγθεθξηκέλν μαλάδειώλνληαο ηηο δηάθνξεο κεηαβιεηέο. instance, θαη λα κελ δεκηνπξγεζεί θαηλνύξγην, Όηαλ ην activity επαλέξρεηαη από Paused θαηάζηαζε, ην ζύζηεκα θαιεί ηελ κέζνδν onresume(). Απηό πνπ ζα πξέπεη λα πξνζερζεί είλαη όηη ε onresume(), θαιείηαη θάζε θνξά πνπ ην activity επαλέξρεηαη ζην πξνζθήλην, ζπκπεξηιακβαλνκέλεο θαη ηεο πξώηεο θνξάο πνπ ζα ηξέμεη ην activity. Γηα ην ιόγν απηό ζα πξέπεη λα πξνζερζεί ν θώδηθαο πνπ ζα γξαθηεί κέζα ζηελ ζπγθεθξηκέλε κέζνδν, ώζηε λα κελ ππάξρεη πξόβιεκα νύηε ηελ πξώηε θνξά πνπ ηξέμεη ην activity, νύηε όηαλ ζα επαλέιζεη από Paused θαηάζηαζε. ην πξνεγνύκελν παξάδεηγκα πνπ δείμακε γηα ηελ απειεπζέξσζε ηεο θάκεξαο ζηελ Paused θαηάζηαζε, κπνξνύκε λα πξνζζέζνπκε ηνλ αληίζηνηρν θώδηθα πνπ ζα ηξέρεη ζε πεξίπησζε πνπ ην activity γίλεηαη resume θαη ζέινπκε λα μαλαλνίμνπκε ηελ public void onresume() { super.onresume(); if (mcamera == null) { mcamera = Camera.open(); 5.6 Γηαθνπή θαη επαλεθθίλεζε Activity Ο ζσζηόο ηξόπνο δηαρείξηζεο ηεο δηαθνπήο θαη επαλεθθίλεζεο ελόο activity είλαη από ηα ζεκαληηθόηεξα δεηήκαηα ηεο δηαρείξηζεο ηνπ θύθινπ δσήο ηνπ. Ο ρξήζηεο ζα πξέπεη λα αηζζάλεηαη βέβαηνο όηη ζε νπνηνδήπνηε ζεκείν θαη αλ δηαθόςεη ηε ιεηηνπξγία ηνπ activity θαη ζηελ ζπλέρεηα επαλέιζεη, ζα ζπλερίζεη από ην ίδην ζεκείν πνπ ζηακάηεζε. Οη ζπλεζέζηεξεο πεξηπηώζεηο πνπ ν ρξήζηεο ζηακαηάεη θαη επαλεθθηλεί έλα activity: Ο ρξήζηεο αλνίγεη ην παξάζπξν ησλ RecentApps θαη κεηαθέξεηαη ζε θάπνηα άιιε εθαξκνγή. Σν activity ηεο εθαξκνγήο πνπ ήηαλ ζην πξνζθήλην ζηακαηάεη. -55-

67 ε πεξίπησζε πνπ ν ρξήζηεο αξγόηεξα επηιέμεη μαλά ηελ ίδηα εθαξκνγή, ην activity επαλεθθηλείηαη. Ο ρξήζηεο εθηειεί κηα ελέξγεηα κέζα ζηελ εθαξκνγή θαη μεθηλάεη έλα λέν activity. ε απηή ηελ πεξίπησζε ην αξρηθό activity ζηακαηάεη. ε πεξίπησζε πνπ ν ρξήζηεο παηήζεη ην backbutton, ην activity επαλεθθηλεί. Ο ρξήζηεο ιακβάλεη κηα θιήζε θαη ηελ δηάξθεηα ηεο ρξήζεο ηεο εθαξκνγήο. Μόιηο μεθηλάεη λα ρηππά ηνλ ηειέθσλν, ην activity ζηακαηάεη, ελώ όηαλ ηειεηώζεη ε θιήζε ην activity επαλέξρεηαη. Τπάξρνπλ δπν lifecycle κέζνδνη, νη onstop() θαη onrestart(), νη νπνίεο δηαρεηξίδνληαη ηελ δηαθνπή θαη επαλεθθίλεζε ηνπ activity. Δηθόλα 66 : Αιιειεπίδξαζε κεζόδσλ κεηαμύ θαηαζηάζεσλ Paused, Stoped θαη Resumed Θα πξέπεη λα ζεκεησζεί όηη επεηδή ην ζύζηεκα θξαηάεη ην ελεξγό ζηηγκηόηππν (Instance) ηνπ activity ζηελ κλήκε ηνπ όηαλ απηό ζηακαηήζεη, είλαη πνιύ πηζαλό λα κελ ρξεηαζηεί λα γίλεη θιήζε ηεο onstop() θαη ηεο onrestart(), ή αθόκα θαη ηεο onstart(), γηα ηελ δηαρείξηζε ηεο δηαθνπήο θαη ηεο επαλεθθίλεζεο. Γηα ηα πεξηζζόηεξα activities, πνπ είλαη ζρεηηθά απιά δελ ρξεηάδεηαη λα θιεζνύλ νη κέζνδνη. Ίζσο κόλν ε onpause(), γηα λα γίλεη δηαθνπή ησλ ηξερνπζώλ ελεξγεηώλ θαη λα απνδεζκεπζνύλ πόξνη ηνπ ζπζηήκαηνο Γηαθνπή ελόο activity Όηαλ έλα activity ιακβάλεη θιήζε γηα ηελ ρξήζε ηεο onstop(), ζεκαίλεη όηη ε εθαξκνγή δελ είλαη πιένλ νξαηή θαη ζα πξέπεη λα ειεπζεξώζεη ζρεδόλ όινπο ηνπο -56-

68 πόξνπο πνπ ρξεζηκνπνηνύζε θαη δελ είλαη απαξαίηεηε όζν ν ρξήζηεο δελ ρξεζηκνπνηεί ην activity. Όηαλ ην activity έξζεη ζε θαηάζηαζε Stopped, ηόηε ππάξρεη κηα πηζαλόηεηα ην ζύζηεκα λα θαηαζηξέςεη ην instance, ώζηε λα κελ ππάξμεη πεξίπησζε memoryleak. ε θάπνηεο αθξαίεο θαηαζηάζεηο, ην ζύζηεκα κπνξεί λα "ζθνηώζεη" ηελ εθαξκνγή, ρσξίο λα γίλεη θιήζε ζηελ ηειηθή κέζνδν ηνπ activityondestroy(). Γηα απηό ην ιόγν είλαη ζεκαληηθό λα γίλεηαη ρξήζε ηεο onstop() γηα ηελ απειεπζέξσζε πόξσλ πνπ κπνξεί λα νδεγήζνπλ ζε memoryleak. Θα πξέπεη λα μαλαηνληζηεί όηη παξόιν πνπ ε onpause() θαιείηαη πξηλ ηελ onstop(), ε δεύηεξε ρξεζηκνπνηείηαη γηα ελέξγεηεο πνπ απαηηνύλ κεγάιε ππνινγηζηηθή ηζρύ. ην επόκελν παξάδεηγκα ε onstop() ρξεζηκνπνηείηαη γηα λα ηελ απνζήθεπζε ησλ πεξηερόκελσλ ελόο draft ζεκεηώκαηνο ζηελ Protectedvoid onstop() { super.onstop(); ContentValues values = new ContentValues(); getcontentresolver().update( muri, values, null, null ); Όηαλ θαιείηαη ε onstop(), ην activity παξακέλεη ζηελ κλήκε θαη μαλαθαιείηαη όηαλ ην activity επαλεθθηλείηαη. Γελ ρξεηάδεηαη λα μαλαδεκηνπξγήζεηε components πνπ έρεηε δεκηνπξγήζεη ζε θάπνηα callback κέζνδν, ε νπνία νδεγεί ζε θαηάζηαζε Resumed. επίζεο ην ζύζηεκα θξαηάεη παξαθνινπζεί θαη ηελ ηξέρνπζα θαηάζηαζε ηνπ UI, έηζη ώζηε εάλ ν ρξήζηεο έρεη γξάςεη θάπνην θείκελν ζε θάπνην EditText, λα ην δηαηεξήζεη ώζηε λα ην δεη όηαλ ζα γίλεη resume ην activity Δθθίλεζε / Δπαλεθθίλεζε Activity Όηαλ ην activity επαλέξρεηαη ζην πξνζθήλην από Stopped θαηάζηαζε, ηόηε θαιείηαη ε κέζνδνο onrestart(). Σν ζύζηεκα επηπιένλ θαιεί θαη ηελ onstart(), ε νπνία θαιείηαη θάζε θνξά πνπ ην activity γίλεηαη νξαηό, είηε είλαη ε πξώηε θνξά πνπ -57-

69 δεκηνπξγείηαη είηε επαλεθθηλείηαη από κηα Stopped θαηάζηαζε. Αληηζέησο ε onrestart() θαιείηαη κόλν όηαλ ην activity επαλεθθηλείηαη από κηα Stopped θαηάζηαζε. Απηό καο δίλεη ηελ επρέξεηα λα γξάςνπκε θώδηθα πνπ ζα πξαγκαηνπνηεί εηδηθή δνπιεηά απνθαηάζηαζεο ηνπ activity θαη ζα είλαη απαξαίηεην λα ηξέρεη κόλν όηαλ ην activity επαλεθθηλείηαη θαη όρη όηαλ μεθηλάεη γηα πξώηε θνξά. Δίλαη ζρεδόλ απίζαλν λα ρξεηαζηεί λα ρξεζηκνπνηεζεί ε onrestart() γηα ηελ απνθαηάζηαζε ηνπ activity. Όηαλ ζηακαηάεη έλα activity ζπλήζσο θαζαξίδνπλ όινη νη πόξνη πνπ ρξεζηκνπνηεί, κε απνηέιεζκα όηαλ ζα ρξεηαζηεί λα επαλεθθηλήζεη λα πξέπεη λα μαλάδεισζνύλ θαη λα μαλάδεζκεπζνύλ νη πόξνη. Όκσο δέζκεπζε πόξσλ ζα πξέπεη λα γίλεη θαη όηαλ ην activity μεθηλάεη γηα πξώηε θνξά. Άξα ε δέζκεπζε βνιεύεη λα γίλεηαη ζηελ onstart(), ε νπνία έηζη θαη αιιηώο θαιείηαη κεηά ηελ onrestart(). Δάλ π.ρ. ε εθαξκνγή καο ρξεηάδεηαη λα είλαη ελεξγνπνηεκέλν ην GPS, θαη ν ρξήζηεο έρεη ηελ εθαξκνγή καο πνιύ ώξα ζην παξαζθήλην, ζα πξέπεη λα γίλεη έλαο έιεγρνο όηαλ ην activity επηζηξέθεη ζην πξνζθήλην. Σν θαιύηεξν ζεκείν λα γίλεη απηόο ν έιεγρνο, γηα ηνπο ιόγνπο πνπ εμεγήζακε πξνεγνπκέλσο, είλαη ζηελ onstart(). protected void onstart() { super.onstart(); LocationManager locationmanager = (LocationManager) getsystemservice(context.location_service); boolean gpsenabled = locationmanager.isproviderenabled(locationmanager.gps_provider); if (!gpsenabled) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); protected void onrestart() { super.onrestart(); Όηαλ ην ζύζηεκα θαηαζηξέθεη ην activity θαιείηαη ε ondestroy() κέζνδνο. Η ζπγθεθξηκέλε κέζνδνο είλαη ε ηειεπηαία πνπ θαιείηαη, νπόηε εάλ δελ έρεηε απειεπζεξώζεη πόξνπο θαη δελ έρεηε αδεηάζεη ηελ κλήκε, ηώξα είλαη ε ηειεπηαία επθαηξία. -58-

70 5.7 Δπαλαδεκηνπξγία ελόο activity Τπάξρνπλ ειάρηζηεο πεξηπηώζεηο θαηά ηηο νπνίεο ε θαηαζηξνθή ηνπ activity γίλεηαη ιόγσ ηεο θπζηνινγηθήο ιεηηνπξγίαο ηεο εθαξκνγήο ζαο, π.ρ. όηαλ ν ρξήζηεο παηάεη ην πιήθηξν Back ή όηαλ εθηειεζηεί κηα ιεηηνπξγία θαη ην ίδην ην activity θαιέζεη ηελ κέζνδν finish() θαη απηνθαηαζηξαθεί. Δπίζεο ην ζύζηεκα κπνξεί λα θαηαζηξέςεη ην activity όηαλ κείλεη πνιύ ώξα ζην παξαζθήλην ή όηαλ έλα activity πνπ βξίζθεηαη ζην πξνζθήλην ρξεηαζηεί επηπιένλ κλήκε ή πόξνπο, κε απνηέιεζκα ην ζύζηεκα λα ρξεηαζηεί λα θιείζεη δηαδηθαζίεο πνπ ηξέρνπλ ζην παξαζθήλην γηα λα απειεπζεξώζεη πόξνπο. -59-

71

72 6 Γεκηνπξγία Γπλακηθώλ UI Γηα ηελ δεκηνπξγία δπλακηθώλ UI, αιιά θαη πνιππαξαζπξηθώλ εθαξκνγώλ, ζα πξέπεη λα ελζσκαηώζνπκε ζηελ εθαξκνγή καο δηάθνξα UI components θαη δηάθνξα activities ζε modules, έηζη ώζηε λα ελαιιάζζνληαη ηα activities, θαη λα ελαιιάζζνληαη κε απηό ηνλ ηξόπν νη δηάθνξεο νζόλεο.[4] Γηα ηελ δεκηνπξγία απηώλ ησλ modules ρξεζηκνπνηνύκε ηελ θιάζε Fragment. Η ζπγθεθξηκέλε θιάζε ιεηηνπξγεί σο έλα εκθσιεπκέλν activity, ην νπνίν κπνξεί λα έρεη ην δηθό ηνπ layout, αιιά θαη ην δηθό ηνπ lifecycle. Με ηελ βνήζεηα ηνπ Fragment, όηαλ ηνπ έρνπκε νξίζεη δηθό ηνπ layout, κπνξνύζε λα δεκηνπξγήζνπκε δηαθνξεηηθνύο ζπλδπαζκνύο ηνπ layout γηα δηαθνξεηηθνύ κεγέζνπο νζόλεο. Γηα παξάδεηγκα κπνξνύκε λα νξίζνπκε όηη ζηηο κηθξέο νζόλεο ζα εκθαλίδεηαη έλα segment ελώ ζε κεγαιύηεξεο δπν. Σα Fragments πξσηνεκθαλίζηεθαλ ζηελ έθδνζε 3.0 (Honeycomb). Με ηελ ελζσκάησζε ζηελ εθαξκνγή καο ηεο v4 βηβιηνζήθεο ηνπ Android κπνξεί λα ππνζηεξηρζεί θαη ζε έθδνζε Android 1.6. ε απηό ην θεθάιαην ζα επηθεληξσζνύκε ζην πσο κπνξνύκε λα δεκηνπξγήζνπκε Fragments ζε εθδόζεηο 3.0 θαη άλσ. 6.1 ΓεκηνπξγίαFragment Γηα λα γίλεη πην θαηαλνεηό ην ηη αθξηβώο είλαη ην Fragment, κπνξνύκε λα πνύκε όηη είλαη έλα "ζπλαξκνινγνύκελν" ηκήκα ελόο activity. Έρεη ην δηθό ηνπ layout, ην δηθό ηνπ lifecycle, ηα δηθά ηνπ events, ελώ κπνξνύκε λα ην αθαηξέζνπκε ή λα ην πξνζζέζνπκε ελώ ην activity είλαη ελεξγό. Γεκηνπξγνύκε έλα λέν project, ζην νπνίν νξίδνπκε σο MinimumRequiredSDK ην Android 3.0. [5] -61-

73 Δηθόλα 67 : Γεκηνπξγία λένπ project ην ζπγθεθξηκέλν παξάδεηγκα ζα δεκηνπξγήζνπκε δπν δηαθνξεηηθά layout, ηα νπνία ζα ελαιιάζζνπκε κε ηελ ρξήζε δπν θνπκπηώλ. Αλνίγνπκε ην activity_main.xml από ην θάθειν res layout θαη επηιέγνπκε ην tab activity_main.xml -62-

74 Δηθόλα 68 : Δπηινγή activity_main.xml -63-

75 Δηθόλα 69 : Δπηινγή tab activity_main.xml Πξνζζέηνπκε έλα linearlayout κε δπν θνπκπηά θαη έλα Fragment <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/fragment_no_1" android:onclick="selectfrag" /> <Button android:id="@+id/button2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onclick="selectfrag" android:text="@string/fragment_no_2" /> <fragment android:name="com.example.fragments.fragmentone" android:id="@+id/fragment_place" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> ηα buttons έρνπκε δειώζεη σο event ην onclick(), ην νπνίν ζα εθηειεί ηελ ξνπηίλα selectfrag, ηελ νπνία ζα γξάςνπκε ζηελ ζπλέρεηα ζην αξρείν MainActivity. Σα ιεθηηθά πνπ έρνπκε πξνζζέζεη ηα έρνπκε δειώζεη ζην strings.xml πνπ βξίζθεηαη ζην θάθειν res- values. -64-

76 Δηθόλα 70 : Δπηινγή αξρείνπ strings.xml Έλαο ελαιιαθηηθόο ηξόπνο πξνζζήθεο string, ζε ζρέζε κε απηόλ πνπ παξνπζηάζακε ζε πξνεγνύκελν θεθάιαην, είλαη παηώληαο ην θνπκπί Add. Δηθόλα 71 : Γεκηνπξγία string από ηνλ wizard -65-

77 ην παξάζπξν πνπ αλνίγεη επηιέγνπκε string θαη παηάκε ΟΚ. Δηθόλα 72 : Δπηινγή string γηα εηζαγσγή ζηα Resources ηελ ζπλέρεηα ζέηνπκε ην όλνκα θαη ηελ ηηκή ηεο λέαο κεηαβιεηήο String πνπ δεκηνπξγήζακε Δηθόλα 73 : Όλνκα θαη ηηκή λέαο κεηαβιεηήο -66-

78 Γηα λα απνζεθεπηνύλ νη αιιαγέο αξθεί λα παηήζνπκε Save Δηθόλα 74 : Απνζήθεπζε αιιαγώλ 6.2 Γεκηνπξγία Fragment Layout Όπσο αλαθέξακε πξνεγνπκέλσο ζα δεκηνπξγήζνπκε δπν fragments. Κάζε fragment ζα έρεη ην δηθό ηνπ layout. To layout ηνπ πξώηνπ ζα ην νλνκάζνπκε fragment_one θαη ην δεύηεξν fragment_two. Γηα λα δεκηνπξγήζνπκε έλα layout θάλνπκε δεμί θιηθ ζην θάθειν res layout θαη επηιέγνπκε New Android XML File Δηθόλα 75 : Γεκηνπξγία λένπ αξρείνπ layout -67-

79 Ωο Resource Type επηιέγνπκε ην Layout, ελώ ζηελ ζπγθεθξηκέλε πεξίπησζε σο Root Element επηιέγνπκε ην LinearLayout. Θα κπνξνύζακε λα επηιέμνπκε νπνηνδήπνηε element ζέιακε, αθνύ ην fragment έρεη δηθό ηνπ layout, αλεμάξηεην από ην layout ηνπ activity ζην νπνίν ελζσκαηώλεηαη. Δηθόλα 76: Ρύζκηζε παξακέηξσλ layout ηελ επόκελε νζόλε πνπ εκθαλίδεηαη παηάκε Finish, ώζηε λα πξνζηεζεί ην Fragment ζηνλ θώδηθά καο. Δηθόλα 77 : Δπηινγή θαθέινπ απνζήθεπζεο -68-

80 Αλνίγνπκε ην fragment_one.xml θαη γξάθνπκε θώδηθα ώζηε λα πξνζζέζνπκε έλα TextView κε έλα θείκελν θαη ρξώκα ζαιαζζί. <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#00ffff"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:text="this is fragment No.1" android:textstyle="bold" /> </LinearLayout> Με αληίζηνηρν ηξόπν δεκηνπξγνύκε θαη ην layout fragment_two, ζην νπνίν ζα αιιάμνπκε ην text πνπ ζα εκθαλίδεη, όπσο επίζεο θαη ην ρξώκα ηνπ background <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#ffff00"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="this is fragment No.2" android:textstyle="bold" /> </LinearLayout> Καη ζηα δύν layout αληηθαζηζηνύκε ην text κε ην resource από ην αξρείν strings.xml. Γηα λα δεκηνπξγήζνπκε ην Fragment θάλνπκε δεμί θιηθ com.example.fragments, πνπ βξίζθεηαη ζηνλ θάθειν src, θαη ζηελ ζπλέρεηα επηιέγνπκε New Class -69-

81 Δηθόλα 78 : Γεκηνπξγία Fragment ην παξάζπξν πνπ αλνίγεη θαζνξίδνπκε ην όλνκα ηεο θιάζεο. Θα ηελ νλνκάζνπκε FragmentOne, όπσο είρακε νλνκαηίζεη ην fragment ζηελ activity_main.xml. Δηθόλα 79 : Γεκηνπξγία θιάζεο FragmentOne -70-

82 θώδηθα Αθνύ δεκηνπξγήζνπκε ην αξρείν, ην αλνίγνπκε θαη πξνζζέηνπκε ηνλ αθόινπζν package com.example.fragments; import android.app.fragment; import android.os.build; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class FragmentOne extends Fragment public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) { return inflater.inflate( R.layout.fragment_one, container, false); Οπζηαζηηθά ην κνλαδηθό πνπ ηνπ ιέκε είλαη όηη όηαλ δεκηνπξγείηαη ην view ην layout πνπ ζα πεξηιακβάλεη είλαη ην fragment_one. Με ηνλ ίδην ηξόπν δεκηνπξγνύκε θαη ην αξρείν FragmentTwo, ζην νπνίν δειώλνπκε όηη ην layout πνπ ζα πεξηιακβάλεη είλαη ην fragment_two. ηελ ζπλέρεηα αλνίγνπκε ην αξρείν MainActivity.java θαη πξνζζέηνπκε ηνλ θώδηθα γηα ηελ κέζνδν selectfrag() πνπ έρνπκε δειώζεη σο event ζηα θνπκπηά. public void selectfrag(view view) { Fragment fr; if(view == findviewbyid(r.id.button2)) { fr = new FragmentTwo(); else { fr = new FragmentOne(); FragmentManager fm = getfragmentmanager(); FragmentTransaction fragmenttransaction = fm.begintransaction(); fragmenttransaction.replace(r.id.fragment_place, fr); fragmenttransaction.commit(); Η "δνπιεηά" ηεο ζπγθεθξηκέλεο κεζόδνπ είλαη λα βξίζθεη από πην θνπκπί ήξζε ε θιήζε θαη κε ηελ βνήζεηα ηεο FragmentTransaction, λα εκθαλίδεη ζην Fragment πνπ δειώζακε ζηελ activity_main.xml ην αληίζηνηρν Fragment. -71-

83 H θιάζε FragmentManager καο δίλεη ηελ δπλαηόηεηα λα αιιειεπηδξάζνπκε κε ηα Fragments κέζα ζε έλα activity. Αληίζηνηρα ε θιάζε FragmentTransaction λα θάλνπκε νπνηαδήπνηε αιιαγή ζέινπκε ζηα fragments, ηελ ώξα πνπ ην activity εθηειείηαη. Μεηά από θάζε αιιαγή πνπ πξαγκαηνπνηνύκε ζα πξέπεη λα θάλνπκε commit(), ώζηε λα γίλεηαη αληηιεπηή ζηνλ ρξήζηε. Αλ ηώξα ηξέμνπκε ηελ εθαξκνγή, ζα δνύκε όηη ε αξρηθή νζόλε ηεο εθαξκνγήο είλαη ην fragment_one, όπσο άιισζηε είρακε νξίζεη. Δηθόλα 80 : Αξρηθή νζόλε εθαξκνγήο θηηάμακε. Παηώληαο ην θνπκπί "FragmentNo.2" θνξηώλεηαη ην δεύηεξν fragment πνπ -72-

84 Δηθόλα 81: Σν fragment_one έρεη αληηθαηαζηαζεί από ην fragment_two -73-

85

86 7 Απνζήθεπζε Γεδνκέλσλ Οη πεξηζζόηεξεο Android εθαξκνγέο πξέπεη λα απνζεθεύνπλ δεδνκέλα, αθόκα θαη αλ σο απνζήθεπζε λνείηαη ε απνζήθεπζε πιεξνθνξηώλ ζρεηηθά κε ηελ θαηάζηαζε ηεο εθαξκνγήο όηαλ θαιείηαη ε κέζνδνο onpause(), ώζηε λα κελ ραζεί ε πξόνδνο ηνπ ρξήζηε. Αξθεηέο εθαξκνγέο πξέπεη λα απνζεθεύνπλ ηηο ξπζκίζεηο ηνπ ρξήζηε, ελώ θάπνηεο άιιεο εθαξκνγέο δηαρεηξίδνληαη κεγαιύηεξν όγθν πιεξνθνξηώλ θαη πξέπεη λα απνζεθεύνπλ δεδνκέλα ζε αξρεία ή/θαη ζε βάζεηο δεδνκέλσλ. Οη θπξηόηεξεο επηινγέο γηα ηελ απνζήθεπζε δεδνκέλσλ ζε κηα εθαξκνγή Android είλαη: [6] Απνζήθεπζε δεύγνπο θιεηδηνύ-ηηκήο (key-value) απιώλ ηύπσλ δεδνκέλσλ ζε έλα θνηλόρξεζην αξρείν. Απνζήθεπζε απζαίξεησλ αξρείσλ ζην ζύζηεκα αξρείσλ ηνπ Android. Απνζήθεπζε ζε βάζε δεδνκέλσλ πνπ δηαρεηξίδνληαη από ηελ SQLite. 7.1 Απνζήθεπζε δεύγνπο θιεηδηνύ-ηηκήο (key-value) απιώλ ηύπσλ δεδνκέλσλ Αλ ε εθαξκνγή ζαο δηαρεηξίδεηαη έλα ζρεηηθά κηθξό αξηζκό δεπγαξηώλ θιεηδηνύηηκήο πνπ ζέιεηε λα απνζεθεύζεηε, ζα πξέπεη λα ρξεζηκνπνηεζεί ηα SharedPreferences API. Έλα SharedPreferences αληηθείκελν δείρλεη ζε έλα αξρείν πνπ πεξηέρεη δεπγάξηα θιεηδηώλ-ηηκώλ θαη παξέρεη απιέο κεζόδνπο γηα λα δηάβαζκα θαη γξάςηκν ζην αξρείν. Κάζε αξρείν δηαρεηξίδεηαη από ην framework θαη κπνξεί λα είλαη είηε ηδησηηθό (private) είηε θνηλόρξεζην (shared). Μπνξείηε λα απνθηήζεηε πξόζβαζε ζε έλα SharedPreferences ή λα δεκηνπξγήζεηε έλα θαηλνύξγην κε ηνπο εμήο δύν ηξόπνπο: a. getsharedpreferences (string name, int mode) [7] : Η ζπγθεθξηκέλε κέζνδνο ρξεζηκνπνηείηαη αλ ρξεηάδεζηε πνιιαπιά θνηλόρξεζηα αξρεία πνπ πξνζδηνξίδνληαη κε βάζε ην όλνκα, ην νπνίν κπνξείηε λα θαζνξίζεηε κε ηελ πξώηε παξάκεηξν. Η δεύηεξε παξάκεηξνο θαζνξίδεη πσο ζα αλνίμεη ην αξρείν. Οη δηαθνξεηηθέο ηηκέο πνπ κπνξεί λα πάξεη είλαη: -75-

87 i. MODE_PRIVATE [8]: Η default ηηκή. Σν αξρείν πνπ δεκηνπξγείηαη κπνξεί λα θιεζεί κόλν κέζα από ηελ ίδηα ηελ εθαξκνγή πνπ ην δεκηνύξγεζε. ii. MODE_WORLD_READABLE[9]: Σν αξρείν πνπ δεκηνπξγείηαη κπνξεί λα δηαβαζηεί από όιεο ηηο ππόινηπεο εθαξκνγέο. Η ζπγθεθξηκέλε κέζνδνο ζεσξείηαη μεπεξαζκέλε από ηελ έθδνζε 17 θαη κεηά. iii. MODE_WORLD_WRITEABLE[10]: ην αξρείν πνπ δεκηνπξγείηαη κπνξνύλ λα γξάςνπλ όιεο νη ππόινηπεο εθαξκνγέο. Η ζπγθεθξηκέλε κέζνδνο ζεσξείηαη μεπεξαζκέλε από ηελ έθδνζε 17 θαη κεηά. iv. MODE_MULTI_PROCESS[11]: όηαλ ην αξρείν αλνίγεη κε ηνλ ζπγθεθξηκέλν ηξόπν ιεηηνπξγίαο, γίλεηαη έιεγρνο ζην αξρείν αλ ππάξρνπλ νπνηεζδήπνηε ηξνπνπνηήζεηο. Απηόο ν ηξόπνο ιεηηνπξγίαο είλαη ν επηζπκεηόο όηαλ ε εθαξκνγή έρεη πνιιέο δηαδηθαζίεο (processes) πνπ όιεο γξάθνπλ ζην ίδην αξρείν. εθαξκνγήο. Μπνξείηε λα ηελ θαιέζεηε από νπνηνδήπνηε activity ηεο αξρείν [12]. b. getpreferences (int mode) : Υξεζηκνπνηείηαη κέζα από έλα activity γηα λα θαιέζεη ην θνηλόρξεζην αξρείν πνπ αλήθεη ζην ζπγθεθξηκέλν activity. Δπεηδή ε ζπγθεθξηκέλε κέζνδνο θαιεί ην default θνηλόρξεζην αξρείν ηνπ activity δελ ρξεηάδεηαη λα δώζεηε όλνκα αξρείνπ. ην επόκελν παξάδεηγκα παξνπζηάδεηαη ν ηξόπνο απνζήθεπζεο δεδνκέλσλ ζε ε έλα θαηλνύξγην project πνπ δεκηνπξγνύκε αλνίγνπκε ην activity_main.xml, πνπ βξίζθεηαη ζην θάθειν res->layout θαη πξνζζέηνπκε ζηελ θύξηα νζόλε ηεο εθαξκνγήο έλα EditText, έλα checkbox θαη έλα θνπκπί. <LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity" > <CheckBox android:id="@+id/checkbox1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/checkbox" /> <EditText android:id="@+id/edittext1" android:layout_width="match_parent" -76-

88 android:layout_height="wrap_content" <requestfocus/> </EditText> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="save" /> </LinearLayout> Πεξλάκε ηα ιεθηηθά ζην string resource αξρείν strings.xml, θαη ηα αληηθαζηζηνύκε ζηνλ θώδηθα. Δάλ ηξέμνπκε ηώξα ηελ εθαξκνγή καο, ε νζόλε καο πιένλ είλαη ε εμήο: Δηθόλα 82 : Αξρηθή νζόλε εθαξκνγήο ην αξρείν MainActivity.java πξνζζέηνπκε ηνλ θώδηθα πνπ δεκηνπξγεί ην αξρείν, θαη απνζεθεύεη ηηο δηάθνξεο ηηκέο. public class MainActivity extends Activity implements OnClickListener { CheckBox checkbox; EditText edittext; Button protectedvoidoncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); checkbox = (CheckBox) findviewbyid(r.id.checkbox1); edittext = (EditText) findviewbyid(r.id.edittext1); -77-

89 button = (Button) findviewbyid(r.id.button1); button.setonclicklistener(this); loadsavedpreferences(); privatevoid loadsavedpreferences() { SharedPreferences sharedpreferences =getpreferences(mode_private); boolean checkboxvalue = sharedpreferences.getboolean("checkbox_value",false); String name = sharedpreferences.getstring("storedname", "YourName"); if (checkboxvalue) { checkbox.setchecked(true); else { checkbox.setchecked(false); edittext.settext(name); ηελ OnCreate() νξίδνπκε ηα αληηθείκελα ζηα νπνία αλαθέξνληαη νη ηξεηο κεηαβιεηέο πνπ έρνπκε (checkbox, edittext, button) θαη ην event ζην button, γηα λα απνζεθεύζνπκε ηηο επηινγέο καο. ηελ loadsavedpreferences(), αλνίγνπκε ην ηνπηθό αξρείν θαη ςάρλνπκε λα βξνύκε αλ ππάξρεη απνζεθεπκέλε ηέηνηα κεηαβιεηή ζην αξρείν. Αλ ππάξρεη δηαβάδνπκε ηελ ηηκή ηεο, αλ δελ ππάξρεη δίλνπκε κηα default ηηκή. ηελ ζπλέρεηα έρνπκε δπν SavePreferences, ε κηα απνζεθεύεη ηελ ηηκή ηνπ checkbox θαη ε άιιε ηελ ηηκή ηνπ edittext. ην eventonclick(view) ηνπ button, αλάινγα κε ηηο επηινγέο πνπ έρεη θάλεη ν ρξήζηεο, ζώδνληαη θαη νη αληίζηνηρεο ηηκέο. private void savepreferences(string key, boolean value) { SharedPreferences sharedpreferences =getpreferences(mode_private); Editor editor = sharedpreferences.edit(); editor.putboolean(key, value); editor.commit(); private void savepreferences(string key, String value) { SharedPreferences sharedpreferences = getpreferences(mode_private); Editor editor = sharedpreferences.edit(); editor.putstring(key, value); public void onclick(view v) { // TODO Auto-generated method stub savepreferences("checkbox_value", checkbox.ischecked()); if (checkbox.ischecked()) savepreferences("storedname", edittext.gettext().tostring()); finish(); -78-

90 σο εμήο: Δάλ ηώξα μαλαηξέμνπκε ην πξόγξακκα θαη ζηελ νζόλε ζέηνπκε ηηκέο Δηθόλα 83 : Οζόλε εθαξκνγήο Δάλ παηήζνπκε ηώξα Save θαη μαλαλνίμνπκε ηελ εθαξκνγή, ζα δνύκε όηη νη ηηκέο πνπ ζέζακε απνζεθεύηεθαλ θαη εκθαλίδνληαη πιένλ σο default. -79-

91 7.2 Απνζήθεπζε Αξρείσλ Σν Android ρξεζηκνπνηεί έλα ζύζηεκα αξρείσλ παξόκνην κε ην ζύζηεκα αξρείσλ βαζηζκέλν ζε δίζθνπο πνπ ρξεζηκνπνηνύλ άιιεο πιαηθόξκεο. Έλα αληηθείκελν File είλαη θαηάιιειν γηα αλάγλσζε ή απνζήθεπζε κεγάινπ όγθνπ δεδνκέλσλ, ζε ζπλερόκελε ζεηξά από ηελ αξρή πξνο ην ηέινο. Απηή ε κέζνδνο είλαη θαιή γηα απνζήθεπζε π.ρ. εηθόλσλ ή γηα νηηδήπνηε αληαιιάζζεηαη κέζα ζε έλα δίθηπν Δπηινγή εζσηεξηθήο (Internal) ή εμσηεξηθήο (External) απνζήθεπζεο Όιεο νη Android ζπζθεπέο έρνπλ δύν ρώξνπο απνζήθεπζεο αξρείσλ: ηελ "εζσηεξηθή" θαη ηελ "εμσηεξηθή". Απηά ηα νλόκαηα πξνέξρνληαη από ηηο πξώηεο εκέξεο ηνπ Android, όηαλ νη πεξηζζόηεξεο ζπζθεπέο είραλ κηα κλήκε ζηελ ζπζθεπή (εζσηεξηθή internal απνζήθεπζε), ελώ παξάιιεια κπνξνύζαλ λα δερζνύλ θαη έλα αθαηξνύκελν κέζν απνζήθεπζεο όπσο κηα θάξηα microsd (εμσηεξηθή external απνζήθεπζε). Μεξηθέο ζπζθεπέο ρσξίδνπλ ηνλ κόληκν απνζεθεπηηθό ρώξν ζε internal θαη external, έηζη ώζηε αθόκε θαη ρσξίο έλα αθαηξνύκελν κέζν απνζήθεπζεο, λα ππάξρνπλ πάληα δύν ρώξνη απνζήθεπζεο. Η ζπκπεξηθνξά ησλ API είλαη ε ίδηα, είηε ε εμσηεξηθή απνζήθεπζε είλαη θάπνηνο αθαηξνύκελνο δίζθνο είηε όρη. Ο παξαθάησ πίλαθαο ζπλνςίδεη ηα δεδνκέλα γηα θάζε ρώξν απνζήθεπζεο. Internal storage External storage Πάληα δηαζέζηκε Σα αξρεία πνπ απνζεθεύνληαη εδώ είλαη πξνζβάζηκα κόλν από ηελ ζπγθεθξηκέλε εθαξκνγή Όηαλ ν ρξήζηεο θαηαξγεί ηελ εθαξκνγή, δηαγξάθνληαη θαη όια ηα ζπζρεηηδόκελα αξρεία. Μπνξεί λα κελ είλαη πάληα δηαζέζηκε, γηαηί ν ρξήζηεο κπνξεί λα ηελ έρεη αθαηξέζεη από ηελ ζπζθεπή. Δίλαη πξνζβάζηκε από ηνλ θαζέλα, νπόηε ηα αξρεία ζαο κπνξεί λα δηαβαζηνύλ από νπνηαδήπνηε εθαξγνή. Όηαλ ν ρξήζηεο θαηαξγεί ηελ εθαξκνγή, δελ είλαη βέβαην όηη ζα δηαγξαθνύλ θαη όια ηα -80-

92 ζπζρεηηδόκελα αξρεία, αιιά κόλν όζα είλαη απνζεθεπκέλα ζε θάθειν πνπ βξίζθεηαη πνπ κπνξεί λα δηαβαζηεί κε ηελ εληνιή getexternalfilesdir(). Ωο ζπκπέξαζκα ε απνζήθεπζε ησλ αξρείσλ ζε εζσηεξηθή κλήκε είλαη θαιύηεξε πξαθηηθή όηαλ ζέιεηε λα κελ έρεη θαλείο πξόζβαζε ζηα αξρεία, νύηε ν ρξήζηεο νύηε άιιε εθαξκνγή. Αληηζέησο αλ ζέιεηε ν ρξήζηεο λα κπνξεί λα δηαβάζεη ηα αξρεία ζε έλαλ ππνινγηζηή ή ηα ρξεζηκνπνηνύλ ηα ίδηα αξρεία κε ηελ εθαξκνγή ζαο θαη άιιεο εθαξκνγέο, ηόηε ε θαιύηεξε ιύζε είλαη ε εμσηεξηθή απνζήθεπζε Απνζήθεπζε θαη αλάγλσζε από εζσηεξηθή απνζήθεπζε (internalstorage) Αο δνύκε ηώξα πσο κπνξνύκε λα απνζεθεύζνπκε θαη λα δηαβάζνπκε από ηελ internalstorage ηεο ζπζθεπήο. Γεκηνπξγνύκε έλα λέν project, ζην νπνίν ζα έρνπκε έλα edittext θαη δύν buttons. Με ην πξώην button ζα απνζεθεύνπκε ηα δεδνκέλα θαη κε ην δεύηεξν button ζα ηα δηαβάδνπκε από ην αξρείν. Γηα λα δεκηνπξγήζνπκε ην ζπγθεθξηκέλν layout, ρξεηάδεηαη λα γξάςνπκε ζην activity_main.xml ηνλ παξαθάησ θώδηθα.[13] <RelativeLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:layout_margintop="182dp" android:onclick="save" /> <Button android:layout_width="wrap_content" -81-

93 android:layout_height="wrap_content" android:layout_margintop="46dp" android:onclick="read" /> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparenttop="true" android:layout_margintop="23dp" android:ems="10" android:inputtype="textmultiline" > <requestfocus/> </EditText> Βιέπνπκε όηη ζην button1, πνπ είλαη ην Save, έρνπκε νξίζεη όηη ζην click ζα ηξέρεη ε κέζνδνο save, ε νπνία είλαη γξακκέλε ζηo αξρείν MainActivity.java, ζην θάθειν src com.example.com.internal_storage. Αληίζηνηρα ζην δεύηεξν θνπκπί ηξέρεη ε κέζνδνο read. ην αξρείν MainActivity.java ν θώδηθαο πνπ ρξεηάδεηαη είλαη ν αθόινπζνο public class MainActivity extends Activity { private EditText edittext; private String data; private String file = protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); edittext = (EditText) (findviewbyid(r.id.edittext1)); public void save(view view) { data = edittext.gettext().tostring(); try { FileOutputStream fout =openfileoutput(file,mode_private); fout.write(data.getbytes()); fout.close(); Toast.makeText(getBaseContext(), "file saved",toast.length_long).show(); catch (Exception e) { e.printstacktrace(); public void read(view view) { try { FileInputStream fin=openfileinput(file); int c; String temp =""; while((c=fin.read())!=1){ -82-

94 temp=temp +Character.toString((char)c); edittext.settext(temp); Toast.makeText(getBaseContext(), "file read",toast.length_long).show(); catch (Exception e) { ηελ oncreate() νξίδνπκε ε κεηαβιεηή edittext ζε πνην EditText ηεο εθαξκνγήο ζα αλαθέξεηαη. Η κέζνδνο save απνζεθεύεη ζην αξρείν ην θείκελν πνπ έρνπκε γξάςεη ζην EditText, ελώ ε read δηαβάδεη ην πεξηερόκελν ηνπ αξρείνπ θαη ην εκθαλίδεη ζην EditText. Όηαλ ηξέμνπκε ηελ εθαξκνγή, ε νζόλε πνπ βιέπνπκε είλαη ε εμήο Δηθόλα 84 : Αξρηθή νζόλε εθαξκνγήο Γξάθνπκε ζην edittext ην θείκελν πνπ ζέινπκε θαη παηάκε ην πξώην θνπκπί. -83-

95 επηβεβαίσζεο Δηθόλα 85 : Δηζαγσγή θεηκέλνπ γηα απνζήθεπζε Όηαλ νινθιεξσζεί ε απνζήθεπζε ζην αξρείν εκθαλίδεηαη ην κήλπκα Δηθόλα 86 : Δκθάληζε κελύκαηνο επηβεβαίσζεο απνζήθεπζεο -84-

96 Αλ ηώξα ζβήζνπκε ην θείκελν θαη παηήζνπκε ην δεύηεξν θνπκπί, ην θείκελν πνπ κόιηο απνζεθεύζακε ζα μαλαεκθαληζηεί ζην edittext, καδί ην αληίζηνηρν κήλπκα Δηθόλα 87 : Γηάβαζκα αξρείνπ από εζσηεξηθή κλήκε Απνζήθεπζε θαη αλάγλσζε από εμσηεξηθή απνζήθεπζε (externalstorage) Σν πξώην πξάγκα πνπ ζα πξέπεη λα θάλνπκε όηαλ ε εθαξκνγή καο ζα ρξεζηκνπνηεί εμσηεξηθή απνζήθεπζε είλαη λα ην νξίζνπκε ζην AndroidManifest.xml Δηθόλα 88 : Γηαδξνκή αξρείνπ AndroidManifest.xml -85-

97 γξακκή. Μέζα ζηνλ θώδηθα ηνπ αξρείνπ κεηά ην <uses-sdk>πξνζζέηνπκε ηελ ηνληζκέλε <uses-permissionandroid:name="android.permission.write_external_storage"/> Έζησ όηη ζέινπκε λα απνζεθεύνληαη ηα δεδνκέλα καο ζηελ microsd θάξηα ηεο ζπζθεπήο. Σν πξώην πξάγκα πνπ ζα πξέπεη λα ειέγρνπκε είλαη όηη ε microsd είλαη δηαζέζηκε. ηνλ πξνεγνύκελν θώδηθα πνπ γξάςακε ζην MainActivity.java πξνζζέηνπκε ηηο δπν επόκελεο κεζόδνπο. public boolean isexternalstoragewritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; return false; public boolean isexternalstoragereadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; return false; ηελ πξώηε κέζνδν ειέγρνπκε αλ κπνξνύκε λα γξάςνπκε ζηελ εμσηεξηθή κνλάδα απνζήθεπζεο. Γηαβάδνπκε ηελ θαηάζηαζε ζηελ νπνία βξίζθεηαη ε εμσηεξηθή κνλάδα απνζήθεπζεο θαη εάλ ε θαηάζηαζε πνπ ζα επηζηξέςεη (state) είλαη MEDIA_MOUNTED ζεκαίλεη όηη κπνξνύκε θαη λα γξάςνπκε θαη λα δηαβάζνπκε από ηελ ζπγθεθξηκέλε κνλάδα. ηελ δεύηεξε κέζνδν ειέγρνπκε αλ κπνξνύκε λα δηαβάζνπκε από ηελ εμσηεξηθή κνλάδα απνζήθεπζεο. Γηαβάδνπκε ηελ θαηάζηαζε ζηελ νπνία βξίζθεηαη θαη εάλ ε θαηάζηαζε πνπ ζα επηζηξέςεη (state) είλαη MEDIA_MOUNTED ή MEDIA_MOUNTED_READ_ONLY ζεκαίλεη όηη κπνξνύκε λα δηαβάζνπκε από ηελ ζπγθεθξηκέλε κνλάδα. Τπάξρνπλ δπν ηξόπνη λα απνζεθεύζνπκε αξρεία ζε externalstorage. Ο έλαο ηξόπνο είλαη ηα αξρεία πνπ απνζεθεύνληαη λα είλαη κόλν γηα ηελ εθαξκνγή καο (private) θαη ν άιινο είλαη λα έρνπλ πξόζβαζε ζε απηά ν ρξήζηεο ή άιιεο εθαξκνγέο (public). Δάλ ζέινπκε λα ζώζνπκε public αξρεία ηόηε θαινύκε ηελ getexternalstoragepublicdirectory(). ε αληίζεηε πεξίπησζε ρξεζηκνπνηνύκε ηελ -86-

98 getexternalfilesdir(). ε απηή ηελ πεξίπησζε, ηα αξρεία πνπ ζα δεκηνπξγήζνπκε ζα δηαγξαθνύλ όηαλ ν ρξήζηεο απεγθαηαζηήζε ηελ εθαξκνγή. Αιιάδνπκε ηελ κέζνδν save πνπ είρακε γξάςεη πην πξηλ ώζηε πιένλ λα απνζεθεύεη ζε εμσηεξηθή κλήκε. public void save(view view) { data = edittext.gettext().tostring(); try { if (isexternalstoragewritable()) { File myfile = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), "tempfile"); FileOutputStream fout = new FileOutputStream(myFile); OutputStreamWriter myoutwriter = newoutputstreamwriter(fout); fout.write(data.getbytes()); fout.close(); Toast.makeText(getBaseContext(), "file saved", Toast.LENGTH_SHORT).show(); else { Toast.makeText(getBaseContext(), "not writable external storage", Toast.LENGTH_SHORT).show(); catch (Exception e) { e.printstacktrace(); ε απηή ηελ πεξίπησζε απνζεθεύνπκε έλα θνηλόρξεζην αξρείν ζηνλ θάθειν ησλ Documents. Αληίζηνηρα ε κέζνδνο read είλαη ηεο κνξθήο: public void read(view view) { try { if (isexternalstoragereadable()) { File myfile = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), "tempfile"); FileInputStream fin = new FileInputStream(myFile); int c; DataInputStream in = new DataInputStream(fin); BufferedReader br = new BufferedReader(new InputStreamReader(in)); String temp = ""; while ((c = br.read())!= -1) { temp = temp + Character.toString((char) c); in.close(); edittext.settext(temp); Toast.makeText(getBaseContext(), "file read", Toast.LENGTH_SHORT).show(); else { Toast.makeText(getBaseContext(), "not readable external Storage", Toast.LENGTH_SHORT).show(); catch (Exception e) { -87-

99 7.3 Απνζήθεπζε ζε βάζε δεδνκέλσλ Η απνζήθεπζε ζε κηα βάζε δεδνκέλσλ είλαη ε ηδαληθή ιύζε όηαλ ηα δεδνκέλα ηεο εθαξκνγήο είλαη επαλαιακβαλόκελα ή δνκεκέλα, όπσο παξαδείγκαηνο ράξηλ όηαλ ζέινπκε λα έρνπκε απνζεθεπκέλν ην ηνπ ρξήζηε. Η βάζε δεδνκέλσλ πνπ ρξεζηκνπνηείηαη είλαη ε SQLite, ελώ όια ηα APIs πνπ ρξεηάδνληαη βξίζθνληαη παθέην android.database.sqlite. [14] Μία από ηηο βαζηθόηεξεο αξρέο κηαο βάζεο είλαη ην schema, κηα επίζεκε δήισζε γηα ην πσο είλαη νξγαλσκέλε ε βάζε. Σν schema αληηθαηνπηξίδεηαη ζηα SQL statements πνπ ρξεζηκνπνηείηαη γηα λα δεκηνπξγήζεηε ηελ βάζε. Υξήζηκν είλαη λα γξάςνπκε κηα άιιε θιάζε, γλσζηή θαη σο contract class, ζηελ νπνία δειώλεηαη απνθιεηζηηθά ην schema ηεο βάζεο κε έλα ζπζηεκαηηθό θαη ηεθκεξησκέλν ηξόπν. Η contract class πεξηιακβάλεη ζηαζεξέο πνπ νξίδνπλ νλόκαηα γηα ηα URIs, ηνπο πίλαθεο θαη ηηο θνιώλεο ησλ πηλάθσλ. Η ζπγθεθξηκέλε θιάζε καο επηηξέπεη λα ρξεζηκνπνηνύκε ηα ίδηα νλόκαηα ησλ ζηαζεξώλ ζε όιεο ηηο θιάζεο ηνπ ίδηνπ παθέηνπ. Απηό καο επηηξέπεη π.ρ. λα αιιάμνπκε ην όλνκα κηαο θνιώλαο ζε κηα θιάζε, θαη ην όλνκα απηό λα "δηαδνζεί" ζε όιν ηνλ θώδηθά ζαο. Γεκηνπξγνύκε έλα θαηλνύξγην project θαη έζησ όηη ζέινπκε ε εθαξκνγή καο λα θξαηάεη ζε κηα βάζε ηνπο ππαιιήινπο κηαο εηαηξείαο.[16] Υξεηάδεηαη λα δεκηνπξγήζνπκε έλα κηα contract θιάζε γηα ηνλ πίλαθα Employees. ην θάθειν src com.example.sqlite_example -88-

100 Δηθόλα 89 : Γηαδξνκή ζηελ νπνία ζα δεκηνπξγήζνπκε ην αξρείν δεκηνπξγνύκε έλα αξρείν ηύπνπ class Δηθόλα 90 : Γεκηνπξγία αξρείνπ ην νπνίν νλνκάδνπκε EmployeeContract.java Δδώ δειώλνπκε ηα ζηαζεξέο πνπ ζα νξίδνπλ ην όλνκα ηνπ πίλαθα θαη ηα νλόκαηα ησλ ζηειώλ. package com.example.com.sqlite; import android.provider.basecolumns; public final class EmployeeContract { public EmployeeContract() { public static abstractclass Employees implements BaseColumns { public static final String TABLE_NAME = "Employees"; public static final String COLUMN_ENTRY_ID = "employeeid"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_AGE = "age"; public static final String COLUMN_PREV_EXPERIENCE = "prevexperience"; -89-

101 Δδώ νξίζακε όηη ν πίλαθαο ζα ιέγεηαη Employees θαη ζα έρεη ηέζζεξηο ζηήιεο, ηηο employeeid, name, age θαη prevexperience. ηνλ ίδην θάθειν δεκηνπξγνύκε αθόκα έλα αξρείν Java, ην νπνίν νλνκάδνπκε EmployeesDbHelper. ε απηό ην αξρείν ζα γξάςνπκε ηνλ θώδηθα πνπ ρξεηάδεηαη γηα ηελ δεκηνπξγία ηνπ πίλαθα, ην update ηνπ πίλαθα, ηελ εηζαγσγή δεδνκέλσλ, ηελ δηαγξαθή δεδνκέλσλ, θαη γεληθά νηηδήπνηε έρεη ζρέζε κε ηελ επηθνηλσλία ηεο εθαξκνγήο κε ηελ βάζε. Έλα πνιύ ρξήζηκν ζύλνιν APIs είλαη ε θιάζε SQLiteOpenHelper. Όηαλ ρξεζηκνπνηείηαη απηή ε θιάζε γηα λα αλαθεξζείηε ζηελ βάζε ζαο, ην ζύζηεκα εθηειεί ηηο ρξνλνβόξεο δηαδηθαζίεο ηεο δεκηνπξγίαο θαη αλαβάζκηζεο ηεο εθαξκνγήο κόλν όηαλ ρξεηάδεηαη θαη όρη θάζε θνξά πνπ μεθηλάεη ε εθαξκνγή. Σν κόλν πνπ ρξεηάδεηαη λα θάλεηε είλαη λα θαιέζεηε ηηο κεζόδνπο getwritabledatabase() ή getreadabledatabase(), αλάινγα γηα πνην ιόγν ζέιεηε λα θαιέζεηε ηελ βάζε. Γηα λα ρξεζηκνπνηεζεί ε SQLiteOpenHelper, ην κόλν πνπ ρξεηάδεηαη είλαη ε επόκελε γξακκή θώδηθα ζηελ δήισζε ηεο θιάζεο. public class EmployeesDbHelper extends SQLiteOpenHelper { Ωο κεηαβιεηέο δειώλνπκε δηάθνξεο παξακέηξνπο, όπσο ε έθδνζε ηεο βάζεο, ην όλνκα ηεο βάζεο, ελώ κπνξνύκε λα δειώζνπκε σο παξακέηξνπο θαη ην SQLstatement πνπ ζα ηξέμεη όηαλ ζα ρξεηαζηεί λα δεκηνπξγεζεί ν πίλαθαο ή αλ ρξεηαζηεί λα δηαγξαθεί ν πίλαθαο. public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "Employees.db"; private static final String TEXT_TYPE = " TEXT"; private static final String COMMA_SEP = ","; private static final String INT_TYPE = " INTEGER"; private static final String SQL_CREATE_EMPLOYEES = "CREATE TABLE " + Employees.TABLE_NAME + " (" + Employees._ID + INT_TYPE+" PRIMARY KEY," + Employees.COLUMN_ENTRY_ID + TEXT_TYPE + COMMA_SEP + Employees.COLUMN_NAME + TEXT_TYPE + COMMA_SEP + Employees.COLUMN_AGE + TEXT_TYPE + COMMA_SEP + Employees.COLUMN_PREV_EXPERIENCE + TEXT_TYPE + " )"; Private static final String SQL_DELETE_EMPLOYEES = "DROP TABLE IF EXISTS " + Employees.TABLE_NAME; -90-

102 Μέζα ζηνλ θώδηθα πξνζζέηνπκε ηηο εμήο κεζόδνπο public EmployeesDbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); public void oncreate(sqlitedatabase db) { db.execsql(sql_create_employees); public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql(sql_delete_employees); oncreate(db); public void ondowngrade(sqlitedatabase db, int oldversion, int newversion) { onupgrade(db, oldversion, newversion); Η EmployeesDbHelper είλαη ε constructor κέζνδνο ηεο θιάζεο, ηελ νπνία ζα θαινύκε όηαλ ζέινπκε λα απνθηήζνπκε πξόζβαζε ζηε βάζε. Η oncreate() δεκηνπξγεί ηνλ πίλαθα κε βάζε ην SQLstatementSQL_CREATE_EMPLOYEES πνπ έρνπκε δειώζεη πην πάλσ. ε πεξίπησζε πνπ έρνπκε αιιάμεη ηνλ πίλαθα, π.ρ. έρνπκε πξνζζέζεη κηα αθόκα θνιώλα, ηόηε ζα πξέπεη λα απμήζνπκε ηελ παξάκεηξν DATABASE_VERSION, λα αιιάμνπκε ην statement ηνπ SQL_CREATE_EMPLOYEES θαη λα θαιέζνπκε ηελ κέζνδν onupgrade(), ε νπνία δηαγξάθεη ηνλ πίλαθα, θαη ηνλ μαλαδεκηνπξγεί. Αληίζηνηρα όηαλ ζέινπκε λα "θαηεβάζνπκε" έθδνζε ηνλ πίλαθα, θάλνπκε ηελ ίδηα δηαδηθαζία, κόλν πνπ κεηώλνπκε ηελ παξάκεηξν DATABASE_VERSION, αιιάδνπκε ην statement ηνπ SQL_CREATE_EMPLOYEES θαη θαινύκε ηελ ondowngrade(). ηελ ζπλέρεηα πξνζζέηνπκε έλα αθόκε αξρείν ηύπνπ java class κε ην Employee. ε απηό ην αξρείν ζα δειώζνπκε κηα θιάζε Employee, ζηελ νπνία σο κεηαβιεηέο ζα έρνπκε ην ID, ην name, ην age θαη ην prevexperience. int _id; String _name; int _age; int _prevexperience; Η θιάζε ζα πεξηέρεη έλαλ constructor ζηνλ νπνίν ζα ζέηνπκε ζηηο κεηαβιεηέο απηέο ηηο ηηκέο πνπ ζέινπκε. public Employee(String Name,int Age,int Dept) { this._name=name; this._age=age; this._prevexperience=dept; -91-

103 Έηζη κε απηό ηνλ ηξόπν ζα κπνξνύκε λα κπνξνύκε λα απνζεθεύνπκε, λα δηαγξάθνπκε ή λα θάλνπκε update ην αληηθείκελν Employee, ην νπνίν ζα πεξηέρεη ηηο ηηκέο πνπ ζέινπκε. Δπίζεο γηα θάζε κηα κεηαβιεηή πνπ έρνπκε, δεκηνπξγνύκε κηα κέζνδν get θαη κηα set. Με ηελ κέζνδν get παίξλνπκε ηελ ηξέρνπζα ηηκή ηεο αληίζηνηρεο κεηαβιεηήο ελώ κε ηελ κέζνδν set ζέηνπκε ηηκή ζηελ ηξέρνπζα κεηαβιεηή. Αλ π.ρ. ζέινπκε λα αιιάμνπκε ηελ ειηθία ελόο εξγαδνκέλνπ, ηόηε θαινύκε ηελ κέζνδν setage(int Age), ε νπνία ζέηεη ζηελ κεηαβιεηή _age ηελ ηηκή ηεο Age, πνπ έρνπκε πεξάζεη. Αλ κεηά εθηειέζνπκε θώδηθα πνπ θάλεη update ζηελ βάζε, ηόηε ζηνλ ήδε ππάξρνλ Employee, ζα πάεη θαη ζα αιιάμεη ηελ ηηκή ηεο ζηήιεο Age. Public int getid() { Return this._id; Public void SetID(int ID) { this._id=id; public String getname() { Return this._name; Public void setname(string Name) { this._name=name; Public int getage() { Return this._age; public void setage(int Age) { this._age=age; Public int getprevexperience() { Return this._prevexperience; Public void setprevexperience(int prevexperience) { this._prevexperience=prevexperience; -92-

104 Μεηά ηελ δεκηνπξγία ηεο θιάζεο Employee, επηζηξέθνπκε ζην αξρείν EmployeeDbHelper θαη πξνζζέηνπκε ηηο δπν επόκελεο κεζόδνπο. void AddEmployee(Employee emp) { SQLiteDatabase db = this.getwritabledatabase(); ContentValues cv = new ContentValues(); cv.put(employees.column_name, emp.getname()); cv.put(employees.column_age, emp.getage()); cv.put(employees.column_name, emp.getprevexperience()); db.insert(employees.table_name, Employees.COLUMN_PREV_EXPERIENCE, cv); db.close(); int getemployeecount() { SQLiteDatabase db=this.getreadabledatabase(); Cursor cur= db.rawquery("select * from "+Employees.TABLE_NAME, null); int x= cur.getcount(); cur.close(); return x; Η κέζνδνο AddEmpoyee(Employeeemp) πξνζζέηεη ζηνλ πίλαθα κηα εγγξαθή. Σα δεδνκέλα γηα ηελ εηζαγσγή ηα παίξλεη από ην αληηθείκελν emp ηύπνπ Employee, πνπ ηηο δίλνπκε. Από ηελ ζηηγκή πνπ ζέινπκε λα γξάςνπκε ζηελ βάζε θαινύκε ηελ κέζνδν getwritabledatabase(). Η θιάζε ContentValues είλαη κηα θιάζε ε νπνία ρξεζηκνπνηείηαη γηα ηελ απνζήθεπζε δεπγαξηώλ θιεηδηώλ-ηηκώλ. ην ζπγθεθξηκέλν παξάδεηγκα ζην θιεηδί Employees.COLUMN_NAME απνζεθεύεηαη ε ηηκή πνπ έρεη ε κεηαβιεηή _Name ηεο θιάζεο Employees, ηηκή πνπ παίξλνπκε κε ηελ βνήζεηα ηεο κεζόδνπο getname(). Με ηνλ ίδην ηξόπν απνζεθεύνπκε ηηο ηηκέο γηα όιεο ηα πεδία. Γηα ηελ εηζαγσγή ζηνλ πίλαθα ρξεζηκνπνηνύκε ηελ κέζνδν insert. Η ζπγθεθξηκέλε κέζνδνο δέρεηαη 3 νξίζκαηα. Σν πξώην όξηζκα είλαη ην όλνκα ηνπ πίλαθα ζηνλ νπνίν ζα γίλεη ε εηζαγσγή. Σν δεύηεξν είλαη ην όλνκα ηεο ζηήιεο, ζηελ νπνία ην framework κπνξεί λα εηζάγεη ηελ ηηκή NULL, όηαλ ε θιάζε ContentValues δελ πεξηέρεη ηηκέο. ε πεξίπησζε πνπ ε παξάκεηξνο έρεη ηελ ηηκή null, δελ γίλεηαη εηζαγσγή γξακκήο ρσξίο ε ContentValues λα πεξηέρεη ηηκή. Η ηειεπηαία κεηαβιεηή είλαη ε ContentValuesκε ηηο ηηκέο πνπ ζα εηζαρζνύλ. Η κέζνδνο getemployeecount() δηαβάδεη από ηελ βάζε ηνλ αξηζκό ησλ εγγξαθώλ, θαη επηζηξέθεη ην πιήζνο ηνπο. Δπεηδή απιά δηαβάδεη θαη δελ γξάθεη ζηελ βάζε, αλνίγνπκε κηα ζύλδεζε κε ηελ βάζε θαιώληαο ηελ κέζνδνgetreadabledatabase(). Η εληνιή rawquery εθηειεί ηελ εληνιή πνπ ζα ηεο -93-

105 δώζνπκε, θαη επηζηξέθεη έλαλ θέξζνξα (Cursor) πάλσ ζην ζύλνιν ησλ απνηειεζκάησλ. Η εληνιή δέρεηαη δύν νξίζκαηα. Σν πξώην είλαη ην query πνπ ζα εθηειέζεη. Σν δεύηεξν όξηζκα είλαη έλαο πίλαθαο από string, ζηνλ νπνίν έρνπκε ηηο ηηκέο γηα ηηο παξακέηξνπο πνπ ηπρόλ έρνπκε ζε έλα wherestatement. Οη παξάκεηξνη δειώλνληαη κε ηνλ ραξαθηήξα "?". Δάλ γηα παξάδεηγκα ζέιακε λα καο επηζηξέθεη ην πιήζνο ησλ εγγξαθώλ πνπ έρνπλ πξνϋπεξεζία 5 έηε, ηόηε ε rawquery ζα ήηαλ ηεο εμήο κνξθήο. Cursor cur= db.rawquery("select * from "+Employees.TABLE_NAME + "where "+Employees.COLUMN_PREV_EXPERIENCE+"=?", newstring[]{string.valueof(5)); εγγξαθώλ. Αθνύ έρνπκε ηνλ θέξζνξα, κε ηελ εληνιή getcount() παίξλνπκε ην πιήζνο ησλ Αθνύ νινθιεξώζακε ηηο βνεζεηηθέο java classes, ηώξα πάκε λα δεκηνπξγήζνπκε ην layout ηεο εθαξκνγήο. Σν layout ζα απνηειείηαη από ηξία EditText, ζηα νπνία ζα γξάθνπκε ην όλνκα ηνπ εξγαδνκέλνπ, ηελ ειηθία ηνπ θαη ηελ πξνεγνύκελε εκπεηξία ηνπ. Δπίζεο ζα πξνζζέζνπκε θαη έλα θνπκπί, ώζηε λα γίλεηαη ε απνζήθεπζε. Γηα λα βιέπνπκε πόζνπο εξγαδνκέλνπο έρνπκε θαηαρσξεκέλνπο ζα έρνπκε έλα αθόκε TextView, ζην νπνίν ζα εκθαλίδεηαη ν αξηζκόο ησλ εξγαδνκέλσλ πνπ βξίζθνληαη ζηελ βάζε. Πξηλ από θάζε EditText, έρνπκε έλα TextView, ην νπνίν ρξεζηκεύεη σο label ηνπ πεδίνπ, ώζηε λα μέξεη ν ρξήζηεο πνην πεδίν ζπκπιεξώλεη. Σα ιεθηηθά ζα πξέπεη λα ηα πεξάζνπκε ζην strings.xml (res values strings.xml) θαη ζηελ παξάκεηξν text ησλ TextView ζα ζέζνπκε ηελ αληίζηνηρε ηηκή από ην ζπγθεθξηκέλν αξρείν. <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/employee_name" /> <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/txtname" android:inputtype="textpersonname" /> <TextView android:layout_width="wrap_content" -94-

106 android:layout_height="wrap_content" /> <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:inputtype="number" android:digits=" " android:singleline="true" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:inputtype="number" android:digits=" " android:singleline="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onclick="btnaddemp_click" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> ηνλ πξνεγνύκελν θώδηθα βιέπνπκε όηη ζην πεδίν Name δειώλνπκε όηη έρεη inputtypepersonname, ελώ αληίζηνηρα ζην πεδίν Age όηη ην inputtype είλαη αθέξαηνο (integer ) θαη νη επηηξεπηέο ηηκέο είλαη νη ραξαθηήξεο 0,1,2,3,4,5,6,7,8 ή/θαη 9. Με αληίζηνηρν ηξόπν δειώλνπκε ην πεδίν γηα ηελ θαηαρώξεζε ηεο πξνεγνύκελεο πξνϋπεξεζίαο, θαζώο επίζεο θαη ηνπ θνπκπηνύ θαηαρώξεζεο θαη ηνπ πεδίνπ εκθάληζεο ηνπ αξηζκνύ ησλ εγγξαθώλ. ην θνπκπί έρνπκε δειώζεη όηη όηαλ παηεζεί ζα εθηειείηαη ε κέζνδνο btnaddemp_click(), ηελ νπνία ζα γξάςνπκε ζην αξρείν MainActivity.java. -95-

107 κνξθή Αλ ηώξα ηξέμνπκε ηελ εθαξκνγή ζα δνύκε όηη ην UI καο έρεη ηελ αθόινπζε Δηθόλα 91 : Αξρηθή νζόλε εθαξκνγήο ην MainActivity.java αξρείν ηώξα πξνζζέηνπκε ηνλ απαξαίηεην θώδηθα ζηελ κέζνδν btnaddemp_click(). Αξρηθά δειώλνπκε κεηαβιεηέο ηύπνπ EditText θαη EmployeesDbHelper, ηηο νπνίεο αξρηθνπνηνύκε ζηηο κεζόδνπο oncreate() θαη onstart(). EditText txtname; EditText txtage; EditText txtprevexperience; TextView txtemps; EmployeesDbHelper protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); txtname=(edittext)findviewbyid(r.id.txtname); txtage=(edittext)findviewbyid(r.id.txtage); txtemps=(textview)findviewbyid(r.id.txtemps); protected void onstart(){ super.onstart(); dbhelper = new EmployeesDbHelper(this); -96-

108 ηελ ζπλέρεηα πξνζζέηνπκε ηνλ θώδηθα ηεο κεζόδνπ onclick(). public void btnaddemp_click(view view) { boolean ok=true; try { String name=txtname.gettext().tostring(); int age=integer.valueof(txtage.gettext().tostring()); int prevexperience=integer.valueof(txtprevexperience.gettext().tostring()); Employee emp=new Employee(name,age,prevExperience); dbhelper.addemployee(emp); Catch(Exception ex) { ok=false; Toast.makeText(getApplicationContext(), "There was a problem. Operation didn't complete.", Toast.LENGTH_LONG).show(); finally { if(ok) { txtemps.settext("number of employees "+String.valueOf(dbHelper.getEmployeeCount())); Όπσο βιέπνπκε ζηνλ παξαπάλσ θώδηθα, ζηελ ζπγθεθξηκέλε κέζνδν δηαβάδνπκε ηηο ηηκέο πνπ ππάξρνπλ ζηα πεδία EditText ηεο θόξκαο, δεκηνπξγνύκε έλα λέν αληηθείκελν ηύπνπ Employee κε απηέο ηηο ηηκέο θαη ζηελ ζπλέρεηα ην αληηθείκελν ην απνζεθεύνπκε θαιώληαο ηελ κέζνδν AddEmployee ηεο θιάζεο EmployeesDbHelper. Δάλ θάηη δελ πάεη θαιά ζα εκθαληζηεί ελεκεξσηηθό κήλπκα (θώδηθαο κέζα ζην catch) αιιηώο ζα αλαλεσζεί ην θείκελν ηνπ ηειεπηαίνπ TextView, εκθαλίδνληαο ην ζπλνιηθό αξηζκό εγγξαθώλ. Αλ μαλαηξέμνπκε ηώξα ηελ εθαξκνγή, γξάςνπκε ηηο ηηκέο πνπ ζέινπκε θαη παηήζνπκε ην θνπκπί -97-

109 Δηθόλα 92 : Απνζήθεπζε εγγξαθήο ζα δνύκε όηη πξνζηέζεθε ν αξηζκόο ησλ εγγξαθώλ δίπια από ην ιεθηηθό "Numberofemployees". Δηθόλα 93 : Οζόλε εθαξκνγήο κεηά ηελ απνζήθεπζε -98-

110 7.4 Γηαγξαθή Δγγξαθώλ πίλαθα. Γηα ηελ δηαγξαθή εγγξαθώλ ρξεζηκνπνηείηαη ε κέζνδνο delete() ηεο SQLiteDatabase. Αλ π.ρ. ζέιακε λα γξάςνπκε θώδηθα πνπ δηαγξάθεη όιεο ηηο εγγξαθέο, ν θώδηθαο ζα ήηαλ ν εμήο: void DeleteEmployees(int prevexp){ SQLiteDatabase db= this.getwritabledatabase(); db.delete(employees.table_name,null,null); db.close(); Η κέζνδνο delete δέρεηαη ηξία νξίζκαηα. Σν πξώην είλαη ην όλνκα ηνπ πίλαθα. Σν δεύηεξν είλαη ην wherestatement, αλ ζέινπκε λα δηαγξάςνπκε εγγξαθέο ππό θάπνηεο πξνϋπνζέζεηο, ελώ ην ηξίην όξηζκα είλαη έλαο πίλαθαο από string, ζηνλ νπνίν έρνπκε ηηο ηηκέο γηα ηηο παξακέηξνπο πνπ ηπρόλ έρνπκε ζε έλα wherestatement. Αλ π.ρ ζέιακε λα δηαγξάςνπκε όιεο ηηο εγγξαθέο ζηηο νπνίεο ε πξνϋπεξεζία είλαη έλαο ζπγθεθξηκέλνο αξηζκόο, ηόηε ε πξνεγνύκελε κέζνδνο ζα γξαθόηαλ σο εμήο: void DeleteEmployees(int prevexp){ SQLiteDatabase db= this.getwritabledatabase(); db.delete(employees.table_name,employees.column_prev_experience+"=?", new String[]{String.valueOf(prevExp)); db.close(); -99-

111

112 8 Αιιειεπίδξαζε κε άιιεο εθαξκνγέο. Όπσο ήδε έρνπκε δεη, κηα εθαξκνγή έρεη πνιιά activities, ηα νπνία έρνπλ δηθηά ηνπο νζόλε (UserInterface - UI) θαη δηθό ηνπο μερσξηζηό πεξηερόκελν. Γηα παξάδεηγκα κπνξεί ην έλα activity λα δείρλεη θάπνηνλ ράξηε, ελώ θάπνην άιιν λα ζαο δίλεη ηελ δπλαηόηεηα λα ηξαβήμεηε κηα θσηνγξαθία. Γηα λα κπνξέζεη ε εθαξκνγή λα κεηαθέξεη ηνλ ρξήζηε από ην έλα activity ζην άιιν, ζα πξέπεη κέζα ζηελ εθαξκνγή λα ππάξρεη δεισκέλν θάπνην Intent, ην νπνίν ζα δειώλεη ζηελ εθαξκνγή ην ηη ζα πξέπεη λα θάλεη. Όηαλ πεξλάηε θάπνην Intent ζην Android, ην Android ην επεμεξγάδεηαη θαη μεθηλάεη ην θαηάιιειν θνκκάηη ηεο εθαξκνγήο. Με ηελ βνήζεηα ηνπ Intent κπνξείηε λα θαιέζεηε σο activity ηεο εθαξκνγήο έλα activity πνπ αλήθεη ζε άιιε εθαξκνγή. Σν Intent ζα πξέπεη λα είλαη μεθάζαξα δεισκέλν (explicit) αλ ζέινπκε λα δεκηνπξγήζνπκε έλα instance θάπνηνπ ζπγθεθξηκέλνπ activity ή γεληθά δεισκέλν (implicit) αλ ζέινπκε λα μεθηλήζνπκε όπνην activityθάλεη γηα ηελ ζπγθεθξηκέλε πεξίπησζε. ην θεθάιαην απηό ζα αζρνιεζνύκε θπξίσο κε ηα ImplicitIntents. 8.1 Γεκηνπξγία Implicit Intent Όηαλ δεκηνπξγνύκε έλα implicitintent δελ ρξεηάδεηαη λα δειώζνπκε μεθάζαξα πνην θνκκάηη ηεο εθαξκνγήο ζα μεθηλήζεη κε ην ζπγθεθξηκέλν Intent, αιιά δειώλνπκε γεληθά ην ηη αθξηβώο ζέινπκε λα θάλνπκε. Δπίζεο πνιιέο θνξέο ζην Intent πνπ ζα δεκηνπξγήζνπκε ζα πξέπεη λα ηνπ πεξάζνπκε θαη θάπνηα δεδνκέλα. Γηα παξάδεηγκα αλ ε ελέξγεηα ηνπ Intent καο είλαη ε ρξήζε ηνπ ηειεθώλνπ, ηα δεδνκέλα πνπ ζα ρξεηαζηεί λα ηνπ πεξάζνπκε είλαη πνηνλ αξηζκό λα θαιέζεη. Uri number=uri.parse("tel: "); Intent callintent=new Intent(Intent.ACTION_DIAL,number); -101-

113 To URI (UniformResourceIdentifier) είλαη έλα string ή θάπνηνη ραξαθηήξεο πνπ ρξεζηκνπνηνύληαη γηα λα θαζνξίζνπληα δεδνκέλα πνπ ζα ρξεζηκνπνηήζνπκε. Δδώ ηνπ δίλνπκε σο δεδνκέλα ηνλ αξηζκό ηνπ ηειεθσληθνύ θέληξνπ ηνπ Σ.Δ.Ι., ελώ ε ελέξγεηα ηνπ Intent πνπ δεκηνπξγνύκε είλαη ε θιήζε ηνπ αξηζκνύ πνπ δίλνπκε. Αλ ζηνλ πξνεγνύκελν θώδηθα πξνζζέζνπκε θαη ηελ επόκελε γξακκή θώδηθα startactivity(callintent); ηόηε μεθηλάεη ε εθαξκνγή θιήζεο ηειεθώλνπ ηνπ ιεηηνπξγηθνύ, έρνληαο πιεθηξνινγεκέλν ηνλ αξηζκό " ". Γεληθά ε startactivity() ζα κπνξνύζακε λα πνύκε όηη απνθσδηθνπνηεί ην Intent θαη αλνίγεη ηελ θαηάιιειε εθαξκνγή. Μεξηθέο βαζηθέο ελέξγεηεο ηνπ Intent είλαη νη αθόινπζεο ACTION_DIAL : ρξεζηκνπνηείηαη γηα ηειεθσληθνύο αξηζκνύο, θαη αλνίγεη θαηεπζείαλ ηελ εθαξκνγή θιήζεο ηειεθώλνπ κε πιεθηξνινγεκέλν ηνλ αξηζκό πνπ ζα ηνπ πεξάζνπκε σο Uri. ACTION_VIEW : εκθαλίδεη ηα δεδνκέλα πνπ ζα ηνπ πεξάζνπκε σο Uri. Γηα παξάδεηγκα αλ ζέινπκε λα εκθαλίδεηαη κηα ζπγθεθξηκέλε ζειίδα, όηαλ παηεζεί θάπνην θνπκπί. ACTION_EDIT: εκθαλίδεη ηα δεδνκέλα πνπ ζα ηνπ πεξάζνπκε σο Uri, θαη επηπιένλ έρνπκε ηελ δπλαηόηεηα λα ηα επεμεξγαζηνύκε. ACTION_PICK: καο επηζηξέθεη ηα δεδνκέλα πνπ ζα ηνπ πεξάζνπκε σο Uri, θαη καο δίλεη ηελ δπλαηόηεηα λα επηιέμνπκε θάπνην από όια απηά. ACTION_SEND:ζηέιλεη θάπνηα δεδνκέλα ζε άιιν activity. Με ηνλ ίδην ηξόπν κπνξνύκε λα ξπζκίζνπκε ηελ εθαξκνγή καο λα θάλεη θαη δηάθνξεο άιιεο ιεηηνπξγίεο. Παξαδείγκαηνο ράξηλ κε ην πάηεκα ελόο θνπκπηνύ λα αλνίγεη κηα ζειίδα ζην Internet. Uri webpage =Uri.parse(" Intent webintent=new Intent(Intent.ACTION_VIEW,webPage); startactivity(webintent); Δπίζεο κπνξνύκε λα δεηήζνπκε λα καο δείμεη όιεο ηηο επαθέο πνπ είλαη απνζεθεπκέλεο ζηε ζπζθεπή καο. Intent pickcontactintent=new Intent(Intent.ACTION_VIEW,Uri.parse("content://contacts")); pickcontactintent.settype(phone.content_type); startactivity(pickcontactintent); -102-

114 Δθηόο από θάπνηεο ηέηνηεο απιέο ελέξγεηεο, κπνξείηε λα δεκηνπξγήζεηε θαη πην ζύλζεηεο ελέξγεηεο, όπσο ε απνζηνιή ελόο . Ο θώδηθαο πνπ ρξεηάδεηαη είλαη ν αθόινπζνο. Intent intent = new Intent(Intent.ACTION_SEND); intent.settype(http.plain_text_type); intent.putextra(intent.extra_ , new String[] {"mail1@example.com","mail2@example.com","mail3@example.com"); intent.putextra(intent.extra_subject, "Θέμα "); intent.putextra(intent.extra_text, "Κείμενο ..."); startactivity( intent); Παξαηεξνύκε όηη ζην ζπγθεθξηκέλν παξάδεηγκα δελ έρνπκε δεκηνπξγήζεη Ur. ε απηή ηελ πεξίπησζε είλαη απαξαίηεηε ε ρξήζε ηεο κεζόδνπ settype(), γηα λα νξίζνπκε ηνλ ηύπν ησλ δεδνκέλσλ πνπ ζα δώζνπκε ζην Intent. Δπίζεο κε ηελ κέζνδν putextra(), δίλνπκε θάπνηα επηπιένλ δεδνκέλα ζην Intent, ηα νπνία ρξεηάδνληαη γηα ηελ απνζηνιή ηνπ , όπσο νη παξαιήπηεο ηνπ , ην ζέκα ηνπ, ην θείκελό ηνπ, αιιά επηπιένλ κπνξνύκε λα νξίζνπκε θαη δηάθνξα attachments γηα λα απνζηαινύλ καδί κε ην Δύξεζε θαηάιιειεο εθαξκνγήο Έλαο βαζηθόο έιεγρνο πνπ ζα πξέπεη λα γίλεηαη πξηλ ηελ θιήζε ηεο startactivity() είλαη όηη ππάξρεη ε θαηάιιειε εθαξκνγή γηα ην Inten tπνπ δεκηνπξγήζαηε. Αλ θαη γηα ηηο πεξηζζόηεξεο ελέξγεηεο ππάξρεη εθαξκνγή ηνπ ιεηηνπξγηθνύ Android, θαιό είλαη λα πξαγκαηνπνηείηαη ν έιεγρνο, γηαηί ζε πεξίπησζε πνπ δελ ππάξρεη εθαξκνγή, ηόηε ε εθαξκνγή ζαο ζα θαηαζηξαθεί. Με βάζε απηά ηα δεδνκέλα, ν θώδηθαο πνπ έζηειλε ην πιένλ έρεη γίλεη σο εμήο: Intent intent = new Intent(Intent.ACTION_SEND); intent.settype(http.plain_text_type); intent.putextra(intent.extra_ , new String[] {"mail1@example.com","mail2@example.com","mail3@example.com"); intent.putextra(intent.extra_subject, "Θέμα "); intent.putextra(intent.extra_text, "Κείμενο ..."); PackageManager packagemanager = getpackagemanager(); List<ResolveInfo> activities = packagemanaer.queryintentactivities( intent, 0); if (activities.size()>0) startactivity( intent); -103-

115 Η κέζνδνο getpackagemanager επηζηξέθεη πιεξνθνξίεο ζρεηηθά κε όιεο ηηο εθαξκνγέο θαη ηα παθέηα πνπ είλαη εγθαηεζηεκέλα ζηελ ζπζθεπή, ελώ ε κέζνδνο queryintentactivities(), καο επηζηξέθεη όιεο ηηο εθαξκνγέο πνπ κπνξνύλ λα αλνίμνπλ ην Intent πνπ ηεο δώζακε σο παξάκεηξν. Αλ ην πιήζνο ησλ απνηειεζκάησλ πνπ γπξλάεη είλαη κεγαιύηεξν ηνπ 0, ηόηε ππάξρεη ζίγνπξα κηα εθαξκνγή ζα ηξέμεη ην Intent καο. ε πεξίπησζε πνπ ππάξρνπλ πεξηζζόηεξεο από κηα εθαξκνγέο, ηόηε ζα εκθαληζηεί έλα παξαζπξάθη κε όιεο ηηο επηινγέο, ώζηε ν ρξήζηεο λα επηιέμεη πνηα εθαξκνγή ζα ήζειε λα αλνίμεη. Δηθόλα 94: Παξάζπξν επηινγήο εθαξκνγήο Δάλ επηιέμσ"use by default for this action" ηελ επόκελε θνξά πνπ ζα γίλεη θιήζε γηα άλνηγκα κηαο ζειίδαο ζην Internet, δελ ζα εκθαληζηεί μαλά ην παξαζπξάθη, αιιά ζα αλνίμεη απηό ν επηιεγκέλνο browser. Αλ παξόια απηά εζείο ζέιεηε λα εκθαλίδεηε ζπλέρεηα ην παξαζπξάθη επηινγώλ, κπνξείηε λα ην θάλεηε κέζσ θώδηθα. Uri webpage=uri.parse(" Intent webintent=new Intent(Intent.ACTION_VIEW,webPage); Intent chooser = Intent.createChooser(webIntent, "Open with browser.."); PackageManager packagemanager = getpackagemanager(); List<ResolveInfo> activities = packagemanager.queryintentactivities(webintent, 0); if (activities.size()>0){ startactivity(chooser); Γεκηνπξγνύκε έλα θαηλνύξγην Intent, γηα ην νπνίν ρξεζηκνπνηνύκε ηελ κέζνδν createchooser, ε νπνία δέρεηαη σο παξακέηξνπο ην Intent γηα ην νπνίν ζέιεηε λα δεκηνπξγήζεηε ην παξαζπξάθη επηινγώλ, θαη έλα string, σο ηίηιν ζην παξαζπξάθη. Αλ -104-

116 ηώξα ππάξρνπλ εθαξκνγέο γηα λα αλνίμεηε ην Intent, εκθαλίδεηαη πξώηα ην παξαζπξάθη επηινγώλ, θαη αθνύ θάλεηε ηελ επηινγή ζαο, ηόηε ζα αλνίμεη ην αξρηθό ζαο Intent. 8.3 Δπηζηξνθή απνηειέζκαηνο από Activity. Μέρξη ζηηγκήο είδακε πσο κπνξνύκε λα θαιέζνπκε έλα activity κε ηελ ρξήζε ηεο startactivity(). Με ηελ ρξήζε ηεο ζπγθεθξηκέλεο κεζόδνπ απιά ιέκε ζην ζύζηεκα λα μεθηλήζεη ηελ δηαδηθαζία δεκηνπξγίαο ηνπ λένπ activity, ρσξίο όκσο λα γλσξίδνπκε αλ απηό ζα πξαγκαηνπνηεζεί κε επηηπρία ή όρη. Γηα λα καο επηζηξαθεί έλα απνηέιεζκα ζα πξέπεη λα ρξεζηκνπνηήζνπκε ηελ startactivityforresult(), ε νπνία επηζηξέθεη έλα απνηέιεζκα ζρεηηθά κε ηελ δηαδηθαζία δεκηνπξγίαο ηνπ λένπ activity. Γηα παξάδεηγκα κέζα από ηελ εθαξκνγή ζαο αλνίγεηε ηελ θάκεξα ηεο ζπζθεπήο γηα λα ηξαβήμεη ν ρξήζηεο κηα θσηνγξαθία. Θα πξέπεη λα γλσξίδεηε αλ ηειηθά ν ρξήζηεο ηξάβεμε ηελ θσηνγξαθία, ώζηε λα ηελ δηαρεηξηζηείηε θαη εζείο θαηαιιήισο ( λα ηελ ζώζεηε, λα ηελ πξνβάιιεηε γηα λα δεη ηη ηξάβεμε θιπ). Γηα λα ζαο επηζηξαθεί θάπνην απνηέιεζκα, ζα πξέπεη θαη ην activity πνπ θαιέζαηε λα έρεη ζρεδηαζηεί κε ηέηνην ηξόπν, ώζηε λα επηζηξέθεη απνηειέζκαηα. Σα απνηειέζκαηα απηά κπνξείηε λα ηα δηαρεηξηζηείηε ζηελ callback κέζνδν onactivityresult(). Η ζπλεζέζηεξε κνξθή θιήζεο ηεο startactivityforresult() είλαη κε ηελ εμήο κνξθή startactivityforresult(intent intent, int requestcode). Η παξάκεηξνο Intent είλαη ην Inten tπνπ ζέινπκε λα δηαρεηξηζηεί, ελώ ε δεύηεξε παξάκεηξνο είλαη έλαο αξηζκόο, ν νπνίνο θαζνξίδεη ην Intent. Απηό ζεκαίλεη όηη ζηελ onactivityresult(), γηα λα είκαζηε ζίγνπξνη όηη ην απνηέιεζκα πνπ επηζηξάθεθε είλαη από ηελ δηθή καο θιήζε θαη όρη από θάηη άιιν, ζα πξέπεη ν αξηζκόο πνπ επηζηξάθεθε λα είλαη ίδηνο κε ην requestcode. Η onactivityresult (intrequestcode, intresultcode,intentdata) είλαη κηα callback κέζνδνο ε νπνία θαιείηαη όηαλ έλα activity πνπ έρεηε ηξέμεη ζηακαηάεη. Η παξάκεηξνο requestcode είλαη ν ίδηνο αξηζκόο κε ην requestcode ηεο κεζόδνπ startactivityforresult. Η resultcode είλαη ην απνηέιεζκα πνπ επηζηξέθεη ην activity (αλ δειαδή έθιεηζε ην activity επεηδή ην επέιεμε ν ρξήζηεο (RESULT_OK) ή αλ -105-

117 έθιεηζε επεηδή θαηέξξεπζε ε εθαξκνγή (RESULT_CANCELED), ελώ ε παξάκεηξνο data είλαη ηα δεδνκέλα πνπ επηζηξέθεη ην activity. Σα data κπνξνύκε λα δηαβάζνπκε θαη λα απνθσδηθνπνηήζνπκε, γηα λα ηα ρξεζηκνπνηήζνπκε όπσο ζέινπκε. Γηα παξάδεηγκα ζέινπκε λα καο θέξεη όιεο ηηο επαθέο πνπ βξίζθνληαη ζηελ ζπζθεπή καο. Intent pickcontactintent=new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts")); pickcontactintent.settype(phone.content_type); startactivityforresult(pickcontactintent,1); Ωο requestcode έρνπκε ζέζεη ην 1. Οπόηε ζηελ onactivityresult(), ζα πξέπεη λα ειέγμνπκε όηη ν requestcode πνπ επηζηξέθεηαη είλαη ν 1, θαη κεηά λα θάλνπκε ηηο ελέξγεηεο πνπ Protected void onactivityresult(int requestcode, int resultcode, Intent data) { switch (requestcode) { case 1: { if (resultcode == RESULT_OK) { Uri contacturi=data.getdata(); String[] projection = new String[]{ Phone.NUMBER; Cursor cursor = getcontentresolver().query(contacturi, projection,null,null,null); int column= cursor.getcolumnindex(phone.number); String number= cursor.getstring(column); break; Αθνύ ειέγμακε όηη ν requestcode είλαη ν 1, ζηελ ζπλέρεηα ειέγρνπκε ηνλ resultcode, γηα λα δνύκε όηη ε όιε δηαδηθαζία ήηαλ επηηπρήο. Αλ ε δηαδηθαζία νινθιεξώζεθε κε επηηπρία, ηόηε απνζεθεύνπκε ζε έλα Uri ηα δεδνκέλα ηεο κεηαβιεηήο getdata(). Με ηελ βνήζεηα ελόο θέξζνξα ςάρλνπκε ζε όια ηα δεδνκέλα καο γηα ηηο ηηκέο ηεο ζηήιεο NUMBER, θαη ζηελ ζπλέρεηα παίξλνπκε ηελ ηηκή ηεο πξώηεο γξακκήο θαη ηελ απνζεθεύνπκε ζε έλα string. Αλ ηώξα ζην UI καο έρνπκε θάπνην πεδίν ListView ή TextView, ζα κπνξνύζακε λα εκθαλίζνπκε ηελ ηηκή ζε απηό ην πεδίν

118 8.4 Έλαξμε δηθνύ καο activity από άιιεο εθαξκνγέο. ηηο πξνεγνύκελεο ελόηεηεο είδακε πσο κπνξνύκε λα μεθηλήζνπκε άιια activities από ηελ εθαξκνγή καο. ε απηή ηελ ελόηεηα ζα δνύκε πσο κπνξεί θάπνην άιιν activity λα θαιέζεη ην δηθό καο activity. Σν πξώην πξάγκα πνπ ζα πξέπεη λα θαζνξηζηεί είλαη ζε πνηεο ελέξγεηεο ηνπ Intent ζα απαληάεη ε εθαξκνγή. Γηα παξάδεηγκα αλ έρεηε θηηάμεη κηα εθαξκνγή απνζηνιήο , δελ ππάξρεη λόεκα λα απαληάεη ε εθαξκνγή ζαο ζην Intent.ACTION_DIAL, παξά κόλν ζην Intent.ACTION_SEND. Η δήισζε ησλ Intent θίιηξσλ γίλεηαη κέζα ζην AndroidManifest.xml αξρείν. Μηα ηππηθή δήισζε Intent θίιηξνπ είλαη ε αθόινπζε <intent-filter> <action android:name="android.intent.action.send"/> <category android:name="android.intent.category.default"/> <data android:mimetype="text/plain"/> <data android:mimetype="image/*"/> </intent-filter> ην action νξίδνπκε ζε πνηα ελέξγεηα ζα απαληάεη ην activity. ην category νξίδνπκε πσο ζα βξίζθεη ε θιήζε ηεο startactivity() από θάπνην άιιν activity ην activity καο. ηελ ζπγθεθξηκέλε πεξίπησζε νξίδνπκε όηη ε θαηεγνξία είλαη Default, πξάγκα πνπ ζεκαίλεη όηη ε εθαξκνγή καο ζα απαληάεη ζε θάζε implicitθιήζε πνπ σο action έρεη SEND. ην data νξίδνπκε ηνπο ηύπνπο ησλ δεδνκέλσλ ηνπο νπνίνπο ρξεηάδεηαη ην activity. ε απηό ην παξάδεηγκα έρνπκε νξίζεη όηη ηα δεδνκέλα πνπ ρξεηάδεηαη ην Intent είλαη MIME, θαη κπνξεί λα ππνζηεξίμεη απιό θείκελν ή θαη θσηνγξαθίεο ζέιακε ε εθαξκνγή λα δέρεηαη έλα URI ηόηε ζα έπξεπε λα ρξεζηκνπνηήζνπκε ην ραξαθηεξηζηηθό scheme αληί γηα ην mimetype, όπσο ζην επόκελν παξάδεηγκα. <data android:scheme="mycontents"/> Όπσο κπνξεί λα γίλεη αληηιεπηό θαη από ηα πξνεγνύκελα παξαδείγκαηα, κέζα ζε έλα θίιηξν Intent κπνξνύκε λα δειώζνπκε πεξηζζόηεξα από έλα actions ή θαη -107-

119 category ή θαη data. Απηό ζεκαίλεη όηη ην activity καο κπνξεί λα απαληάεη ζε πεξηζζόηεξα ηνπ ελόο action, λα αλήθεη ζε πεξηζζόηεξεο από κηα θαηεγνξίεο θαη λα δέρεηαη πεξηζζόηεξα από έλα δεδνκέλα. Απηό πνπ ζα πξέπεη λα πξνζερζεί είλαη όηη ζε απηή ηελ πεξίπησζε ζα πξέπεη ηα δεδνκέλα πνπ ζα δέρεηαη ην activity ζα πξέπεη λα κπνξνύλ λα ρξεζηκνπνηεζνύλ από όια ηα actions πνπ έρνπκε νξίζεη. Αλ δειαδή έρνπκε ηα actions SEND θαη VIEW, θαη ην πξώην ζέιεη σο δεδνκέλα MIMEtypes ελώ ην VIEW ζέιεη Uri, ηόηε ζα πξέπεη λα δειώζνπκε δπν δηαθνξεηηθά θίιηξα. <intent-filter> <action android:name="android.intent.action.send"/> <category android:name="android.intent.category.default"/> <data android:mimetype="text/plain"/> <data android:mimetype="image/*"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.view"/> <category android:name="android.intent.category.default"/> <data android:scheme="mycontents"/> </intent-filter> Σν επόκελν βήκα είλαη λα ειέγρνπκε θάζε θνξά πνπ μεθηλάεη ην activity καο, αλ μεθίλεζε από θιήζε από άιιν activity, θαη αλ λαη, ηη action είρε ην Intent πνπ έζηεηιε ην άιιν activity. Αλ π.ρ. ζην δηθό καο activity είρακε δειώζεη ηα δπν Intent θίιηξα πνπ θαίλνληαη ζηελ πξνεγνύκελε εηθόλα, ν έιεγρνο πνπ ζα έπξεπε λα γίλεη είλαη ν protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Intent intent = getintent(); if (intent.getaction()==intent.action_view){ Uri data = intent.getdata(); elseif(intent.getaction()==intent.action_view){ if (intent.gettype().indexof("image/")!= -1) { // η εικόνα else if (intent.gettype().equals("text/plain")) { // τοκείμενο -108-

120 Ο έιεγρνο γίλεηαη ζηελ oncreate(). Γηαβάδνπκε ην Intent ηνπ θαη αλ ην Action ηνπ είλαη VIEW, ηόηε ηα δεδνκέλα πνπ πεξάζηεθαλ είλαη Uri. Οπόηε ηα δηαβάδνπκε θαη κεηά αλάινγα κε ην ηη ζέινπκε λα θάλνπκε, ηα επεμεξγαδόκαζηε θαηάιιεια. Αλ ην action είλαη SEND, ηόηε ζεκαίλεη όηη ηα δεδνκέλα είλαη text/plain θαη image. Θα πξέπεη λα ειέγμνπκε αλ έρνπλ ηηκέο, θαη αλ έρνπλ ηηο επεμεξγαδόκαζηε θαη ηηο ρξεζηκνπνηνύκε όπσο ζέινπκε. 8.5 Δπηζηξνθή Απνηειέζκαηνο. Δάλ ζέιεηε λα επηζηξέςεηε θάπνην απνηέιεζκα ζην activityαπό ην νπνίν έγηλε θιήζε ζην δηθό ζαο, ζα πξέπεη λα ρξεζηκνπνηήζεηε ηελ κέζνδν setresult(intresultcode, IntentData), νη παξάκεηξνη ηεο νπνίαο είλαη νη εμήο: resultcode : ην απνηέιεζκα ηεο εθηέιεζεο ηνπ activityζαο. Οη ζπεζηζκέλεο ηηκέο πνπ παίξλεη είλαη RESULT_OK, αλ ε εθηέιεζε πξαγκαηνπνηήζεθε θαλνληθά θαη RESULT_CANCELED, αλ παξνπζηάζηεθε θάπνην πξόβιεκα Data : ην Intent κε ηα απνηειέζκαηα ηεο εθηέιεζεο, πνπ ζα επηζηξαθνύλ ζην αξρηθό activity, γηα επεμεξγαζία από ηελ πιεπξά ηνπ. ε πεξίπησζε πνπ δελ ζέιεηε λα επηζηξέςεηε θάπνηα δεδνκέλα, κπνξείηε λα θαιέζεηε ηελ setresult, ζέηνληαο κόλν ηελ πξώηε παξάκεηξν (setresult(intresultcode)) Intent result= new Intent("RESULT_ACTION",Uri.parse("content://result_uri")); setresult(activity.result_ok,result); finish(); Με ηελ εληνιή finish() θιείλνπκε θαη θαηαζηξέθνπκε ην activity καο. Απηό πνπ ζα πξέπεη λα ηνληζηεί είλαη δελ καο απαζρνιεί αλ ην activity θαιέζηεθε κε ηελ κέζνδν startactivity() ή κε ηελ κέζνδν startactivityforresult(), αλ δειαδή ην πξνεγνύκελν activity πεξηκέλεη θάπνην απνηέιεζκα ή όρη. Αλ ε ιεηηνπξγία ηνπ δηθνύ καο activity έρεη θάπνην απνηέιεζκα, εκείο ζα ην επηζηξέθνπκε κε ηελ ρξήζε ηεο setresult(intresultcode, IntentData). Αλ ε θιήζε έγηλε κε ηελ startactivity(), απιά ην άιιν activity ζα αγλνήζεη ην Intent πνπ ζα ηνπ επηζηξέςνπκε

121

122 9 Γηαρείξηζε Audiocontrol Δάλ ε εθαξκνγή ζαο θάλεη αλαπαξαγσγή ήρνπ, ζα πξέπεη λα δίλεη ηελ δπλαηόηεηα ζηνλ ρξήζηε λα δηαρεηξίδεηαη ηνλ ήρν κε έλαλ αλακελόκελν ηξόπν. Γηα λα εμαζθαιίζεηε ζηνλ ρξήζηε κηα ζπνπδαία εκπεηξία ήρνπ, ζα πξέπεη λα δηαζθαιίζεηε όηη δελ ζα γίλεηε ηαπηόρξνλε αλαπαξαγσγή ήρνπ θαη από άιιεο εθαξκνγέο, παξά κόλν από ηελ δηθή ζαο [17]. 9.1 Έιεγρνο έληαζεο ήρνπ θαη αλαπαξαγσγήο αξρείνπ Από ηελ ζηηγκή πνπ ε εθαξκνγή ζαο πξνζθέξεη αλαπαξαγσγή αξρείνπ ήρνπ, ζα πξέπεη επίζεο λα δίλεη ηελ δπλαηόηεηα δηαρείξηζεο ηεο έληαζεο ηνπ ήρνπ, ρξεζηκνπνηώληαο είηε ηα θνπκπηά δηαρείξηζεο ήρνπ ηεο ζπζθεπήο, είηε ηνπ ινγηζκηθνύ, είηε αθόκα θαη αληίζηνηρα θνπκπηά ησλ hands-free ή αθνπζηηθώλ bluetooth. Δθηόο από ηελ απμνκείσζε ηεο έληαζεο, ζα πξέπεη λα δίλεηαη ε δπλαηόηεηα εθηέιεζεο ελεξγεηώλ όπσο play, stop, pause, next, previous, αλάινγα κε ηηο δπλαηόηεηεο ηεο εθάζηνηε ζπζθεπήο. Σν πξώην βήκα γηα ηελ δεκηνπξγίαο κηαο ηέηνηαο εθαξκνγήο είλαη ε επηινγή ηεο κνξθή ήρνπ πνπ ζα αλαπαξάγεη ε εθαξκνγή ζαο. Σν ιεηηνπξγηθό Android δηαηεξεί δηαθνξεηηθή κνξθή ήρνπ γηα κνπζηθά αξρεία, γηα ήρνπο γηα μππλεηήξηα, γηα ήρνπο θιήζεο, ήρνπο ζπζηήκαηνο θιπ. Απηό γίλεηαη θπξίσο γηα λα επηηξέπεη ηνπο ρξήζηεο ζα δηαρεηξίδνληαη κε δηαθνξεηηθό ηξόπν ηελ απμνκείσζε ηεο έληαζεο γηα θάζε ηύπν αξρείνπ. Με ηελ θιάζε AudioManager νξίδνπκε ηνλ ηύπν ησλ αξρείσλ ήρνπ πνπ ρξεζηκνπνηνύκε

123 9.2 Υξήζε πιήθηξσλ ζπζθεπήο γηα έιεγρν έληαζεο ήρνπ Δμ' νξηζκνύ, όηαλ παηάηε ηα πιήθηξα δηαρείξηζεο ήρνπ ηεο ζπζθεπήο, απμνκεηώλεηαη ν ήρνο γηα ηνλ ηξέρσλ ήρν θαη κνξθή ήρνπ. Δάλ εθείλε ηελ ζηηγκή ε εθαξκνγή ζαο δελ παίδεη θάπνηνλ ήρν, ε απμνκείσζε γίλεηαη γηα ηνλ ήρν θιήζεο. Παξόια απηά, όηαλ ν ρξήζηεο βξίζθεηαη ζε κηα εθαξκνγή πνπ αλαπαξάγεη ήρν, όηαλ πηέδεη ηα θνπκπηά απμνκείσζεο ήρνπ ζα ζέιεη λα απμνκεηώλεηαη ν ήρνο ηεο εθαξκνγήο, αθόκα θαη αλ εθείλε ηελ ζηηγκή δελ παίδεη θάπνηνλ ήρν. Με ηελ ξνπηίλα setvolumecontrolstream() ορίηουμε για ποιον τφπο ιχου κζλουμε θ εφαρμογι μασ να χρθςιμοποιεί τα κουμπιά αυξομείωςθσ τθσ ςυςκευισ για τθν αυξομείωςθ του ιχου. Αν παραδείγματοσ χάριν θ εφαρμογισ χρθςιμοποιεί αρχεία μουςικισ τότε με τθν εντολι setvolumecontrolstream(audiomanager.stream_music) ςτθν OnCreate() του activity ι του Fragment, ορίηουμε ότι θ εφαρμογι μασ κα διαχειρίηεται μουςικά αρχεία ιχου. Από το ςθμείο αυτό και μετά, πιζηοντασ τα κουμπιά του ιχου, αυξομειϊνεται ο ιχοσ τθσ εφαρμογισ, όταν το activity ι το fragment είναι ορατό. 9.3 Υξήζε πιήθηξσλ ζπζθεπήο γηα αλαπαξαγσγή ήρνπ Όπσο πξναλαθέξακε, ππάξρεη πεξίπησζε ν ρξήζηεο λα ρξεζηκνπνηεί δηάθνξεο εμσηεξηθέο ζπζθεπέο γηα λα αθνύεη ηελ αλαπαξαγσγή ηνπ ήρνπ, νη νπνίεο έρνπλ θνπκπηά γηα ζηακάηεκα, παύζε θαη επαλέλαξμε ηεο αλαπαξαγσγήο. Γηα λα θαηαιάβνπκε κέζα από ηελ εθαξκνγή καο ην πάηεκα απηώλ ησλ θνπκπηώλ ζα πξέπεη λα πξνζζέζνπκε ζην Manifest αξρείν ηεο εθαξκνγήο ηνλ παξαθάησ θώδηθα. <receiver android:name=".mainactivity"> <intent-filter> <actionandroid:name="android.intent.action.media_button"/> </intent-filter> </receiver> Με απηέο ηηο γξακκέο θώδηθα ελεξγνπνηνύκε ηελ δηαδηθαζία παξαθνινύζεζεο ηνπ παηήκαηνο ησλ δηαθόξσλ θνπκπηώλ. H θιάζε Intent πεξηιακβάλεη έλα property, ην -112-

124 EXTRA_KEY_EVENT, ην νπνίν πεξηέρεη ην ζπκβάλ πνπ πξαγκαηνπνηήζεθε, αλ δειαδή παηήζεθε ην Stop, Pause ή ηνresume. Με ηελ ρξήζε ηεο θιάζεο KeyEvent απνθσδηθνπνηνύκε ηελ ηηκή ηνπ EXTRA_KEY_EVENT, θαη κπνξνύκε λα γξάςνπκε δηθό καο θώδηθα γηα ην ηη ζα θάλεη ζε θάζε πεξίπησζε. Οη ζηαζεξέο πνπ πεξηέρεη ε θιάζε KeyEvent είναι τθσ μορφισ KEYCODE_MEDIA_*, θαη θάζε κηα πεξηγξάθεη θαη έλα θνπκπί. ην επόκελν παξάδεηγκα θαίλεηαη ν ηξόπνο γηα λα "πηάζνπκε" ην πάηεκα ηνπ θνπκπηνύ Play. Public class MainActivity extends BroadcastReceiver Protected void onreceive(context context, Intent intent){ if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){ KeyEvent event=(keyevent)intent.getparcelableextra(intent.extra_key_event); if (KeyEvent.KEYCODE_MEDIA_PLAY==event.getKeyCode()){ //η ενέπγεια πος θέλοςμε να εκτελεστεί Δπεηδή όκσο ππάξρεη ε πηζαλόηεηα πνιιέο εθαξκνγέο λα ζέινπλ λα παξαθνινπζνύλ ην πάηεκα απηώλ ησλ θνπκπηώλ, ζα πξέπεη πξνγξακκαηηζηηθά λα ειέγρνπκε πόηε ε εθαξκνγή καο ζα ειέγρεη ην πάηεκα ησλ θνπκπηώλ. Ο έιεγρνο γίλεηαη κε ηελ βνήζεηα ηεο θιάζεο AudioManager, κε ηελ νπνία θάλνπκε αξρηθνπνηνύκε θαη ηεξκαηίδνπκε ηελ δηαδηθαζία ειέγρνπ ησλ θνπκπηώλ. πλήζσο ν ηεξκαηηζκόο ειέγρνπ ζα πξέπεη λα γίλεηαη όηαλ ε εθαξκνγή γίλεηαη κε ελεξγή ή κε νξαηή ( διδ ζηελ κέζνδν onstop() ηνπ θύθινπ δσήο ηνπ activity). Βέβαηα όηαλ νη πεξηζζόηεξεο εθαξκνγέο αλαπαξάγνπλ ήρνπο, όπσο έλαο media player, ζέινπλ λα ειέγρνπλ ηα θνπκπηά θαη όηαλ δελ είλαη ζην πξνζθήλην, θαη ζπλεζέζηεξα θπξίσο ζε εθείλν ην ζηάδην. πλήζσο ην θαηάιιειν ζεκείν λα ζηακαηήζνπλ ηνλ έιεγρν ησλ θνπκπηώλ, είλαη όηαλ ε εθαξκνγή ράζεη ην audio focus, δηαδηθαζία πνπ πεξηγξάθεηαη αλαιπηηθά ζηελ επόκελε ελόηεηα. ην επόκελν παξάδεηγκα παξνπζηάδεηαη ε ιεηηνπξγία ηνπ AudioManager[18]. Γηα λα γίλεη θαιύηεξε πξνζνκνίσζε, ζηελ εθαξκνγή ζα πξνζζέζνπκε 2 θνπκπηά, πνπ ζα παίδνπλ ηνλ ξόιν ηεο απμνκείσζεο ηεο έληαζεο. Γεκηνπξγνύκε έλα θαηλνύξγην project, πνπ ην νλνκάδνπκε AudioManagerTest, θαη ζην activity_main. xml αξρείν πξνζζέηνπκε 2 θνπκπηά

125 <LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margintop="20dp" android:text="adjust the volume:" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margintop="10dp" android:orientation="horizontal" > <Button style="?android:attr/buttonstylesmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="+" /> <Button style="?android:attr/buttonstylesmall" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="-" /> </LinearLayout> </LinearLayout> Η οκόνθ μασ ζχει τθν παρακάτω μορφι -114-

126 Δηθόλα 95: Οζόλε εθαξκνγήο AudioManagerTest ην αξρείν MainActivity.java πξνζζέηνπκε ηνλ επόκελν θώδηθα. publicclass MainActivity extends Activity { private Button increasebtn; private Button decreasebtn; private AudioManager Protectedvoid oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); increasebtn = (Button) findviewbyid(r.id.increase); increasebtn.setonclicklistener(new OnClickListener() Publicvoid onclick(view v) { myaudiomanager.adjustvolume(audiomanager.adjust_raise, AudioManager.FLAG_SHOW_UI); Toast.makeText(getApplicationContext(), "increase volume", Toast.LENGTH_SHORT).show(); ); -115-

127 decreasebtn = (Button) findviewbyid(r.id.decrease); decreasebtn.setonclicklistener(new OnClickListener() publicvoid onclick(view v) { myaudiomanager.adjustvolume(audiomanager.adjust_lower, AudioManager.FLAG_SHOW_UI); Toast.makeText(getApplicationContext(), "decrease volume", Toast.LENGTH_SHORT).show(); ); myaudiomanager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); Με ηελ εληνιή myaudiomanager=(audiomanager)getsystemservice(context.audio_service); απνθηνύκε πξόζβαζε ζην control ηεο έληαζεο ηνπ ήρνπ, αιιά θαη ζηελ ιεηηνπξγία ήρνπ θιήζεο (ζησπειό, δόλεζε ή ήρνο). ην event setonclicklistener( )θάζε θνπκπηνύ απμάλνπκε θαη κεηώλνπκε αληίζηνηρα ηελ έληαζε ηνπ ήρνπ, εκθαλίδνληαο θαη ηελ κπάξα κε ηελ έληαζε ηνπ ήρνπ, αιιά θαη έλα ελεκεξσηηθό επηπιένλ κήλπκα, γηα ην αλ απμήζακε ή κεηώζακε ηελ έληαζε

128 Δηθόλα 96: Αύμεζε έληαζεο ήρνπ -117-

129 Δηθόλα 97 : Μείσζε έληαζεο ήρνπ 9.4 Γηαρείξηζε AudioFocus Τπάξρεη πεξίπησζε ζε κηα ζπζθεπή λα ππάξρνπλ πνιιέο εθαξκνγέο πνπ αλαπαξάγνπλ ήρν. Γηα λα απνθεπρζεί λα θάλνπλ αλαπαξαγσγή όιεο καδί νη εθαξκνγέο, ην ιεηηνπξγηθό Androidέρεη κηα ιεηηνπξγηθόηεηα, ηελ AudioFocus, γηα λα ξπζκίδεη ηελ αλαπαξαγσγή. Με απηή ηελ ιεηηνπξγία κόλν νη εθαξκνγέο πνπ έρνπλ εθείλε ηελ ζηηγκή ην AudioFocusαλαπαξάγνπλ ήρν [19]. Πξηλ μεθηλήζεη ε εθαξκνγή ζαο λα αλαπαξάγεη ήρν ζα πξέπεη λα δεηήζεη θαη λα ιάβεη ην AudioFocus. Με παξόκνην ηξόπν ζα πξέπεη λα κπνξεί λα δηαρεηξηζηεί ηελ απώιεηα ηνπ AudioFocus από άιιε εθαξκνγή θαη λα ελεξγήζεη θαηαιιήισο, ώζηε λα ζηακαηήζεη ηελ αλαπαξαγσγή

130 9.4.1 Αίηεζε γηα Audio Focus. Πξηλ ε εθαξκνγή ζαο μεθηλήζεη ηελ αλαπαξαγσγή, ζα πξέπεη λα ζηείιεη έλα αίηεκα γηα AudioFocus. Απηό γίλεηαη κε ηελ κέζνδν requestaudiofocus (AudioManager.OnAudioFocusChangeListenerListener, intstreamtype, intdurationhint). Οι παράμετροι που δζχεται είναι οι ακόλουκοι [20] : AudioManager.OnAudioFocusChangeListenerListener: ο listener που κα ενθμερϊνεται για τισ διάφορεσ αλλαγζσ ςτο AudioFocus. intstreamtype: το είδοσ του θχθτικοφ που κα αναπαραχκεί. Αν δθλαδι κα είναι μουςικι, ειδοποίθςθ, ξυπνθτιρι κλπ. Αν για παράδειγμα το κζλουμε για αναπαραγωγι μουςικι, τότε δθλϊνουμε AudioManager.STREAM_MUSIC, αν είναι για ξυπνθτιρι τότε AudioManager.STREAM_ALARM, αν είναι ειδοποίθςθ AudioManager.STREAM_NOTIFICATIONκ.ο.κ intdurationhint: θ διάρκεια για τθν οποία κζλουμε το AudioFocus. Οι δυνατζσ επιλογζσ είναι οι : o AudioManager.AUDIOFOCUS_GAIN_TRANSIENT : θ ηιτθςθ για προςωρινι χριςθ του AudioFocus, το οποίο και κα απελευκερϊςει ςφντομα. Αυτό χρθςιμοποιείται όταν θ αναπαραγωγι είναι ιχοι ειδοποιιςεων ι ακόμα και φωνθτικι οδθγία από εφαρμογι GPS. o AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK : ςε αυτι τθν περίπτωςθ ενθμερϊνουμε το ςφςτθμα ότι δεν υπάρχει πρόβλθμα ο προθγοφμενοσ κάτοχοσ του AudioFocus, να ςυνεχίςει τθν αναπαραγωγι, αλλά κα πρζπει τθν ςτιγμι τθσ αναπαραγωγισ του δικοφ ςασ ιχου θ προθγοφμενθ εφαρμογι να ςταματιςει για λίγο. o AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_ΕΧCLUSIVE: με αυτι τθν εντολι ηθτάμε αποκλειςτικι χριςθ για ςφντομο χρονικό διάςτθμα, κατά το οποίο καμία άλλθ εφαρμογι δεν κα μπορεί να παίξει οποιονδιποτε ιχο. Ένα τζτοιο παράδειγμα είναι όταν κζλουμε να καταγράψουμε κάποιον ιχο. o AudioManager.AUDIOFOCUS_GAIN: ςε αυτι τθν περίπτωςθ ηθτάμε το AudioFocus για απροςδιόριςτο χρόνο. Το χρθςιμοποιοφμε όταν κζλουμε να αναπαράγουμε κάποιο τραγοφδι ι βίντεο

131 Οι τιμζσ που μπορεί να επιςτρζψει είναι οι εξισ : AUDIOFOCUS_REQUEST_GRANTED: ε εθαξκνγή έρεη ιάβεη ην AudioFocus θαη κπνξεί λα μεθηλήζεη ηελ αλαπαξαγσγή ηνπ ερεηηθνύ. AUDIOFOCUS_REQUEST_FAILED: ην AudioFocus ρξεζηκνπνηείηαη από άιιε εθαξκνγή θαη δελ κπνξεί λα ην πάξεη ε εθαξκνγή. Ο παξαθάησ θώδηθαο δείρλεη πσο κπνξνύκε λα μεθηλήζνπκε ηελ αλαπαξαγσγή θάπνηνπ κνπζηθνύ αξρείνπ κε ην πάηεκα ελόο θνπκπηνύ. Public void onclick(view v) { int result = myaudiomanager.requestaudiofocus(maudiofocuslistener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { myaudiomanager.registermediabuttoneventreceiver( new ComponentName(getPackageName(), MainActivity.class.getName())); // έναπξη αναπαπαγωγήρ μοςσικήρ private AudioManager.OnAudioFocusChangeListener maudiofocuslistener = new AudioManager.OnAudioFocusChangeListener() { public void onaudiofocuschange(int focuschange) { // εκτελείται σε αλλαγέρ τος AudioFocus switch (focuschange){ ; ηελ θιάζε registermediabuttoneventreceiver() δειώλνπκε πνην ζα είλαη ην component πνπ ζα δέρεηαη ηα Indents από ηα MEDIA_BUTTONS. Βιέπνπκε όηη δεηάκε ην AudioFocus γηα αλαπαξαγσγή κνπζηθήο θαη γηα απξνζδηόξηζην ρξόλν.δάλ ε εθαξκνγή ιάβεη ην AudioFocus, ηόηε κπνξεί λα μεθηλήζεη ε αλαπαξαγσγή. Η maudiofocuslistener() είλαη ν listener, ελώ ε onaudiofocuschange() είλαη ε κέζνδνο πνπ εθηειείηαη ζε θάζε αιιαγή ηνπ AudioFocus. Π.ρ. αλ ε εθαξκνγή καο ράζεη ην AudioFocus, ηόηε ζα εθηειεζηεί maudiofocuslistener() θαη ε ηηκή ηνπ focuschangeζα είλαη AUDIOFOCUS_LOSS. ε απηή ηελ πεξίπησζε ζα πξέπεη λα γξάςνπκε θώδηθα πνπ λα ζηακαηάεη ηελ αλαπαξαγσγή ηνπ ήρνπ

132 9.4.2 Υεηξηζκόο απώιεηαο AudioFocus Όπσο ε εθαξκνγή καο δεηάεη ην AudioFocus από άιιεο εθαξκνγέο, έηζη είλαη πηζαλό θάπνηα άιιε εθαξκνγή λα δεηήζεη ην AudioFocus από εκάο. Η εθαξκνγή ζα πξέπεη λα κπνξεί λα δηαρεηξηζηεί απηή ηελ απώιεηα, αλεμάξηεηα ηνπ ιόγνπ γηα ηνλ νπνίν γίλεηαη. Όπσο είδακε πξνεγνπκέλσο ε κέζνδνο πνπ δηαρεηξίδεηαη ζηηο δηάθνξεο αιιαγέο ζην AudioFocus είλαη ε onaudiofocuschange(), ελώ ε παξάκεηξνο focuschange πεξηγξάθεη ην ιόγν πνπ εθηειείηαη ε κέζνδνο. Οη ηηκέο πνπ κπνξεί λα πάξεη είλαη αληίζηνηρεο κε ηηο ηηκέο πνπ ππάξρνπλ όηαλ δεηάκε ην AudioFocus: AUDIOFOCUS_LOSS_TRANSIENT : πξνζσξηλή απώιεηα ηνπ Audio Focus. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: πξνζσξηλή απώιεηα ηνπ AudioFocus, αιιά κπνξείηε απιά λα ρακειώζεηε ηελ έληαζε ηνπ ήρνπ ηεο εθαξκνγήο. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: κόληκε απώιεηα ηνπ AudioFocus. Θα πξέπεη λα ζηακαηήζεηε γεληθά ηελ αλαπαξαγσγή. Γεληθά, κηα πξνζσξηλή απώιεηα ζα πξέπεη λα ρακειώζεη ηελ έληαζε ηνπ ήρνπ ζαο, αιιά ε αλαπαξαγσγή λα παξακείλεη ζηελ ίδηα θαηάζηαζε. Θα πξέπεη λα παξαθνινπζείηε ζπλερώο όιεο ηηο αιιαγέο, ώζηε ζε πεξίπησζε πνπ μαλαπάξεη ε εθαξκνγή ην AudioFocus, λα ζπλερηζηεί ε αλαπαξαγσγή από ην ζεκείν πνπ ζηακάηεζε. Δάλ ε απώιεηα είλαη κόληκε, απηό ζεκαίλεη όηη θάπνηα άιιε εθαξκνγή μεθίλεζε ηελ αλαπαξαγσγή ελόο ήρνπ. Απηό ζεκαίλεη όηη ζα πξέπεη λα ζηακαηήζεηε ηελ αλαπαξαγσγή ηνπ ήρνπ ζαο θαη λα θαηαζηξέςεηε ηνλ listener ζαο. ε απηή ηελ πεξίπησζε ζα πξέπεη ν ρξήζηεο λα παηήζεη θάπνην θνπκπί γηα λα μεθηλήζεηε μαλά ηελ αλαπαξαγσγή θάπνηνπ ήρνπ. ην πξνεγνύκελν θώδηθα πάκε θαη πξνζζέηνπκε θώδηθα ώζηε αλάινγα κε ην focuschange λα εθηειείηαη θαη αληίζηνηρνο θώδηθαο. private AudioManager.OnAudioFocusChangeListener maudiofocuslistener = new AudioManager.OnAudioFocusChangeListener() { public void onaudiofocuschange(int focuschange) { // εκτελείταισεαλλαγέρτοςaudiofocus switch (focuschange){ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: // pause break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: // σαμήλωματηρέντασηρ -121-

133 ; break; case AudioManager.AUDIOFOCUS_LOSS: myaudiomanager.unregistermediabuttoneventreceiver( new ComponentName(getPackageName(), MainActivity.class.getName())); myaudiomanager.abandonaudiofocus(maudiofocuslistener); // stop break; case AudioManager.AUDIOFOCUS_GAIN: //RESUME break; Βιέπνπκε όηη ζην AUDIOFOCUS_LOSS θάλνπκε unregister ην event πνπ δεκηνπξγήζακε ζηελ onclick(), θαη θαηαζηξέθνπκε ηνλ listener καο κε ηελ abandonaudiofocus()

134 10 Γηαρείξηζε Φσηνγξαθηθήο θάκεξαο Η θσηνγξαθηθή κεραλή έρεη γίλεη αλαπόζπαζην θαη ηδηαίηεξα δεκνθηιέο θνκκάηη ησλ smartphones θαη ησλ tablets. Μέζα από ηελ εθαξκνγή ζαο κπνξείηε λα δηαρεηξηζηείηε ηηο θάκεξεο ηεο ζπζθεπήο, πξνζθέξνληαο ζηνλ ρξήζηε κνλαδηθέο εκπεηξίεο. ην GooglePlay ππάξρνπλ πάξα πνιιέο εθαξκνγέο κε ηηο νπνίεο κπνξείηε λα ηξαβήμεηε θσηνγξαθίεο θαη λα ηηο πξνζζέζεηε δηάθνξα θίιηξα. ε απηή ηελ ελόηεηα ζα δνύκε πσο κπνξνύκε λα δεκηνπξγήζνπκε κηα εθαξκνγή ε νπνία ζα ρξεζηκνπνηεί ηελ θάκεξα ηεο ζπζθεπήο θαη ζα ηξαβάεη απιέο θσηνγξαθίεο Υξήζε θάκεξαο σο θσηνγξαθηθή κεραλή Γεκηνπξγνύκε έλα λέν project πνπ ην νλνκάδνπκε PhotoCapture. Σν πξώην πξάγκα πνπ ζα πξέπεη λα θάλνπκε είλαη λα δειώζνπκε ζην AndroidManifest.xml αξρείν όηη ε εθαξκνγή καο ζα ρξεζηκνπνηεί ηελ θάκεξα ηεο ζπζθεπήο. Απηό γίλεηαη κε ηελ εμήο γξακκή θώδηθα [21]. <uses-feature android:name="android.camera.hardware" android:required="true"/> Με απηόλ θώδηθα δειώλνπκε όηη ε εθαξκνγή καο ρξεζηκνπνηεί θάκεξα θαη όηη ε παξνπζία θάκεξαο ζηελ ζπζθεπή είλαη απαξαίηεηε. Αλ ε εθαξκνγή ρξεζηκνπνηεί θάκεξα, αιιά δελ είλαη πξναπαηηνύκελε γηα λα ηξέμεη ζσζηά όιε ε εθαξκνγή, κπνξνύκε λα ζέζνπκε ηελ παξάκεηξν required σο false. ε απηή ηελ πεξίπησζε ζα πξέπεη θάζε θνξά πνπ ηξέρεη ε εθαξκνγή λα ειέγρνπκε σο ππάξρεη θάκεξα ζηελ ζπζθεπή, αιιηώο λα κελ εθηειείηαη ν θώδηθαο πνπ έρεη ζρέζε κε ηελ θάκεξα. Ο ζπγθεθξηκέλνο έιεγρνο γίλεηαη κε ηελ εληνιή hassystemfeature(packagemanager.feature_camera) ηεο θιάζεο getpackagemanager()

135 Μηα άιιε ζεκαληηθή παξάκεηξνο ηεο εθαξκνγήο ζαο είλαη λα απνθαζίζεηε αλ ηα αξρεία πνπ ζα παξάγνληαη (θσηνγξαθίεο ή βίληεν ή θαη ηα δύν) ζα είλαη θνηλόρξεζηα ή ζα είλαη πξνζβάζηκα κόλν από ηελ εθαξκνγή ζαο, όπσο επίζεο αλ ε απνζήθεπζε ζα γίλεηαη ζηελ κλήκε ηεο ζπζθεπήο ή ζε εμσηεξηθή κλήκε.αλάινγα κε ην ηη ζέιεηε λα θάλεηε ζα πξέπεη λα ρξεζηκνπνηήζεηε θαη δηαθνξεηηθό ηξόπν απνζήθεπζεο θαη αλάθηεζεο ησλ δεδνκέλσλ από ηνλ θάθειν, όπσο δείμακε ζην θεθάιαην 7. ην mainactivity ζα πξνζζέζνπκε έλα θνπκπί γηα λα ηξαβάεη θσηνγξαθίεο θαη έλα ImageView, πάλσ ζην νπνίν ζα γίλεηαη ε πξνβνιή ηεο θσηνγξαθίαο.η νζόλε καο έρεη ηελ αθόινπζε κνξθή Δηθόλα 98: βαζηθή νζόλε εθαξκνγήο ελώ ν θώδηθαο πνπ πξνζηέζεθε ζην activity_main.xml είλαη ν επόκελνο -124-

136 <?xm lversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal center_vertical"> <RelativeLayoutandroid:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="6" android:gravity="center_horizontal center_vertical"> android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"/> <ImageView android:layout_width="fill_parent" android:layout_height="wrap_content"/> </RelativeLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/> </LinearLayout> </LinearLayout> Δπόκελν βήκα είλαη λα γξάςνπκε ηνλ θαηάιιειν θώδηθα ζηελ θιάζε MainActivity.java. Αξρηθά δειώλνπκε ηηο παξακέηξνπο πνπ ζα ρξεζηκνπνηήζνπκε θαη δειώλνπκε ζε πνηα αληηθείκελα ηνπ activity αληηζηνηρεί ην θαζέλα. public class MainActivity extends Activity { protected Button _buttonphoto; protected ImageView _image; protected String public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); _image = ( ImageView ) findviewbyid( R.id.image ); _buttonphoto = ( Button ) findviewbyid( R.id.buttonPhoto); -125-

137 ButtonClickHandler clickhandler=new ButtonClickHandler(); _buttonphoto.setonclicklistener( clickhandler ); _path = Environment.getExternalStorageDirectory() + "/images/my_photo.jpg"; Η κέζνδνο setonclicklistener() είλαη κηα callback κέζνδνο, ε νπνία εθηειείηαη όηαλ παηεζεί ην θνπκπί. Όηαλ παηεζεί ην θνπκπί ε κέζνδνο πνπ ζα εθηειεζηεί είλαη ε ButtonClickHandler(). ηε κεηαβιεηή _string απνζεθεύνπκε ηελ δηαδξνκή θαη ην όλνκα κε ην νπνίν ζα απνζεθεπηεί ε θσηνγξαθία καο. Βιέπνπκε όηη ζην ζπγθεθξηκέλν παξάδεηγκα έρνπκε επηιέμεη ε θσηνγξαθία λα απνζεθεπηεί ζε εμσηεξηθή κλήκε. ε απηό ην ζεκείν ζα πξέπεη λα είκαζηε ζίγνπξνη όηη έρνπκε νξίζεη ζηνλ emulator ρώξν κλήκεο γηα εμσηεξηθή κλήκε SD. Γηα λα ην ειέγμνπκε απηό ζα πξέπεη λα αλνίμνπκε ην Android Virtual Device Manager (Window ->Android Virtual Manager) Δηθόλα100 : Άλνηγκα Android Virtual Device Manager θαη ειέγρνπκε αλ έρνπκε ζέζεη ηηκή ζην πεδίν SD. Αλ δελ έρνπκε ζέζεη, βάδνπκε ηώξα κηα ηηκή, π.ρ. 200 θαη παηάκε ΟΚ

138 Δηθόλα 99 : Ρύζκηζε ρσξεηηθόηεηαο SDCard Ο θώδηθαο ηεο ButtonClickHandler() είλαη ν εμήο: Public class ButtonClickHandler implements View.OnClickListener { public void onclick( View view ){ if (getpackagemanager().hassystemfeature(packagemanager.feature_camera)){ File file = new File( _path ); Uri outputfileuri = Uri.fromFile( file ); Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE ); intent.putextra( MediaStore.EXTRA_OUTPUT, outputfileuri ); startactivityforresult( intent, 0 ); Αξρηθά ειέγρνπκε αλ ε ζπζθεπή δηαζέηεη θάκεξα. Αλ δελ δηαζέηεη δελ εθηειείηαη θαλέλαο θώδηθαο. Αιιηώο μεθηλάεη ε εθηέιεζε ηεο έλαξμεο ηεο θάκεξαο. ηε κεηαβιεηή Fileνξίδνπκε όηη ην αξρείν ζα βξίζθεηαη ζηνλ θάθειν πνπ δειώζακε ζηελ κεηαβιεηή _path, ηελ νπνία ζηελ ζπλέρεηα νξίδνπκε σοuri. ην Intent δειώλνπκε όηη ε ελέξγεηά καο ζα είλαη ε ρξήζε ηεο θάκεξαο γηα θσηνγξαθίεο, ελώ κε ηελ ρξήζε ηεο putextra πξνζζέηνπκε εθηεηακέλα δεδνκέλα ζην Intent. ηελ ζπγθεθξηκέλε πεξίπησζε ηνπ δειώλνπκε όηη ε θσηνγξαθία πνπ ζα ηξαβερηεί ζα απνζεθεπηεί ζε ζπγθεθξηκέλν θάθειν, ζε απηόλ πνπ νξίζακε ζην URI

139 Με ηελ κέζνδν startactivityforresult(), ελεκεξώλνπκε ην ιεηηνπξγηθό όηη ζα μεθηλήζνπκε έλα activity, από ην νπνίν επηζπκνύκε ην ιεηηνπξγηθό λα καο επηζηξέςεη έλα απνηέιεζκα, ώζηε λα ην δηαρεηξηζηνύκε αληηζηνίρσο. Σν activity πνπ ζα μεθηλήζεη είλαη απηό πνπ νξίζακε ζην Intent, ελώ όηαλ ε δεύηεξε παξάκεηξνο είλαη κεγαιύηεξε ή ίζε κε ην 0, ηόηε ην απνηέιεζκα πνπ ζα επηζηξαθεί ζηελ ξνπηίλα onactivityresult() ζα είλαη ν ίδηνο αξηζκόο. Δκείο ζην παξάδεηγκά καο ζέηνπκε ηελ δεύηεξε παξάκεηξν ίζε κε 0. Όηαλ ε ξνπηίλα onactivityresult(), επηζηξέςεη 0, ζεκαίλεη όηη ην activity καο ηειείσζε. Ο θώδηθαο ηεο ξνπηίλαο OnActivityResult() παξνπζηάδεηαη ζηελ ζπλέρεηα. protected void onactivityresult(int requestcode, int resultcode, Intent data) { switch( requestcode ) { case 0: if (resultcode == RESULT_OK) { BitmapFactory.Options options = new BitmapFactory.Options(); options.insamplesize = 4; Bitmap bitmap = BitmapFactory.decodeFile( _path, options ); _image.setimagebitmap(bitmap); break; Η κεηαβιεηή requestcode είλαη ε κεηαβιεηή ηελ νπνία ζέζακε ζηελ κέζνδν startactivityforresult(), ε resultcode είλαη ην απνηέιεζκα πνπ επηζηξέθεηαη ελώ ε κεηαβιεηή Intent είλαη ην Intent κε ην νπνίν θαιέζακε ηελ startactivityforresult(). ηελ δηθή καο πεξίπησζε ην Intent είλαη έλα Bitmap. Αλ ην απνηέιεζκα είλαη ΟΚ, ηόηε απνθσδηθνπνηνύκε ην αξρείν πνπ έρεη απνζεθεπηεί ζηνλ θάθειν πνπ νξίζακε, θαη ην εκθαλίδνπκε ζην ImageView πνπ έρνπκε βάιεη ζην activity_main.xml Παηώληαο ηώξα ην θνπκπί "TakePhoto" εκθαλίδεηαη ε επόκελε νζόλε -128-

140 Δηθόλα 100 : Άλνηγκα θάκεξαο ζπζθεπήογηα ιήςε θπηνγξαθίαο Σώξα έρεη κπεη ζε ιεηηνπξγία ε θάκεξα ηνπ Emulator. Δπεηδή δελ έρνπκε θαλνληθή θάκεξα, γη`απηό καο εκθαλίδεη ηελ εμήο εηθόλα. ε θαλνληθή ζπζθεπή ζα καο δείρλεη ηελ πίζσ θάκεξα, ελώ κπνξνύκε λα θάλνπκε θαη ελαιιαγή θακεξώλ, αλ θπζηθά ην ππνζηεξίδεη ε ζπζθεπή, παηώληαο ην θνπκπί κε ηελ θάκεξα. Παηώληαο ηώξα ηνλ κπιε θύθιν ηξαβάεη θσηνγξαθία, ηελ νπνία εκθαλίδεη ακέζσο. Σν απνηέιεζκα είλαη ην αθόινπζν

141 Δηθόλα 101: Δκθάληζε θσηνγξαθίαο ζην ImageView Η εθαξκνγή ηεο θάκεξαο ηνπ Android θσδηθνπνηεί ηελ θσηνγξαθία πνπ επηζηξέθεη ην Intent θαη ζε κηθξό κέγεζνο (thumbnail), σο έλα Bitmap κε ην θιεηδί "extra".αλ ζέινπκε λα εκθαλίδνπκε ην thumbnail ηεο θσηνγξαθίαο, ηόηε ν θώδηθαο ζηελ onactivityresult()ζα πξέπεη λα αιιαρζεί σο Protected void onactivityresult(int requestcode, int resultcode, Intent data) { switch( requestcode ) { case 0: if (resultcode == RESULT_OK) { Bundle extras=data.getextras(); BitmapFactory.Options options = new BitmapFactory.Options(); options.insamplesize = 4; Bitmap bitmap = (Bitmap)extras.get("data"); break; -130-

142 10.2 Καηαγξαθή Βίληεν. Γηα ηελ θαηαγξαθή βίληεν ν θώδηθαο είλαη παξαπιήζηνο κε ηνλ θώδηθα πνπ γξάςακε γηα ηελ ιήςε θσηνγξαθηώλ [22]. ην activity_main.xml πξνζζέηνπκε έλα αθόκα θνπκπί, γηα λα μεθηλάεη ε θαηαγξαθή βίληεν, ην νπνίν ζα νκαδνπνηήζνπκε καδί κε ην πξνεγνύκελν θνπκπί ζε έλα LinearLayout. Δπίζεο ζα πξνζζέζνπκε θαη έλα VideoView, πάλσ ζην νπνίν ζα γίλεηαη ε αλαπαξαγσγή ηνπ βίληεν. Αξρηθά ην VideoView ζα είλαη κε νξαηό, θαη νξαηό ζα είλαη ην ImageView. Αλάινγα κε ηελ επηινγή πνπ ζα θάλεη ν ρξήζηεο ζα γίλεηαη πόηε ην έλα θα πόηε ην άιιν νξαηό. Μεηά από απηέο ηηο πξνζζήθεο ν θώδηθαο ηνπ xmlέρεη απηή ηελ κνξθή: <VideoView android:layout_height="wrap_content" android:layout_width="wrap_content" android:visibility="invisible" /> </RelativeLayout> <LinearLayout android:orientation="horizontal" android:layout_height="wrap_content" android:layout_width="match_parent" > android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"/> android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="1" /> </LinearLayout> Καη ην UI καο έρεη πιένλ ηελ αθόινπζε κνξθή: -131-

143 Δηθόλα 102 : Πξνζζήθε θνπκπηνύ γηα θαηαγξαθή βίληεν ηελ ζπλέρεηα ζα πξέπεη λα θάλνπκε θαη αληίζηνηρεο αιιαγέο θαη ζηελ θιάζε MainActivity.java. Αξρηθά ζα πξέπεη λα δειώζνπκε θάπνηεο λέεο κεηαβιεηέο. Public class MainActivity extends Activity { protected Button _buttonphoto; protected Button _buttonvideo; protected ImageView _image; protected VideoView _video; protected String _path; protected static final int PHOTO=1; protected static final int public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); _image = ( ImageView ) findviewbyid( R.id.image ); _buttonphoto = ( Button ) findviewbyid( R.id.buttonPhoto); _buttonvideo = ( Button ) findviewbyid( R.id.buttonVideo); ButtonClickHandler clickhandler=new ButtonClickHandler(); _buttonphoto.setonclicklistener( clickhandler ); _buttonvideo.setonclicklistener( clickhandler); -132-

144 _path = Environment.getExternalStorageDirectory() + "/images/my_photo.jpg"; Η κεηαβιεηή _video ηύπνπ VideoView νξίδνπκε όηη αληηζηνηρεί ζην VideoView πνπ έρνπκε πξνζζέζεη ζην activity_main.xml, ελώ αληίζηνηραε _button Video ζην θνπκπί πνπ πξνζζέζακε. Δπηπιένλ έρνπκε δειώζεη δπν λέεο κεηαβιεηέο ηύπνπ int, ηηο PHOTO θαη VIDEO, πνπ ζα ηηο ρξεζηκνπνηήζνπκε ζηελ θιήζε ηεο startactivityforresult, γηα λα μερσξίδνπκε από πνηα δηεξγαζία έγηλε ε θιήζε. Δπίζεο νξίδνπκεέλα γεληθό ButtonClickHandler, ε νπνία ζα ηξέρεη παηώληαο έλα από ηα δπν θνπκπηά. Ο θώδηθαο ηνπ ButtonClickHandler έρεη αιιάμεη θαη απηόο σο εμήο. public class ButtonClickHandler implements View.OnClickListener { public void onclick( View view ){ if (getpackagemanager().hassystemfeature(packagemanager.feature_camera)){ if (view == _buttonphoto){ File file = new File( _path ); Uri outputfileuri = Uri.fromFile( file ); Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE ); intent.putextra( MediaStore.EXTRA_OUTPUT, outputfileuri ); startactivityforresult( intent, PHOTO ); if (view == _buttonvideo){ Intent takevideointent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); startactivityforresult(takevideointent, VIDEO); Αξρηθά γίλεηαη ν έιεγρνο γηα ην αλ ζηελ ζπζθεπή ππάξρεη θάκεξα. Αλ ππάξρεη γίλεηαη έλαο δεύηεξνο έιεγρνο από πνην θνπκπί έγηλε ε θιήζε. Αλ έρεη γίλεη από ην θνπκπί γηα ηηο θσηνγξαθίεο, ν θώδηθαο είλαη ίδηνο, εθηόο από ηελ δεύηεξε παξάκεηξν ηεο startactivityforresult, πνπ πιένλ είλαη ε κεηαβιεηή PHOTO, πνπ δειώζακε αξρηθά. Αλ ε θιήζε γίλεη από ην θνπκπί γηα ηελ θαηαγξαθή βίληεν, δειώλεηαη έλα λέν Intent, ζην νπνίν δειώλεηαη όηη ε ελέξγεηα πνπ ζα θάλνπκε είλαη ε ρξήζε ηεο θάκεξαο γηα θαηαγξαθή βίληεν. Καη ζηελ ζπλέρεηα θαινύκε ηελ startactivityforresult(), κε δεύηεξε παξάκεηξν ηελ κεηαβιεηή VIDEO

145 ηελ ζπλέρεηα ζα πξέπεη λα πξνρσξήζνπκε θαη ζε θάπνηεο αιιαγέο θαη ζηελ Protected void onactivityresult(int requestcode, int resultcode, Intent data) { switch( requestcode ) { case PHOTO: if (resultcode == RESULT_OK) { BitmapFactory.Options options = new BitmapFactory.Options(); options.insamplesize = 4; Bitmap bitmap = BitmapFactory.decodeFile( _path, options ); _image.setimagebitmap(bitmap); _video.setvisibility(view.invisible); _image.setvisibility(view.visible); break; case VIDEO: Uri mvideouri = data.getdata(); _video.setvideouri(mvideouri); _image = null; _video.setvisibility(view.visible); _image.setvisibility(view.invisible); break; Οη αιιάγεο πνπ έγηλαλ όζν αθνξά ηελ ιήςε θσηνγξαθίαο είλαη όηη πξνζηέζεθε θώδηθαο πνπ θαζαξίδεη ην VideoView, ελώ παξάιιεια ην ζέηεη σο κε νξαηό θαη θάλεη νξαηό ην ImageView. Αλ ηώξα ε ελέξγεηα πνπ έρεη θαιέζεη ηελ κέζνδν είλαη ε θαηαγξαθή βίληεν, ηόηε δεκηνπξγείηαη έλα θαηλνύξγην Uri κε ηα δεδνκέλα ηνπ Intent, ηα νπνία ηνπνζεηνύληαη επάλσ ζην VideoView. Παξάιιεια θαζαξίδεη ην ImageView, ην νπνίν γίλεηαη κε νξαηό, ελώ γίλεηαη νξαηό ην VideoView. Αλ ηώξα μαλάηξέμνπκε ηελ εθαξκνγή θαη παηήζνπκε ην θνπκπί RecordingVideo ζα δνύκε ηελ επόκελε νζόλε

146 Δηθόλα 103 : Άλνηγκα θάκεξαο ζπζθεπήο γηα θαηαγξαθή βίληεν Πιένλ έρεη ελεξγνπνηεζεί ε θάκεξα ζε ιεηηνπξγία βίληεν. Ιζρύνπλ ηα ίδηα όπσο θαη κε ηελ ιήςε θσηνγξαθίαο. Αλ ηώξα παηήζνπκε ην θόθθηλν θνπκπί ζα αξρίζεη ε θαηαγξαθή βίληεν, ε νπνία θαη ζα ζηακαηήζεη όηαλ μαλαπαηήζνπκε ην θνπκπί

147 Δηθόλα 104 : Καηαγξαθή βίληεν Όηαλ ζηακαηήζεη ε θαηαγξαθή, θνξηώλεηαη ζην VideoViewζην βίληεν πνπ κόιηο ηξαβήμακε

148 Δηθόλα 105 : Φόξησζε βίληεν ζην VideoView Δάλ παηήζνπκε ην πιήθηξν Playπνπ έρεη εκθαληζηεί, ζα αξρίζεη ε αλαπαξαγσγή ηνπ βίληεν πνπ κόιηο θαηαγξάςακε

149

150 11 Γηαρείξηζε επαθώλ O ContactsProvider είλαη ην θεληξηθό ζεκείν ζην νπνίν βξίζθνληαη απνζεθεπκέλεο όιεο νη πιεξνθνξίεο ησλ επαθώλ ηνπ ρξήζηε, είηε απηέο είλαη επαθέο πεξαζκέλεο ζην ηειέθσλό ηνπ είηε είλαη επαθέο από θάπνην socialmedia. Από ηελ εθαξκνγή ζαο κπνξείηε λα έρεηε πξόζβαζε απεπζείαο ζηηο πιεξνθνξίεο απηέο κε ηελ ρξήζε ησλ κεζόδσλ ηεο θιάζεο ContentResolver[23] Αλάθηεζε ιίζηαο επαθώλ Όηαλ ιέκε αλάθηεζε ιίζηαο επαθώλ ελλννύκε ηελ αλαδήηεζε ζηελ ιίζηα επαθώλ ηνπ ρξήζηε θαη ηελ επηζηξνθή ησλ απνηειεζκάησλ, κε βάζε ηα θξηηήξηα πνπ έρεη ζέζεη γηα ηελ αλαδήηεζε. Η αλαδήηεζε κπνξεί λα γίλεη κε ηξεηο δηαθνξεηηθνύο ηξόπνπο. [24] Αλαδήηεζε κε βάζε ην όλνκα ηεο επαθήο : Δπηζηξέθεη κηα ιίζηα επαθώλ πνπ είηε έρνπλ ην ίδην όλνκα κε απηό πνπ γίλεηαη αλαδήηεζε είηε ηαηξηάδεη θάπνην θνκκάηη ηνπ νλόκαηνο κε απηό ηεο αλαδήηεζεο. Αλαδήηεζε κε βάζε θάπνην άιιν θξηηήξην : Η αλαδήηεζε γίλεηαη ζε θάπνηα πιεξνθνξία ηεο επαθήο πνπ έρεη νξίζεη ν ρξήζηε. Π.ρ. κε βάζε ηνλ ηειεθσληθό αξηζκό ή κε βάζε ην . Γεληθή Αλαδήηεζε : Η αλαδήηεζε γίλεηαη ζε όιεο ηηο πιεξνθνξίεο ηεο επαθήο. Γειαδή κε βάζε ην θξηηήξην αλαδήηεζεο γίλεηαη έιεγρνο ζην όλνκα θάζε επαθήο, ζην ηειέθσλν, ζην θιπ. Σν πξώην πξάγκα πνπ ζα πξέπεη λα θάλνπκε είλαη λα δειώζνπκε ζην AndroidManifest.xml όηη ε εθαξκνγή καο ζα ρξεηάδεηαη άδεηα γηα λα δηαβάζεη ηηο επαθέο ηνπ ρξήζηε. Απηό επηηπγράλεηαη κε ηνλ εμή οθώδηθα. <uses-permission android:name="android.permission.read_contacts" /> Γηα λα δείμνπκε ηα απνηειέζκαηα ηεο αλαδήηεζεο πάλσ ζηελ εθαξκνγή, ζα πξέπεη λα πξνζζέζνπκε έλα TextView

151 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparentright="true" android:layout_alignparenttop="true" android:layout_margin="10dp" android:gravity="center" /> Γηα ηελ αλάγλσζε ησλ επαθώλ από ηελ ζπζθεπή ζα ρξεζηκνπνηήζνπκε ηελ κέζνδν ContactsContract.Contacts, θ οποία είναι ςαν ο ενδιάμεςοσ μεταξφ τθσ εφαρμογισ και των επαφϊν. Ουςιαςτικά κρατάει όλθ τθν πλθροφορία του πίνακα ςτον οποίο είναι αποκθκευμζνεσ οι επαφζσ. Με βάςθ τα properties που διακζτει, μποροφμε να ορίςουμε πάνω ςε ποια πεδία τθσ επαφισ κα γίνει θ αναηιτθςθ. Μζςα ςτο αρχείο MainActivity.java μποροφμε να γράψουμε μια μζκοδο, θ οποία κα κάνει αναηθτιςεισ ςτισ επαφζσ. Έςτω ότι ονομάηουμε τθν μζκοδο GetContacts(). Αρχικά δθλϊνουμε τισ μεταβλθτζσ που κζλουμε String phonenumber = null; String = null; Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; String _ID = ContactsContract.Contacts._ID; String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; Με ηελ εληνιή Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI; δειώλνπκε κηα κεηαβιεηή Uri, ζηελ νπνία απνζεθεύεηαη ην Uri ηνπ πίλαθα πνπ θξαηάεη ηηο επαθέο. Με απηό ηνλ ηξόπν δελ ρξεηάδεηαη λα δειώζνπκε εκείο νλόκαηα πηλάθσλ ζηειώλ θιπ., γηαηί δεκηνπξγνύληαη απηόκαηα. Με ηελ εληνιή String _ID = ContactsContract.Contacts._ID; δειώλνπκε κηα κεηαβιεηή ε νπνία ζα είλαη ηύπνπ string, θαη ε νπνία θξαηάεη ην πεδίν ηνπ κνλαδηθνύ ID ηεο γξακκήο

152 Με ηελ εληνιή String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME; δειώλνπκε κηα κεηαβιεηή ε νπνία ζα είλαη ηύπνπ string, θαη ε νπνία ζα θξαηάεη ην πεδίν ηνπ νλόκαηνο ηεο επαθήο. Με ηελ εληνιή String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER; δειώλνπκε κηα κεηαβιεηή ε νπνία ζα θξαηάεη αλ ε επαθή έρεη έζησ θαη έλα ηειεθσληθό αξηζκό. ηελ ζπλέρεηα δειώλνπκε κεηαβιεηέο νη νπνίεο ζα θξαηάλε ηνπο ηύπνπο γηα ηα δεδνκέλα πνπ ρξεηαδόκαζηε κέζα από θάζε επαθή. Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER; Uri CONTENT_URI = ContactsContract.CommonDataKinds. .CONTENT_URI; String CONTACT_ID = ContactsContract.CommonDataKinds. .CONTACT_ID; String DATA = ContactsContract.CommonDataKinds. .DATA; Η ινγηθή ησλ δειώζεσλ είλαη ε ίδηα κε πξηλ, κε ηελ κόλε δηαθνξά όηη ηα properties ηώξα αλήθνπλ ζην αληηθείκελν ContactsContract.CommonDataKinds. Σν ζπγθεθξηκέλν αληηθείκελν πεξηιακβάλεη θιάζεηο πνπ αληηζηνηρνύλ ζε όινπο ηνπο πηζαλνύο ηύπνπο δεδνκέλσλ πνπ κπνξεί λα είλαη απνζεθεπκέλνη ζηνπο αληίζηνηρνπο πίλαθεο. Δδώ ρξεζηκνπνηνύκε ηηο θιάζεηο γηα ην ηειέθσλν (ContactsContract.CommonDataKinds.Phone), ν νπνίνο δηαβάδεη ηνλ πίλαθα πνπ απνζεθεύνληαη νη ηειεθσληθνί αξηζκνί, θαη γηα ην (ContactsContract.CommonDataKinds. ), ν νπνίνο δηαβάδεη ηνλ αληίζηνηρν πίλαθα πνπ θξαηάεη ηηο πιεξνθνξίεο γηα ηα . Η ζύλδεζε κεηαμύ ηνπ πίλαθα ησλ επαθώλ θαη ηνπ πίλαθα ησλ ηειεθώλσλ γίλεηαη κε ηα πεδία ID από ηνλ πίλαθα ησλ επαθώλ θαη CONTACT_ID από ηνλ πίλαθα ησλ ηειεθώλσλ. Αληίζηνηρε είλαη θαη ε ζύλδεζε κε ηνλ πίλαθα ησλ s. ηελ ζπλέρεηα δειώλνπκε έλα StringBuffer, ν νπνίνο ζα θξαηάεη ηα απνηειέζκαηα πνπ βξίζθνπκε, θαη ηνλ θέξζνξα πνπ ζα ηξέμεη ην query ηεο αλαδήηεζε. StringBuffer output = new StringBuffer(); ContentResolver contentresolver = getcontentresolver(); -141-

153 Cursor cursor = contentresolver. query(content_uri, null, null, null, null); Καηόπηλ ειέγρνπκε αλ ν θέξζνξαο έρεη απνηειέζκαηα ή αλ ε ζπζθεπή δελ έρεη θαζόινπ επαθέο if (cursor.getcount() > 0) { while (cursor.movetonext()) { String contact_id = cursor.getstring(cursor.getcolumnindex( _ID )); String name = cursor.getstring(cursor.getcolumnindex( DISPLAY_NAME )); int hasphonenumber = Integer.parseInt( cursor.getstring(cursor.getcolumnindex( HAS_PHONE_NUMBER ))); if (hasphonenumber > 0) { output.append("\n First Name:" + name); Cursor phonecursor = contentresolver.query( PhoneCONTENT_URI, null, Phone_CONTACT_ID + " =?", new String[] { contact_id, null); while (phonecursor.movetonext()) { phonenumber = phonecursor.getstring(phonecursor.getcolumnindex(number)); output.append("\n Phone number:" + phonenumber); phonecursor.close(); Δάλ έρεη επαθέο, ηόηε μεθηλάκε λα δηαβάδνπκε γξακκή γξακκή ηνλ θέξζνξα, ώζηε λα απνζεθεύζνπκε ζηνλ StringBuilder ηα απνηειέζκαηα πνπ ζέινπκε. Αξρηθά ειέγρνπκε γηα ην αλ ε επαθή έρεη ηειεθσληθνύο αξηζκνύο. Αλ έρεη, απνζεθεύνπκε ην όλνκα ηεο εγγξαθήο θαη ζηελ ζπλέρεηα δεκηνπξγνύκε έλαλ λέν θέξζνξα, ν νπνίνο δηαβάδεη όινπο ηνπο ηειεθσληθνύο αξηζκνύο ησλ εγγξαθώλ πνπ ην Phone_Contact_ID είλαη ίζν κε ην ηξέρσλ _IDηνπ βαζηθνύ θέξζνξα. Καηόπηλ απνζεθεύνπκε όινπο ηνπο ηειεθσληθνύο αξηζκνύο ηνπ, θαη ζην ηέινο θιείλνπκε ηνλ θέξζνξα. Με ηελ ίδηα ινγηθή δηαβάδνπκε θαη όια ηα δεδνκέλα ζρεηηθά κε ην ηεο θάζε επαθήο

154 Cursor cursor = contentresolver.query( CONTENT_URI, null, CONTACT_ID+ " =?", new String[] { contact_id, null); while ( cursor.movetonext()) { = cursor.getstring( cursor.getcolumnindex(data)); output.append("\n " + ); cursor.close(); Αθνύ νινθιεξώζνπκε θαη ηελ εγγξαθή ηνπ , ηόηε ζα πξέπεη λα αιιάμνπκε κηα ζεηξά ζηνλ StringBuilder, ώζηε ε επόκελε εγγξαθή πνπ ζα θαηαρσξεζεί, λα μεθηλάεη από λέα ζεηξά. output.append("\n"); Όηαλ νινθιεξσζεί ε δηαδηθαζία θαη πεξαζηνύλ ζηνλ stringbuilder όιεο νη εγγξαθέο, κπνξνύκε λα ηηο εκθαλίζνπκε ζην TextView πνπ έρνπκε ζην activity σο εμήο. outputtext.settext(output); Αθνύ έρνπκε νινθιεξώζεη ηελ αλάγλσζε ην δεδνκέλσλ από ηνλ θέξζνξα, ζα πξέπεη λα ηνλ θιείζνπκε. cursor.close(); Με απηό ηνλ ζρεηηθά απιό ηξόπν κπνξνύκε λα εκθαλίζνπκε νιόθιεξε ηελ ιίζηα επαθώλ κηαο ζπζθεπήο ζηνλ ρξήζηε. Δάλ ηώξα ζέινπκε λα πάξνπκε ηα δεδνκέλα γηα θάπνηα ζπγθεθξηκέλε επαθή, ην κόλν πνπ ρξεηάδεηαη λα θάλνπκε είλαη λα παξακεηξνπνηήζνπκε θαηαιιήισο ηνλ θέξζνξα cursor Cursor cursor = contentresolver. query(content_uri, null, DISPLAY_NAME + " LIKE?", new String[] {"%Giorgos%", null); -143-

155 Γηα παξάδεηγκα κε ηνλ πξνεγνύκελν θώδηθα, ν θέξζνξαο ζα πεξηέρεη όιεο ηηο επαθέο πνπ ζην displayname ηνπο πεξηέρνπλ ηελ ιέμε Giorgos Δηζαγσγή θαη επεμεξγαζία επαθήο. Μία πνιύ ρξήζηκε δπλαηόηεηα είλαη ε δπλαηόηεηα εηζαγσγήο ή επεμεξγαζίαο ησλ επαθώλ. Με απηό ηνλ ηξόπν ζαο δίλεηαη ε δπλαηόηεηα κέζα από ηελ εθαξκνγή ζαο είηε λα θαηαρσξήζεηε κηα λέα επαθή είηε λα αλνίμεηε κηα ππάξρνπζα επαθή γηα επεμεξγαζία Δηζαγσγή επαθήο. Γηα λα εηζάγεηε κηα επαθή από ηελ εθαξκνγή ζαο ζα πξέπεη λα δεκηνπξγήζεηε έλα Intent, κε ην νπνίν ζα θαιέζεηε ην αληίζηνηρν activity πνπ ζα αλνίμεη ηελ νζόλε εηζαγσγήο λέαο επαθήο. Παξάιιεια κπνξείηε λα ζέζεηε ηηκέο ζε θάπνηα πεδία, όπσο ν ηειεθσληθόο αξηζκόο, ην όλνκα, ην , έηζη ώζηε όηαλ αλνίμεη ε νζόλε εηζαγσγήο, ηα αληίζηνηρα πεδία λα έρνπλ ήδε κηα ηηκή. Αξρηθά δειώλνπκε έλα λέν Intent. Intent intent = new Intent(Intents.Insert.ACTION); intent.settype(contactscontract.rawcontacts.content_item_type); Η ελέξγεηα πνπ ηνπ δειώλνπκε είλαη Insert, ελώ ν ηύπνο ησλ εγγξαθώλ πνπ ζα θάλεη εηζαγσγή είλαη ContactsContract.RawContacts.ContentType. Η εληνιή ContactsContract.RawContacts.ContentType δειώλεη όηη έρσ κηα εγγξαθή ζε αξρηθή κνξθή, ρσξίο ID. αλ επηπιένλ δεδνκέλα ζην Intent κπνξνύκε λα ζέζνπκε αξρηθέο ηηκέο ζε θάπνηα πεδία, κε απνηέιεζκα όηαλ αλνίμεη ε εθαξκνγή AddContacts ηνπ Android απηά ηα πεδία λα είλαη πξνζπκπιεξσκέλα. Απηέο νη ηηκέο κπνξεί λα είλαη ηηκέο πνπ έρεη ζέζεη ν ρξήζηεο ζε θάπνηα πεδία κέζα ζηελ εθαξκνγή καο, όπσο όλνκα, ηειέθσλν ή . Γηα παξάδεηγκα έζησ όηη ζηελ νζόλε ηεο εθαξκνγήο καο έρνπκε δπν πεδία EditText, ηα id ησλ νπνίσλ είλαη phonetext θαη nametext

156 Με ηηο επόκελεο γξακκέο θώδηθα κπνξνύκε λα πεξάζνπκε ηηο ηηκέο πνπ ζα δώζεη ν ρξήζηεο ζαλ ηηκέο ηεο λέαο επαθήο πνπ ζα δεκηνπξγεζεί, θαη λα μεθηλήζεη ε αληίζηνηρε εθαξκνγή. intent.putextra(contactscontract.intents.insert. , text.gettext()); intent.putextra(contactscontract.intents.insert.phone, phonetext.gettext()); startactivity(intent); Δπεμεξγαζία ήδε ππάξρνπζαο επαθήο Η θιήζε ηεο εθαξκνγή AddContactηνπ Android γηα επεμεξγαζία κηαο επαθήο, είλαη κηα δηαδηθαζία παξόκνηα κε απηή ηεο εηζαγσγήο κηαο λέαο επαθήο.η βαζηθή δηαθνξά είλαη ε ρξήζε ηεο ContractsContract.Contants.CONTENT_LOOKUP_URI. Με ηελ ζπγθεθξηκέλε εληνιή δεκηνπξγνύκε κηα ζύλδεζε καθξάο δηάξθεηαο κε ηε εγγξαθή πνπ πίλαθα πνπ ηνπ έρνπκε δειώζεη, ώζηε λα κπνξέζνπκε λα επεμεξγαζηνύκε ηελ επαθή όζε ώξα ζέινπκε. Υξεζηκνπνηνύκε ηε ζπγθεθξηκέλε εληνιή, ώζηε αλ θαηά ηελ δηάξθεηα ηεο επεμεξγαζίαο γίλεη θάπνηνο ζπγρξνληζκόο ησλ επαθώλ, θαη ην ID ηεο επαθήο αιιάμεη, λα κελ δεκηνπξγεζεί θάπνην πξόβιεκα. Καη απηό γηαηί ην ιεηηνπξγηθό ζα αλαδεηήζεη από κόλν ηνπ ηελ εγγξαθή κε ην ID πνπ έρεη ην CONTENT_LOOKUP_URI, ζα ηελ εληνπίζεη αθόκα θαη αλ έρεη αιιάμεη ID, θαη ζα ζπγρξνλίζεη ηηο αιιαγέο πνπ θάλακε.[25] Έζησ όηη ε εθαξκνγή καο δίλεη ηελ δπλαηόηεηα ζηνλ ρξήζηε λα αλνίμεη γηα επεμεξγαζία κηα επαθή κε βάζε ην ηειεθσληθό αξηζκό πνπ ζα δώζεη. Αξρηθά ζα πξέπεη λα βξνύκε ηνλ ηειεθσληθό αξηζκό ζην πίλαθα ησλ ηειεθώλσλ, λα θξαηήζνπκε ζε κηα κεηαβιεηή ην IDηεο επαθήο ζηελ νπνία αληηζηνηρεί ην ηειέθσλν, θαηόπηλ λα βξνύκε ηελ επαθή, θαη κε βάζε απηό ην IDλα αλνίμνπκε ηελ επαθή. Αξρηθά δειώλνπκε ηελ κεηαβιεηή ε νπνία ζα θξαηάεη ην Uri ηνπ πίλαθα ησλ ηειεθώλσλ θαη ηηο κεηαβιεηέο πνπ ζα θξαηάλε ηηο ζηήιεο ηνπ ηειεθσληθνύ αξηζκνύ θαη ηνπ ID ηεο επαθήο από ηνλ πίλαθα ησλ ηειεθώλσλ. Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String PHONE_NUMBER= ContactsContract.CommonDataKinds.Phone.NUMBER; String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID; -145-

157 Αληίζηνηρα δειώλνπκε θαη ηελ κεηαβιεηή πνπ ζα θξαηάεη ην Uri ηνπ πίλαθα ησλ επαθώλ θαη ηελ κεηαβιεηή πνπ ζα θξαηάεη ην ID ηεο επαθήο. Uri CONTACT_URI = ContactsContract.Contacts.CONTENT_URI; String CONTACT_ID= ContactsContract.Contacts._ID; Γειώλνπκε κηα λέα κεηαβιεηή ηύπνπ ContentResolver θαη έλαλ θέξζνξα ν νπνίνο ζα θξαηάεη ην απνηέιεζκα από ηνλ πίλαθα ησλ ηειεθώλσλ. ContentResolver contentresolver=getcontentresolver(); Cursor phonecursor = contentresolver.query( PhoneCONTENT_URI, null, PHONE_NUMBER+ " =?", new String[] { phonetext.gettext().tostring(), null); Παξαηεξνύκε όηη ζην query πνπ ζηέιλνπκε ζηνλ πίλαθα ησλ ηειεθώλσλ, κε ηελ βνήζεηα ηνπ ContentResolver, δεηάκε λα καο επηζηξέθεη εθείλε ηελ γξακκή ηνπ πίλαθα ζηελ νπνία ν ηειεθσληθόο αξηζκόο είλαη ίζνο κε ηνλ αξηζκό πνπ έδσζε ν ρξήζηεο ζε έλα πεδίν ηνπ UI. Από ηελ γξακκή πνπ επηζηξέθεηαη, θξαηάκε ην CONTACT_ID ζε κηα λέα κεηαβιεηή, θαη ζηελ ζπλέρεηα ηεξκαηίδνπκε ηνλ ζπγθεθξηκέλν θέξζνξα. String contact_id= phonecursor.getstring( phonecursor.getcolumnindex(phone_contact_id)); phonecursor.close(); ηελ ζπλέρεηα αλνίγνπκε έλα θαηλνύξγην θέξζνξα, ζηνλ νπνίνλ ζα βξνύκε θαη ζα θέξνπκε ηελ γξακκή από ηνλ πίλαθα ησλ επαθώλ, ζηελ νπνία αληηζηνηρεί ην ID πνπ απνζεθεύζακε ζηελ κεηαβιεηή contact_id πξνεγνπκέλσο. Cursor contactcursor = contentresolver.query( CONTACT_URI, null, CONTACT_ID+ " =?", new String[] { contact_id, null); Καηόπηλ βξίζθνπκε θαη απνζεθεύνπκε ζε κηα κεηαβιεηή ηελ ηηκή ηνπ LOOKUP_KEY, ε νπνία όπσο πξνείπακε ζα βνεζήζεη ην ιεηηνπξγηθό λα εληνπίζεη ηελ επαθή, ζε πεξίπησζε πνπ ιόγσ θάπνηαο αηηίαο αιιάμεη ην IDηεο

158 int LookUpKeyIndex= contactcursor.getcolumnindex( ContactsContract.Contacts.LOOKUP_KEY); String CurrentLookupKey = contactcursor.getstring(lookupkeyindex); ηελ ζπλέρεηα βξίζθνπκε ην ID ηεο επαθήο θαη ην απνζεθεύνπκε ζε κηα κεηαβιεηή ηύπνπ long. int IDIndex = contactcursor.getcolumnindex(contact_id); long CurrentID = contactcursor.getlong(idindex); Ο ιόγνο πνπ απνζεθεύνπκε ηελ ηηκή ηεο ζηήιεο ID σο long, είλαη όηη γηα λα πάξνπκε ην LookupUri ηεο γξακκήο ρξεηαδόκαζηε ηελ ηηκή ηνπ ID σο long θαη ηελ ηηκή πνπ έρεη ε ζηήιε LOOKUP_KEY. Uri SelectedContactUri = ContactsContract.Contacts.getLookupUri( CurrentID, CurrentLookupKey); Αθνύ έρνπκε πάξεη θαη LookupUri είκαζηε έηνηκνη λα δεκηνπξγήζνπκε ην Intent, κε βάζε ην νπνίν ζα θαιέζνπκε ηελ εθαξκνγή γηα ηελ επεμεξγαζία ηεο επηιεγκέλεο επαθήο. Intent editintent = new Intent(Intent.ACTION_EDIT); editintent.setdataandtype( SelectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE); startactivity(editintent); Σν action ηνπ Intent είλαη ACTION_EDIT ελώ ε κέζνδνο setdataandtype(uridata, StringType) καο δίλεη ηελ δπλαηόηεηα λα αιιάμνπκε ηα δεδνκέλα ηεο πξώηεο παξακέηξνπ πνπ είλαη ηνπ ηύπνπ πνπ νξίδεηαη ζηελ δεύηεξε παξάκεηξν. Ωο δεδνκέλα ζέηνπκε ην LookupUri πνπ νξίζακε πξνεγνπκέλσο, ελώ ηα δεδνκέλα πνπ ζα αιιαρζνύλ είλαη CONTENT_ITEM_TYPE.Ο ηύπνο CONTENT_ITEM_TYPE δειώλεη όηη ηα δεδνκέλα είλαη έλαο ππνθαηάινγνο,απνηεινύκελνο από κηα εγγξαθή

159 -148-

160 12 Γεκηνπξγία εθαξκνγώλ κε γλώζε ηξέρνπζαο ζέζεο Έλα από ηα ηδηαίηεξα ραξαθηεξηζηηθά ησλ Android εθαξκνγώλ είλαη ε γλώζε ηεο γεσγξαθηθήο ζέζεο πνπ βξίζθεηαη ν ρξήζηεο θάζε ζηηγκή. Δπεηδή νη ρξήζηεο έρνπλ ηηο ζπζθεπέο ζπλερώο καδί ηνπο, ε πξνζζήθε ζηελ εθαξκνγή ηεο δπλαηόηεηαο αλάγλσζεο ηεο ηξέρνπζαο γεσγξαθηθήο ζέζεο δίλεη ζηνλ ρξήζηε κηα θαιύηεξε εκπεηξία. Σν API LocationServices βξίζθεη ηελ ηξέρνπζα ζέζε ηνπ ρξήζηε θαη ηελ δηαηεξεί, έηζη ώζηε όιεο νη εθαξκνγέο λα κπνξνύλ λα έρνπλ πξόζβαζε ζε απηή ηελ πιεξνθνξία, όπνηε θαη αλ ηελ ρξεηαζηνύλ. Η αθξίβεηα ηεο ζέζεο είλαη κε βάζε δηθαηώκαηα πνπ έρεηε δεηήζεη θαη κε βάζε ηνπο αηζζεηήξεο ζέζεο πνπ είλαη ελεξγνί ζηελ ζπζθεπή. Σν LocationServices ζηέιλεη ηελ ηξέρνπζα ζέζε ζηελ εθαξκνγή ζαο κέζσ ελόο Location client, ν νπνίνο είλαη έλα instance ηεο θιάζεο LocationClient(). Όια ηα αηηήκαηα γηα πιεξνθνξίεο ζέζεο δηαρεηξίδνληαη κέζσ απηνύ ηνπ client Υξήζε Location Services API Γηα λα κπνξέζεηε λα ρξεζηκνπνηήζεηε ην LocationServices APK ζα πξέπεη λα αθνινπζήζεηε ηα επόκελα ηξία βήκαηα: 1. Αλνίγνπκε από ην Eclipse ην Android SDKManager, πνπ βξίζθεηαη ζην κελνύ Windows -149-

161 Δηθόλα 106 : Δπηινγή Andoird SDKManager Πάκε ζηνλ θαηάινγν Extras θαη βιέπνπκε αλ έρνπκε θάλεη εγθαηάζηαζε ην παθέην GooglePlayServices Δηθόλα 107 : Δπηινγή GooglePlayServices γηα εγθαηάζηαζε -150-

162 Δάλ δελ είλαη εγθαηεζηεκέλν, ην επηιέγνπκε θαη ην θάλνπκε εγθαηάζηαζε, αιιηώο θιείλνπκε ηνλ SDKManager. 2. Πεγαίλνπκε ζηνλ θάθειν πνπ είρακε δεκηνπξγήζεη όηαλ είρακε θάλεη εγθαηάζηαζε ην Eclipse θαη αλνίγνπκε ηνλ θάθειν /extras/google/google_play_services/libproject/ και αντιγράφουμε τον φάκελο google-play-services_lib Δηθόλα 108 : Δπηινγή θαθέινπ γηα αληηγξαθή ζηνλ θάθειν ηνπ workspace ηνπ Eclipse. 3. ην Eclipse ηώξα ζα πξέπεη λα εηζάγεηε απηή ηελ βηβιηνζήθε ζην workspace. Από ην menu επηιέγνπκε File->Import Δηθόλα 109 : Δηζαγσγή βηβιηνζήθεο GooglePlayServices(1) -151-

163 Καη ζηελ ζπλέρεηα Android->Existing Android Code IntoWorkspace Δηθόλα 110 : Δηζαγσγή βηβιηνζήθεο GooglePlayServices(2) Παηάκε Next θαη ζηελ επόκελε νζόλε παηάκε Browse -152-

164 Δηθόλα 111 : Δηζαγσγή βηβιηνζήθεο GooglePlayServices(3) θαη επηιέγνπκε ηνλ θάθειν πνπ κόιηο θάλακε αληηγξαθή ζην workspace

165 Δηθόλα 112 : Δπηινγή βηβιηνζήθεο GooglePlayServices Παηάκε ΟΚ θαη ζηελ επόκελε νζόλε Finish -154-

166 Δηθόλα 113 : Πξνζζήθε επηιεγκέλνπ θαθέινπ ζην workspace καο θαη πιένλ έρεη πξνζηεζεί ε βηβιηνζήθε ζην workspace καο Καζνξηζκόο δηθαησκάησλ εθαξκνγήο Κάζε εθαξκνγή πνπ ρξεζηκνπνηεί ην LocationServicesζα πξέπεη λα δεηήζεη άδεηα ζέζεο (location permissions). Σν ιεηηνπξγηθό Android έρεη δπν άδεηεο ζέζεο [26]: ACCESS_COARSE_LOCATION: επηηξέπεη ζηελ εθαξκνγή λα βξεη θαηά πξνζέγγηζε ηελ ζέζε ηεο ζπζθεπήο, ρξεζηκνπνηώληαο ην Wi-Fi θαη ηεο θεξαίεο ηεο θηλεηήο ηειεθσλίαο. Η πεξηνρή πνπ επηζηξέθεη ην Location Services είλαη πεξίπνπ έλα νηθνδνκηθό ηεηξάγσλν. ACCESS_FINE_LOCATION : επηηξέπεη ζηελ εθαξκνγή λα βξεη αθξηβώο ηελ ζέζε ηεο ζπζθεπήο, ρξεζηκνπνηώληαο ην Wi-Fi, ηεο θεξαίεο ηεο θηλεηήο ηειεθσλίαο αιιά θαη ην GPSηεο ζπζθεπήο

ΑΛΛΑΓΗ ΟΝΟΜΑΣΟ ΚΑΙ ΟΜΑΔΑ ΕΡΓΑΙΑ, ΚΟΙΝΟΥΡΗΣΟΙ ΦΑΚΕΛΟΙ ΚΑΙ ΕΚΣΤΠΩΣΕ ΣΑ WINDOWS XP

ΑΛΛΑΓΗ ΟΝΟΜΑΣΟ ΚΑΙ ΟΜΑΔΑ ΕΡΓΑΙΑ, ΚΟΙΝΟΥΡΗΣΟΙ ΦΑΚΕΛΟΙ ΚΑΙ ΕΚΣΤΠΩΣΕ ΣΑ WINDOWS XP ΑΛΛΑΓΗ ΟΝΟΜΑΣΟ ΚΑΙ ΟΜΑΔΑ ΕΡΓΑΙΑ, ΚΟΙΝΟΥΡΗΣΟΙ ΦΑΚΕΛΟΙ ΚΑΙ ΕΚΣΤΠΩΣΕ ΣΑ WINDOWS XP ηότοι εργαζηηρίοσ ην πιαίζην ηνπ ζπγθεθξηκέλνπ εξγαζηεξίνπ ζα παξνπζηαζηνύλ βαζηθέο ιεηηνπξγίεο ησλ Windows XP πνπ ζρεηίδνληαη

Διαβάστε περισσότερα

TOOLBOOK (μάθημα 2) Δεκηνπξγία βηβιίνπ θαη ζειίδσλ ΠΡΟΑΡΜΟΓΗ: ΒΑΛΚΑΝΙΩΣΗ ΔΗΜ. ΕΚΠΑΙΔΕΤΣΙΚΟ ΠΕ19 1 TOOLBOOK ΜΑΘΗΜΑ 2

TOOLBOOK (μάθημα 2) Δεκηνπξγία βηβιίνπ θαη ζειίδσλ ΠΡΟΑΡΜΟΓΗ: ΒΑΛΚΑΝΙΩΣΗ ΔΗΜ. ΕΚΠΑΙΔΕΤΣΙΚΟ ΠΕ19 1 TOOLBOOK ΜΑΘΗΜΑ 2 TOOLBOOK (μάθημα 2) Δεκηνπξγία βηβιίνπ θαη ζειίδσλ ΕΚΠΑΙΔΕΤΣΙΚΟ ΠΕ19 1 Δημιουργία σελίδων και βιβλίων Έλα θαηλνύξην βηβιίν πεξηέρεη κία άδεηα ζειίδα κε έλα άδεην background. Δελ κπνξνύκε λα μερσξίζνπκε

Διαβάστε περισσότερα

ΡΤΘΜΙΕΙ ΔΙΚΣΤΟΤ ΣΑ WINDOWS

ΡΤΘΜΙΕΙ ΔΙΚΣΤΟΤ ΣΑ WINDOWS ηότοι εργαζηηρίοσ ΡΤΘΜΙΕΙ ΔΙΚΣΤΟΤ ΣΑ WINDOWS ην πιαίζην ηνπ ζπγθεθξηκέλνπ εξγαζηεξίνπ ζα παξνπζηαζηεί ε δηαδηθαζία ηωλ ξπζκίζεωλ δηθηύνπ ζε ιεηηνπξγηθό ζύζηεκα Windows XP. Η δηαδηθαζία ζε γεληθέο γξακκέο

Διαβάστε περισσότερα

1. Οδηγίερ εγκαηάζηαζηρ και σπήζηρ έξςπνυν καπηών και τηθιακών πιζηοποιηηικών με σπήζη ηος λογιζμικού Μοzilla Thunderbird

1. Οδηγίερ εγκαηάζηαζηρ και σπήζηρ έξςπνυν καπηών και τηθιακών πιζηοποιηηικών με σπήζη ηος λογιζμικού Μοzilla Thunderbird 1. Οδηγίερ εγκαηάζηαζηρ και σπήζηρ έξςπνυν καπηών και τηθιακών πιζηοποιηηικών με σπήζη ηος λογιζμικού Μοzilla Thunderbird 1.1 Εγκαηάζηαζη ηυν οδηγών ηηρ έξςπνηρ κάπηαρ ζηο λογιζμικό Mozilla Thunderbird

Διαβάστε περισσότερα

Αιγόξηζκνη Γνκή επηινγήο. Πνιιαπιή Δπηινγή Δκθωιεπκέλεο Δπηινγέο. Δηζαγωγή ζηηο Αξρέο ηεο Δπηζηήκεο ηωλ Η/Υ. introcsprinciples.wordpress.

Αιγόξηζκνη Γνκή επηινγήο. Πνιιαπιή Δπηινγή Δκθωιεπκέλεο Δπηινγέο. Δηζαγωγή ζηηο Αξρέο ηεο Δπηζηήκεο ηωλ Η/Υ. introcsprinciples.wordpress. Αιγόξηζκνη 2.2.7.3 Γνκή επηινγήο Πνιιαπιή Δπηινγή Δκθωιεπκέλεο Δπηινγέο Δηζαγωγή ζηηο Αξρέο ηεο Δπηζηήκεο ηωλ Η/Υ 1 Πνιιαπιή Δληνιή Δπηινγήο Αν ζπλζήθε_1 ηόηε εληνιέο_1 αλλιώς_αν ζπλζήθε_2 ηόηε εληνιέο_2...

Διαβάστε περισσότερα

Α Ο Κ Η Α Μ Α Ζ Η Η Ρ Η ( S E A R C H )

Α Ο Κ Η Α Μ Α Ζ Η Η Ρ Η ( S E A R C H ) Ξ G O O G L E S C H O L A R Α Ο Ξ Ε Κ Ε Θ Λ Θ Α Λ Η Τ Α Μ Η Α Μ Α Ζ Η Η Ρ Η Ρ Οξαγκαηνπνηώληαο αλαδήηεζε ζην GoogleScholar (http://scholar.google.com/) ν ρξήζηεο κπνξεί λα εληνπίζεη πιηθό αθαδεκαϊθνύ θαη

Διαβάστε περισσότερα

Οδηγίες τρήζης για λειηοσργία μεηαθοράς καναλιών ζε υηθιακό δέκηη OST-7060 HD

Οδηγίες τρήζης για λειηοσργία μεηαθοράς καναλιών ζε υηθιακό δέκηη OST-7060 HD Οδηγίες τρήζης για λειηοσργία μεηαθοράς καναλιών ζε υηθιακό δέκηη OST-7060 HD Γηα ηε δηεπθόιπλζή ζαο θαηά ην switch-off ηεο πεξηνρήο ηεο Πεινπνλλήζνπ έρνπκε πξνζζέζεη ζηνπο ςεθηαθνύο καο δέθηεο κία λέα,

Διαβάστε περισσότερα

ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ. Ειζαγωγή ζηη Φωηογραθία. Χριζηάκης Σαζεΐδης EFIAP

ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ. Ειζαγωγή ζηη Φωηογραθία. Χριζηάκης Σαζεΐδης EFIAP ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ Ειζαγωγή ζηη Φωηογραθία Χριζηάκης Σαζεΐδης EFIAP 1 ΜΑΘΗΜΑ 6 ο Προγράμμαηα θωηογραθικών μηχανών Επιλογέας προγραμμάηων Μαο δίλεη ηε δπλαηόηεηα λα ειέγμνπκε ην άλνηγκα δηαθξάγκαηνο θαη

Διαβάστε περισσότερα

Constructors and Destructors in C++

Constructors and Destructors in C++ Constructors and Destructors in C++ Σύνθεζη Πνιύ ζπρλά ζηε C++ κία θιάζε κπνξεί λα πεξηέρεη ζαλ κέιεδεδνκέλα αληηθείκελα άιισλ θιάζεσλ. Πνηα είλαη ε ζεηξά κε ηελ νπνία δεκηνπξγνύληαη θαη θαηαζηξέθνληαη

Διαβάστε περισσότερα

ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΥΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ Ρέππα Μαξγαξίηα

ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΥΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ Ρέππα Μαξγαξίηα ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΥΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ 2011-12 Ρέππα Μαξγαξίηα FORMAT, UNFORMAT Format format , όποσ = a:, b: Μνξθνπνηεί, δειαδή πξνεηνηκάδεη

Διαβάστε περισσότερα

Έλεγτος Ορθογραθίας - Γραμμαηικής. Ορθογραθικός και Γραμμαηικός Έλεγτος

Έλεγτος Ορθογραθίας - Γραμμαηικής. Ορθογραθικός και Γραμμαηικός Έλεγτος 3.6 Έλεγτος Ορθογραθίας - Γραμμαηικής Ορθογραθικός και Γραμμαηικός Έλεγτος Πνιιέο θνξέο, θαζώο γξάθνπκε ζην Word, βιέπνπκε θπκαηηζηέο θόθθηλεο θαη πξάζηλεο ππνγξακκίζεηο λα εκθαλίδνληαη θάησ από νξηζκέλεο

Διαβάστε περισσότερα

Απαντήσεις θέματος 2. Παξαθάησ αθνινπζεί αλαιπηηθή επίιπζε ησλ εξσηεκάησλ.

Απαντήσεις θέματος 2. Παξαθάησ αθνινπζεί αλαιπηηθή επίιπζε ησλ εξσηεκάησλ. Απαντήσεις θέματος 2 Απηά πνπ έπξεπε λα γξάςεηε (δελ ρξεηαδόηαλ δηθαηνιόγεζε εθηόο από ην Γ) Α return a*b; Β 0:acegf2, 1: acegf23, 2: acegf234, 3:acegf2345, 4:acegf23456, 5:acegf234567, 6:acegf2345678,

Διαβάστε περισσότερα

Ζαχαρίας Μ. Κοντοπόδης Εργαστήριο Λειτουργικών Συστημάτων ΙΙ

Ζαχαρίας Μ. Κοντοπόδης Εργαστήριο Λειτουργικών Συστημάτων ΙΙ Διαφάνεια 1 η ΕΚΚΙΝΗΣΗ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ ΚΑΙ ΕΙΣΟΔΟΣ ΣΤΟ BIOS UITILITY Τν ζπλεζέζηεξν πιήθηξν γηα ηελ είζνδν ζην BIOS Utility είλαη ην πιήθηξν Del. Παξόια απηά δηαθνξεηηθνί θαηαζθεπαζηέο, ρξεζηκνπνηνύλ δηαθνξεηηθά

Διαβάστε περισσότερα

Σηα παξαδείγκαηα πνπ αθνινπζνύλ ρξεζηκνπνηήζεθαλ ην JQUIZ, ην JCROSS θαη ην JMATCH, πνπ αλαιπηηθά πεξηγξάθνληαη παξαθάηω.

Σηα παξαδείγκαηα πνπ αθνινπζνύλ ρξεζηκνπνηήζεθαλ ην JQUIZ, ην JCROSS θαη ην JMATCH, πνπ αλαιπηηθά πεξηγξάθνληαη παξαθάηω. Τι είναι το Hotpotatoes; Τν παθέην HotPotatoes 6 πνπ ρξεζηκνπνηήζεθε γηα ηε δεκηνπξγία ηωλ αζθήζεωλ, είλαη έλα πξόγξακκα αλνηρηνύ ινγηζκηθνύ θαη κπνξεί λα ρξεζηκνπνηεζεί ειεύζεξα από Παλεπηζηεκηαθά Ιδξύκαηα,

Διαβάστε περισσότερα

Ηλεκηπονικά Απσεία και Διεπαθέρ

Ηλεκηπονικά Απσεία και Διεπαθέρ MENU ΑΝΑΦΟΡΕΣ Ηλεκηπονικά Απσεία και Διεπαθέρ Σε απηό ην ζεκείν ηεο εθαξκνγήο δεκηνπξγνύκε ηα δηάθνξα Ηιεθηξνληθά Αξρεία έηζη ώζηε λα ηα ππνβάινπκε ζηνπο δηάθνξνπο θνξείο. Γηα λα επηιέμνπκε έλα είδνο αξρείνπ

Διαβάστε περισσότερα

Image J Plugin particle tracker για παρακολούθηση της κίνησης σωματιδίων

Image J Plugin particle tracker για παρακολούθηση της κίνησης σωματιδίων Image J Plugin particle tracker για παρακολούθηση της κίνησης σωματιδίων (https://weeman.inf.ethz.ch/particletracker/) Τν Plugin particle tracker κπνξεί λα αληρλεύζεη απηόκαηα ηα ζσκαηίδηα πνπ θηλνύληαη,

Διαβάστε περισσότερα

Δπηιέγνληαο ην «Πξνεπηινγή» θάζε θνξά πνπ ζα ζπλδέεζηε ζηελ εθαξκνγή ζα βξίζθεζηε ζηε λέα ρξήζε.

Δπηιέγνληαο ην «Πξνεπηινγή» θάζε θνξά πνπ ζα ζπλδέεζηε ζηελ εθαξκνγή ζα βξίζθεζηε ζηε λέα ρξήζε. ΑΝΟΙΓΜΑ ΝΔΑ ΥΡΗΗ 1. Γεκηνπξγείηε ηε λέα ρξήζε από ηελ επηινγή «Παξάκεηξνη/Παξάκεηξνη Δηαηξίαο/Γηαρείξηζε Δηαηξηώλ». Πιεθηξνινγείηε ηνλ θσδηθό ηεο εηαηξίαο ζαο θαη παηάηε Enter. Σηελ έλδεημε «Υξήζεηο» παηάηε

Διαβάστε περισσότερα

Case Study. Παξαθάηω παξνπζηάδνπκε βήκα - βήκα κε screenshots έλα παξάδεηγκα ππνβνιήο κηαο εξγαζίαο θαη ηελ παξαγωγή ηνπ Originality Report.

Case Study. Παξαθάηω παξνπζηάδνπκε βήκα - βήκα κε screenshots έλα παξάδεηγκα ππνβνιήο κηαο εξγαζίαο θαη ηελ παξαγωγή ηνπ Originality Report. Case Study Παξαθάηω παξνπζηάδνπκε βήκα - βήκα κε screenshots έλα παξάδεηγκα ππνβνιήο κηαο εξγαζίαο θαη ηελ παξαγωγή ηνπ Originality Report. Βήκα 1 ο : Login ζηο Turnitin. Κάλεηε είζνδν ζην Turnitin κε

Διαβάστε περισσότερα

Σημειώζεις Οδηγίες για ηη τρήζη ηοσ προγράμμαηος Acronis True Image Home

Σημειώζεις Οδηγίες για ηη τρήζη ηοσ προγράμμαηος Acronis True Image Home Σημειώζεις Οδηγίες για ηη τρήζη ηοσ προγράμμαηος Acronis True Image Home Προαπαιηούμενα: Acronis True Image Home 11 Bootable CD Γύο ή περιζζόηεροσς δίζκοσς ζσνδεδεμένοσς ζηον σπολογιζηή. Οι δίζκοι μπορεί

Διαβάστε περισσότερα

Γοκή επαλάιευες Δληοιές Όζο & Μέτρης_όηοσ

Γοκή επαλάιευες Δληοιές Όζο & Μέτρης_όηοσ Αιγόξηζκνη 2.2.7.4 Γοκή επαλάιευες Δληοιές Όζο & Μέτρης_όηοσ Εηζαγσγή ζηηο Αξρέο ηεο Επηζηήκεο ησλ Η/Υ 1 Άζθεζε 34 ζει 53 Έλα ςεθηαθό θσηνγξαθηθό άικπνπκ έρεη απνζεθεπηηθό ρώξν N Mbytes. Να αλαπηύμεηε

Διαβάστε περισσότερα

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙ ΜΟ

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙ ΜΟ ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙ ΜΟ Α ΛΤΚΔΙΟΤ Ζμεπομηνία: 18/12/10 Ώπα εξέτασηρ: 09:30-12:30 ΠΡΟΣΕΙΝΟΜΕΝΕ ΛΤ ΕΙ 1. Δίλεηαη ην πνιπώλπκν Αλ θαη., λα βξείηε ην ηειεπηαίν ςεθίν ηνπ αξηζκνύ έρνπκε:

Διαβάστε περισσότερα

CytaInfo+ έλα application γηα ηε Cyta.

CytaInfo+ έλα application γηα ηε Cyta. CytaInfo+ έλα application γηα ηε Cyta. 1 Απηή είλαη ε όςε ηνπ CytaInfo+ 2 3 Δπηιέγνληαο ην εηθνλίδην Find us κπνξείηε λα βξείηε ηα πην θνληηλά ζαο Cytashop, κε βάζε ηελ απόζηαζε ή αλά επαξρία. ηελ ζπλέρεηα

Διαβάστε περισσότερα

Απνηειέζκαηα Εξσηεκαηνινγίνπ 2o ηεηξάκελν 2011-12

Απνηειέζκαηα Εξσηεκαηνινγίνπ 2o ηεηξάκελν 2011-12 Απνηειέζκαηα Εξσηεκαηνινγίνπ 2o ηεηξάκελν 11-12 Project 6: Ταμίδη κε ηε Μεραλή ηνπ Φξόλνπ Υπεύζπλνη Καζεγεηέο: Ε. Μπηιαλάθε Φ. Αλησλάηνο Δρώηηζη 3: Πνηα από ηα παξαθάησ ΜΜΕ ηεξαξρείηε από πιεπξάο ζεκαζίαο;

Διαβάστε περισσότερα

Εγκατάσταση του πακέτου XAMPP. Β Τεχνική Σχολή Λεμεςοφ Σχολική χρονιά Άριςτοσ Παςιάσ

Εγκατάσταση του πακέτου XAMPP. Β Τεχνική Σχολή Λεμεςοφ Σχολική χρονιά Άριςτοσ Παςιάσ Εγκατάσταση του πακέτου XAMPP Β Τεχνική Σχολή Λεμεςοφ Σχολική χρονιά 2017 2018 Άριςτοσ Παςιάσ Τι είναι Τν XAMPP είλαη έλα δωξεάλ πξόγξακκα γηα δηάθνξα ιεηηνπξγηθά ζπζηήκαηα πνπ δεκηνπξγεί έλα πεξηβάιινλ

Διαβάστε περισσότερα

Να ζρεδηάζεηο ηξόπνπο ζύλδεζεο κηαο κπαηαξίαο θαη ελόο ιακπηήξα ώζηε ν ιακπηήξαο λα θσηνβνιεί.

Να ζρεδηάζεηο ηξόπνπο ζύλδεζεο κηαο κπαηαξίαο θαη ελόο ιακπηήξα ώζηε ν ιακπηήξαο λα θσηνβνιεί. ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ: Απλό ηλεκτπικό κύκλυμα Η δηδαζθαιία ηνπ απινύ ειεθηξηθνύ θπθιώκαηνο ππάξρεη ζην κάζεκα «Φπζηθά» ηεο Ε ηάμεο ηνπ δεκνηηθνύ θαη επαλαιακβάλεηαη ζην κάζεκα ηεο Φπζηθήο ζηε Γ ηάμε ηνπ Γπκλαζίνπ.

Διαβάστε περισσότερα

H ΜΑΓΕΙΑ ΤΩΝ ΑΡΙΘΜΩΝ

H ΜΑΓΕΙΑ ΤΩΝ ΑΡΙΘΜΩΝ H ΜΑΓΕΙΑ ΤΩΝ ΑΡΙΘΜΩΝ Φξεζηκόηεηα καζεκαηηθώλ Αξρή θαηακέηξεζεο Όζα έδσζαλ νη Έιιελεο... Τξίγσλνη αξηζκνί Τεηξάγσλνη αξηζκνί Δπηκήθεηο αξηζκνί Πξώηνη αξηζκνί Αξηζκνί κε μερσξηζηέο ηδηόηεηεο Γίδπκνη πξώηνη

Διαβάστε περισσότερα

ΑΠΑΝΤΗΣΔΙΣ ΓΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ II ΔΠΑΛ

ΑΠΑΝΤΗΣΔΙΣ ΓΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ II ΔΠΑΛ ΑΠΑΝΤΗΣΔΙΣ ΓΙΚΤΥΑ ΥΠΟΛΟΓΙΣΤΩΝ II ΔΠΑΛ ΘΔΜΑ Α Α1. α. Σ β. Σ γ. Λ δ. Λ ε. Λ ζη. Σ Α2. Γ Α3. 1. γ 2. ε 3. δ 4. α Β1. ΘΔΜΑ Β Οη ηειηθνί ππνινγηζηέο παίξλνπλ απνθάζεηο δξνκνιόγεζεο κόλν γηα ηα δηθά ηνπο απηνδύλακα

Διαβάστε περισσότερα

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ. Οξηδόληηα θαη θαηαθόξπθε κεηαηόπηζε παξαβνιήο

ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ. Οξηδόληηα θαη θαηαθόξπθε κεηαηόπηζε παξαβνιήο ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ Οξηδόληηα θαη θαηαθόξπθε κεηαηόπηζε παξαβνιήο 1 ε Δξαζηεξηόηεηα Αλνίμηε ην αξρείν «Μεηαηόπηζε παξαβνιήο.ggb». Με ηε καύξε γξακκή παξηζηάλεηαη ε γξαθηθή παξάζηαζε ηεο f(x)=αx 2 πνπ ζα ηελ

Διαβάστε περισσότερα

Οργάνωση και Δομή Παρουσιάσεων

Οργάνωση και Δομή Παρουσιάσεων Οργάνωση και Δομή Παρουσιάσεων Οη παξνπζηάζεηο κε βνήζεηα ηνπ ππνινγηζηή γίλνληαη κε πξνγξάκκαηα παξνπζηάζεσλ, όπσο ην OpenOffice.org Impress [1] θαη ην Microsoft Office PowerPoint [2]. Απηά ηα πξνγξάκκαηα

Διαβάστε περισσότερα

Σρήκα Α. Γξάθνπκε ηα ζηνηρεία ηνπ Πξνκεζεπηή θαη παηάκε Δηζαγσγή. Σρήκα Β1

Σρήκα Α. Γξάθνπκε ηα ζηνηρεία ηνπ Πξνκεζεπηή θαη παηάκε Δηζαγσγή. Σρήκα Β1 MENU ΜΗΤΡΩΑ Προμηθεστές Σε απηό ην ζεκείν ηεο εθαξκνγήο επεμεξγαδόκαζηε ηo κεηξών Πξνκεζεπηώλ. Κάλνληαο θιηθ κε ην πνληίθη πάλσ ζην Πξνζζήθε (βειάθη 1) ζα βγεη ε θόξκα γηα ηελ εηζαγσγή λέαο εγγξαθήο (Σρήκα

Διαβάστε περισσότερα

Διαδικαζία μεηαθοράς δεδομένων Εκκαθαριζηικής για ηο Eιδικό ζημείωμα περαίωζης Φ.Π.Α

Διαδικαζία μεηαθοράς δεδομένων Εκκαθαριζηικής για ηο Eιδικό ζημείωμα περαίωζης Φ.Π.Α Διαδικαζία μεηαθοράς δεδομένων Εκκαθαριζηικής για ηο Eιδικό ζημείωμα περαίωζης Φ.Π.Α Σει.1 Σο ζςγκεκπιμένο εγσειπίδιο δημιοςπγήθηκε για να βοηθήζει ηην καηανόηζη ηηρ διαδικαζίαρ μεηαθοπάρ δεδομένων ηηρ

Διαβάστε περισσότερα

Κάλνληαο θιηθ κε ην πνληίθη ζηνλ ινγαξηαζκό πνπ ζέινπκε θιείλεη ην παξάζπξν πνπ κόιηο είρε αλνίμεη. Παηώληαο Παξνπζίαζε (βειάθη Νν 3) παξνπζηάδνληαη

Κάλνληαο θιηθ κε ην πνληίθη ζηνλ ινγαξηαζκό πνπ ζέινπκε θιείλεη ην παξάζπξν πνπ κόιηο είρε αλνίμεη. Παηώληαο Παξνπζίαζε (βειάθη Νν 3) παξνπζηάδνληαη MENU ΛΟΓΙΣΤΙΚΗ Λογαπιαζμοί Σε απηό ην ζεκείν ηεο εθαξκνγήο επεμεξγαδόκαζηε ηνπο Λνγαξηαζκνύο ηνπ ινγηζηηθνύ ζρεδίνπ. Σην θνπηάθη πνπ καο δείρλεη ην βειάθη κε ην Νν 1 γξάθνπκε ηνλ ινγαξηαζκό πνπ ζέινπκε

Διαβάστε περισσότερα

Hellas online Προεπιλεγμένες ρσθμίσεις για FritzBox Fon WLAN 7140 (Annex B) 30.04.67 FritzBox Fon WLAN 7140 - Annex B (30.04.67)

Hellas online Προεπιλεγμένες ρσθμίσεις για FritzBox Fon WLAN 7140 (Annex B) 30.04.67 FritzBox Fon WLAN 7140 - Annex B (30.04.67) Hellas online Προεπιλεγμένες ρσθμίσεις για FritzBox Fon WLAN 7140 (Annex B) 30.04.67 FritzBox Fon WLAN 7140 - Annex B (30.04.67) Γηα λα επαλαθέξεηε ην FritzBox Fon WLAN 7140 ζηηο πξνεπηιεγκέλεο ηνπ ξπζκίζεηο

Διαβάστε περισσότερα

Ενδεικτικά Θέματα Στατιστικής ΙΙ

Ενδεικτικά Θέματα Στατιστικής ΙΙ Ενδεικτικά Θέματα Στατιστικής ΙΙ Θέματα. Έζησ όηη ζε δείγκα 35 θαηνηθηώλ πνπ ελνηθηάδνληαη ζε θνηηεηέο ζηελ Κνδάλε βξέζεθε ην κέζν κεληαίν κίζζσκα ζηα 5 επξώ, ελώ ζην Ζξάθιεην ην κέζν κεληαίν κίζζσκα ζε

Διαβάστε περισσότερα

Α. Εηζαγσγή ηεο έλλνηαο ηεο ηξηγσλνκεηξηθήο εμίζσζεο κε αξρηθό παξάδεηγκα ηελ εκx = 2

Α. Εηζαγσγή ηεο έλλνηαο ηεο ηξηγσλνκεηξηθήο εμίζσζεο κε αξρηθό παξάδεηγκα ηελ εκx = 2 ΣΡΙΓΩΝΟΜΔΣΡΙΚΔ EΞΙΩΔΙ Πνηα παξαδείγκαηα εμηζώζεσλ ή θαη πξνβιεκάησλ πηζηεύεηαη όηη είλαη θαηάιιεια γηα ηελ επίιπζε ηνπο θαηά ηελ δηάξθεηα ηεο δηδαθηηθήο δηαδηθαζίαο κέζα ζηελ ηάμε; 1 ε ΓΙΓΑΚΣΙΚΗ ΩΡΑ Α.

Διαβάστε περισσότερα

Παιχνίδι γλωζζικής καηανόηζης με ζχήμαηα!

Παιχνίδι γλωζζικής καηανόηζης με ζχήμαηα! Cpyright 2013 Λόγος & Επικοινωνία // All rights Reserved Παιχνίδι γλωζζικής καηανόηζης με ζχήμαηα! Αυηό ηο παιχνίδι έχει ζηόχους: 1. ηελ εθγύκλαζε ηεο αθνπζηηθήο κλήκεο ησλ παηδηώλ 2. ηελ εμάζθεζε ζηελ

Διαβάστε περισσότερα

ΕΝΤΟΛΕΣ WINDOWS ΚΑΙ UNIX

ΕΝΤΟΛΕΣ WINDOWS ΚΑΙ UNIX ΕΝΤΟΛΕΣ WINDOWS ΚΑΙ UNIX Σηότοι εργαζηηρίοσ Σην πιαίζην ηνπ ζπγθεθξηκέλνπ εξγαζηεξίνπ, νη θνηηεηέο ζα εμνηθεησζνύλ κε βαζηθέο εληνιέο δηθηπαθώλ πξσηνθόιισλ νη νπνίεο βξίζθνπλ εθαξκνγή ζε πεξηβάιινληα Windows

Διαβάστε περισσότερα

Αζκήζεις ζτ.βιβλίοσ ζελίδας 13 14

Αζκήζεις ζτ.βιβλίοσ ζελίδας 13 14 .1.10 ζκήζεις ζτ.βιβλίοσ ζελίδας 13 14 Ερωηήζεις Καηανόηζης 1. ύν δηαθνξεηηθέο επζείεο κπνξεί λα έρνπλ θαλέλα θνηλό ζεκείν Έλα θνηλό ζεκείν i ύν θνηλά ζεκεία iλ) Άπεηξα θνηλά ζεκεία ηηηνινγήζηε ηελ απάληεζε

Διαβάστε περισσότερα

x-1 x (x-1) x 5x 2. Να απινπνηεζνύλ ηα θιάζκαηα, έηζη ώζηε λα κελ ππάξρνπλ ξηδηθά ζηνπο 22, 55, 15, 42, 93, 10 5, 12

x-1 x (x-1) x 5x 2. Να απινπνηεζνύλ ηα θιάζκαηα, έηζη ώζηε λα κελ ππάξρνπλ ξηδηθά ζηνπο 22, 55, 15, 42, 93, 10 5, 12 ΑΚΖΔΗ ΤΜΝΑΗΟΤ - ΚΤΚΛΟ ΠΡΩΣΟ - - ηα πνηεο ηηκέο ηνπ ηα παξαθάησ θιάζκαηα δελ νξίδνληαη ; (Τπόδεημε : έλα θιάζκα νξίδεηαη αλ ν παξνλνκαζηήο είλαη δηάθνξνο ηνπ κεδελόο) - (-) - (-) - Να απινπνηεζνύλ ηα θιάζκαηα

Διαβάστε περισσότερα

Η/Υ A ΤΑΞΕΩΣ ΑΕ 2010-2011. Συστήματα Αρίθμησης. Υποπλοίαρχος Ν. Πετράκος ΠΝ

Η/Υ A ΤΑΞΕΩΣ ΑΕ 2010-2011. Συστήματα Αρίθμησης. Υποπλοίαρχος Ν. Πετράκος ΠΝ Συστήματα Αρίθμησης Υποπλοίαρχος Ν. Πετράκος ΠΝ 1 Ειζαγωγή Τν bit είλαη ε πην βαζηθή κνλάδα κέηξεζεο. Είλαη κία θαηάζηαζε on ή off ζε έλα ςεθηαθό θύθισκα. Άιιεο θνξέο είλαη κία θαηάζηαζε high ή low voltage

Διαβάστε περισσότερα

ISO/IEC 27001:2005 Certificate No: IS Aegate Ltd 2011 All rights reserved

ISO/IEC 27001:2005 Certificate No: IS Aegate Ltd 2011 All rights reserved ISO/IEC 27001:2005 Certificate No: IS 567140 (1) (2) Βήκα 1. Επηιέγεηε «Τποζςζηήμαηα» Βήκα 2. Επηιέγεηε «Πωλήζειρ και Αγοπέρ» (3) (4) Βήκα 3. Επηιέγεηε «Διασείπιζη Παπαζηαηικών» Βήκα 4. Επηιέγεηε «Επεξεπγαζία

Διαβάστε περισσότερα

Μορθές Κακόβοσλοσ Κώδικα (Malicious Code)

Μορθές Κακόβοσλοσ Κώδικα (Malicious Code) Μορθές Κακόβοσλοσ Κώδικα (Malicious Code) Page 1 Υποπλοίαρτος Ν. Πεηράκος ΠΝ Αηδένηα Γνύξεηνη Ίππνη (Trojan Horses) Ινί (Viruses) Worms Root-kit Page 2 Γνύξεηνο Ίππνο (Trojan Horse) Οξηζκόο: Πξόγξακκα

Διαβάστε περισσότερα

ΒΗΜΑ 2. Εηζάγεηε ηνλ Κωδηθό Πξόζβαζεο πνπ ιακβάλεηε κε SMS & δειώλεηε επηζπκεηό Όλνκα Πξόζβαζεο (Username) θαη ην ζαο

ΒΗΜΑ 2. Εηζάγεηε ηνλ Κωδηθό Πξόζβαζεο πνπ ιακβάλεηε κε SMS & δειώλεηε επηζπκεηό Όλνκα Πξόζβαζεο (Username) θαη ην  ζαο Δίζνδνο ζηελ Υπεξεζία Αλ είζηε ήδε εγγεγξακκέλνο ρξήζηεο ζηελ ππεξεζία, γηα ηελ είζνδν ζαο (login) ζηελ ππεξεζία e-bill, εηζάγεηαη ην Όλνκα Φξήζηε (username) θαη ηνλ Κωδηθό Πξόζβαζεο (password) πνπ είραηε

Διαβάστε περισσότερα

ΠΑΡΑΡΣΗΜΑ Δ. ΔΤΡΔΗ ΣΟΤ ΜΔΣΑΥΗΜΑΣΙΜΟΤ FOURIER ΓΙΑΦΟΡΩΝ ΗΜΑΣΩΝ

ΠΑΡΑΡΣΗΜΑ Δ. ΔΤΡΔΗ ΣΟΤ ΜΔΣΑΥΗΜΑΣΙΜΟΤ FOURIER ΓΙΑΦΟΡΩΝ ΗΜΑΣΩΝ ΠΑΡΑΡΣΗΜΑ Δ. ΔΤΡΔΗ ΣΟΤ ΜΔΣΑΥΗΜΑΣΙΜΟΤ FOURIER ΓΙΑΦΟΡΩΝ ΗΜΑΣΩΝ Εδώ ζα ππνινγίζνπκε ην κεηαζρεκαηηζκό Fourier κεξηθώλ αθόκα ζεκάησλ, πξνζπαζώληαο λα μεθηλήζνπκε από ην κεηαζρεκαηηζκό Fourier γλσζηώλ ζεκάησλ

Διαβάστε περισσότερα

ΓΗΑΓΩΝΗΣΜΑ ΣΤΑ ΜΑΘΖΜΑΤΗΚΑ. Ύλη: Μιγαδικοί-Σσναρηήζεις-Παράγωγοι Θεη.-Τετν. Καη Εήηημα 1 ο :

ΓΗΑΓΩΝΗΣΜΑ ΣΤΑ ΜΑΘΖΜΑΤΗΚΑ. Ύλη: Μιγαδικοί-Σσναρηήζεις-Παράγωγοι Θεη.-Τετν. Καη Εήηημα 1 ο : ΓΗΑΓΩΝΗΣΜΑ ΣΤΑ ΜΑΘΖΜΑΤΗΚΑ Ον/μο:.. Γ Λσκείοσ Ύλη: Μιγαδικοί-Σσναρηήζεις-Παράγωγοι Θεη.-Τετν. Καη. 11-1-11 Εήηημα 1 ο : Α. Γηα ηελ ζπλάξηεζε f, λα βξείηε ην δηάζηεκα ζην νπνίν είλαη παξαγσγίζηκε θαζώο θαη

Διαβάστε περισσότερα

Βάσεις Δεδομέμωμ. Εξγαζηήξην V. Τκήκα Πιεξνθνξηθήο ΑΠΘ 2015-2016

Βάσεις Δεδομέμωμ. Εξγαζηήξην V. Τκήκα Πιεξνθνξηθήο ΑΠΘ 2015-2016 Βάσεις Δεδομέμωμ Εξγαζηήξην V Τκήκα Πιεξνθνξηθήο ΑΠΘ 2015-2016 2 Σκοπός του 5 ου εργαστηρίου Σθνπόο απηνύ ηνπ εξγαζηεξίνπ είλαη: ε κειέηε ζύλζεησλ εξσηεκάησλ ζύλδεζεο ζε δύν ή πεξηζζόηεξεο ζρέζεηο ε κειέηε

Διαβάστε περισσότερα

ΕΓΧΕΙΡΙΔΙΟ ΕΚΔΟΗ 8.0.0

ΕΓΧΕΙΡΙΔΙΟ ΕΚΔΟΗ 8.0.0 ΕΓΧΕΙΡΙΔΙΟ ΕΚΔΟΗ 8.0.0 Γενικά Η έθδνζε 8.0.0 ηνπ ελόηεηεο: Business ERP, πεξηιακβάλεη λέεο ιεηηνπξγίεο πνπ αλαιύνληαη ζηηο παξαθάησ Γεληθόηεξε ιεηηνπξγία ηεο εθαξκνγήο Εκπνξηθή Δηαρείξηζε 7/2/2013 SingularLogic

Διαβάστε περισσότερα

ΣΔΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΔΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΔΠΙΚΟΙΝΩΝΙΩΝ ΥΔΙΜΔΡΙΝΟ ΔΞΑΜΗΝΟ Ρέππα Μαξγαξίηα

ΣΔΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΔΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΔΠΙΚΟΙΝΩΝΙΩΝ ΥΔΙΜΔΡΙΝΟ ΔΞΑΜΗΝΟ Ρέππα Μαξγαξίηα ΣΔΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΔΥΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΔΠΙΚΟΙΝΩΝΙΩΝ ΥΔΙΜΔΡΙΝΟ ΔΞΑΜΗΝΟ 2011-12 Ρέππα Μαξγαξίηα ΓΙΑΥΔΙΡΙΗ ΚΑΣΑΛΟΓΩΝ Εντολή md Με ηελ εληνιή απηή κπνξνύκε λα δεκηνπξγήζνπκε έλαλ θαηλνύξγην ππνθαηάινγν.

Διαβάστε περισσότερα

ΑΠΛΟΠΟΙΗΗ ΛΟΓΙΚΩΝ ΤΝΑΡΣΗΕΩΝ ΜΕ ΠΙΝΑΚΕ KARNAUGH

ΑΠΛΟΠΟΙΗΗ ΛΟΓΙΚΩΝ ΤΝΑΡΣΗΕΩΝ ΜΕ ΠΙΝΑΚΕ KARNAUGH ΑΠΛΟΠΟΙΗΗ ΛΟΓΙΚΩΝ ΤΝΑΡΣΗΕΩΝ ΜΕ ΠΙΝΑΚΕ KRNUGH Γηα λα θάλνπκε απινπνίεζε κηαο ινγηθήο ζπλάξηεζεο κε πίλαθα (ή ράξηε) Karnaugh αθνινπζνύκε ηα παξαθάησ βήκαηα:. Η ινγηθή ζπλάξηεζε ζα πξέπεη λα είλαη ζε πιήξε

Διαβάστε περισσότερα

ΚΕΦ. 2.3 ΑΠΟΛΤΣΗ ΣΘΜΗ ΠΡΑΓΜΑΣΘΚΟΤ ΑΡΘΘΜΟΤ

ΚΕΦ. 2.3 ΑΠΟΛΤΣΗ ΣΘΜΗ ΠΡΑΓΜΑΣΘΚΟΤ ΑΡΘΘΜΟΤ ΚΕΦ..3 ΑΠΟΛΤΣΗ ΣΘΜΗ ΠΡΑΓΜΑΣΘΚΟΤ ΑΡΘΘΜΟΤ Οπιζμόρ απόλςηηρ ηιμήρ: Σηνλ άμνλα ησλ πξαγκαηηθώλ αξηζκώλ ζεσξνύκε έλαλ αξηζκό α πνπ ζπκβνιίδεηαη κε ην ζεκείν Α. Η απόζηαζε ηνπ ζεκείνπ Α από ηελ αξρή Ο, δειαδή

Διαβάστε περισσότερα

Δπαστηπιότητα 1 - ανάπτςξη, μεταγλώττιση, αποσυαλμάτωση και. εκτέλεση ππογπάμματορ

Δπαστηπιότητα 1 - ανάπτςξη, μεταγλώττιση, αποσυαλμάτωση και. εκτέλεση ππογπάμματορ 1 Δπαστηπιότητα 1 - ανάπτςξη, μεταγλώττιση, αποσυαλμάτωση και εκτέλεση ππογπάμματορ Κάζε πξσί ν Karel μππλάεη ζην θξεβάηη ηνπ όηαλ έλα ξνκπόη-εθεκεξηδνπώιεο ηνπ πεηάεη ηελ εθεκεξίδα, πνπ αλαπαξηζηάλεηαη

Διαβάστε περισσότερα

Διιεληθά Σειρά Moov Δγτειρίδιο τρήζηη Δνημέρφζης ταρηών Web Αλαζεώξεζε: R00 (2010/05) Πώς να ενημερώζφ ηοσς τάρηες; Υπάξρνπλ ηέζζεξα βήκαηα γηα ηελ ελεκέξσζε ηνπ ράξηε. Βήκα

Διαβάστε περισσότερα

Η αξρή ζύλδεζεο Client-Server

Η αξρή ζύλδεζεο Client-Server Η αξρή ζύλδεζεο Client-Server Δηαθνκηζηήο (Server) Πξνζθέξεη ππεξεζίεο ζηνπο Πειάηεο (Client) Μεγάινη ππνινγηζηέο γηα ηηο ππεξεζίεο Internet (π.ρ. WWW, FTP) Λακβάλεη εξσηήζεηο θαη δίδεη απαληήζεηο Πειάηεο

Διαβάστε περισσότερα

Το Νέο Σύζηημα Ηλεκηρονικών Αιηήζεων Δανείων και Πιζηωηικών Καρηών είναι εδώ!

Το Νέο Σύζηημα Ηλεκηρονικών Αιηήζεων Δανείων και Πιζηωηικών Καρηών είναι εδώ! Το Νέο Σύζηημα Ηλεκηρονικών Αιηήζεων Δανείων και Πιζηωηικών Καρηών είναι εδώ! Εγτειρίδιο Ρσθμίζεων Προγραμμάηων Πλοήγηζης Σελίδα 1 από 23 ΠΕΡΙΕΧΟΜΕΝΑ 1. ΕΛΛΗΝΙΚΗ ΕΚΔΟΗ Α. Ρςθμίζειρ Google Chrome 3 Β. Ρςθμίζειρ

Διαβάστε περισσότερα

ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ. Εισαγωγή στη Φωτογραυία. Χριζηάκης Σαζεΐδης - EFIAP

ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ. Εισαγωγή στη Φωτογραυία. Χριζηάκης Σαζεΐδης - EFIAP ΜΑΘΗΜΑΣΑ ΦΩΣΟΓΡΑΦΙΑ Εισαγωγή στη Φωτογραυία Χριζηάκης Σαζεΐδης - EFIAP 1 ΜΑΘΗΜΑ 3 ο ΚΛΕΙΣΡΟ ΣΑΥΤΣΗΣΑ ΚΛΕΙΣΡΟΤ-ΕΠΙΛΟΓΗ ΚΑΣΑΛΛΗΛΗ ΣΑΥΤΣΗΣΑ Σι είναι υωτογραυική μητανή; Από πνηα κέξε απνηειείηαη: 1. Φαθό

Διαβάστε περισσότερα

ΘΔΚΑ ΡΖΠ ΑΛΑΓΛΩΟΗΠΖΠ

ΘΔΚΑ ΡΖΠ ΑΛΑΓΛΩΟΗΠΖΠ ΘΔΚΑ ΡΖΠ ΑΛΑΓΛΩΟΗΠΖΠ 1.Απηόο πνπ ζα αλαγλσξηζηεί απνπζηάδεη γηα πνιύ θαηξό. 2.Δπηζηξέθεη κε πιαζηή ηαπηόηεηα ή κεηακνξθσκέλνο. 3.Απνκνλώλνληαη ηα δύν πξόζσπα 4.Άξζε κεηακόξθσζεο 5.Απνθάιπςε 6.Ακθηβνιίεο-απνδεηθηηθά

Διαβάστε περισσότερα

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΕΣΑΙΡΕΙΑ ΜΑΘΗΜΑΤΙΚΗ ΣΚΥΤΑΛΟΓΡΟΜΙΑ 2015 ΓΙΑ ΤΟ ΓΥΜΝΑΣΙΟ Τεηάπηη 28 Ιανουαπίου 2015 ΛΔΥΚΩΣΙΑ Τάξη: Α Γυμναζίου

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΕΣΑΙΡΕΙΑ ΜΑΘΗΜΑΤΙΚΗ ΣΚΥΤΑΛΟΓΡΟΜΙΑ 2015 ΓΙΑ ΤΟ ΓΥΜΝΑΣΙΟ Τεηάπηη 28 Ιανουαπίου 2015 ΛΔΥΚΩΣΙΑ Τάξη: Α Γυμναζίου ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΕΣΑΙΡΕΙΑ ΜΑΘΗΜΑΤΙΚΗ ΣΚΥΤΑΛΟΓΡΟΜΙΑ 2015 ΓΙΑ ΤΟ ΓΥΜΝΑΣΙΟ Τεηάπηη 28 Ιανουαπίου 2015 ΛΔΥΚΩΣΙΑ Τάξη: Α Γυμναζίου ΠΡΟΒΛΗΜΑ Σε έλα ηνπξλνπά βόιετ δήισζαλ ζπκκεηνρή νκάδεο Γπκλαζίσλ ηεο Κύπξνπ.

Διαβάστε περισσότερα

(γ) Να βξεζεί ε ρξνλνεμαξηώκελε πηζαλόηεηα κέηξεζεο ηεο ζεηηθήο ηδηνηηκήο ηνπ ηειεζηή W.

(γ) Να βξεζεί ε ρξνλνεμαξηώκελε πηζαλόηεηα κέηξεζεο ηεο ζεηηθήο ηδηνηηκήο ηνπ ηειεζηή W. ΚΒΑΝΤΙΚΗ ΦΥΣΙΚΗ Ι Τειηθή Εμέηαζε: 5 Σεπηέκβξε 6 (Δηδάζθσλ: ΑΦ Τεξδήο) ΘΕΜΑ Θεσξνύκε θβαληηθό ζύζηεκα πνπ πεξηγξάθεηαη από Φακηιηνληαλή Η, ε νπνία ζε κνξθή πίλαθα ρξεζηκνπνηώληαο ηηο ηδηνζπλαξηήζεηο, θαη

Διαβάστε περισσότερα

Διαηιμήζεις για Αιολικά Πάρκα. Κώδικες 28, 78 και 84

Διαηιμήζεις για Αιολικά Πάρκα. Κώδικες 28, 78 και 84 Διαηιμήζεις για Αιολικά Πάρκα Κώδικες 28, 78 και 84 Διαηιμήζεις για Αιολικά Πάρκα Οη Διαηιμήζεις για Αιολικά Πάρκα εθαξκόδνληαη γηα ηελ απνξξνθνύκελε ελέξγεηα από Αηνιηθά Πάξθα πνπ είλαη ζπλδεδεκέλα ζην

Διαβάστε περισσότερα

Εξοικείωση με τοςρ σάπτερ τος Bing

Εξοικείωση με τοςρ σάπτερ τος Bing Εξοικείωση με τοςρ σάπτερ τος Bing Η εηαηξεία Microsoft δηαζέηεη απηή έλα θαηαηνπηζηηθό ηζηνρώξν ζρεηηθά κε ην πξνγξακκαηηζηηθό ηεο πεξηβάιινλ (API) ηόζν γηα ράξηεο όζν θαη άιιεο δξαζηεξηόηεηεο ζην δηαδίθηπν.

Διαβάστε περισσότερα

Άμεσοι Αλγόριθμοι: Προσπέλαση Λίστας (list access)

Άμεσοι Αλγόριθμοι: Προσπέλαση Λίστας (list access) Έρνπκε απνζεθεύζεη κηα ζπιινγή αξρείσλ ζε κηα ζπλδεδεκέλε ιίζηα, όπνπ θάζε αξρείν έρεη κηα εηηθέηα ηαπηνπνίεζεο. Μηα εθαξκνγή παξάγεη κηα αθνινπζία από αηηήκαηα πξόζβαζεο ζηα αξρεία ηεο ιίζηαο. Γηα λα

Διαβάστε περισσότερα

ΣΕΙ Δυτικήσ Μακεδονίασ, Παράρτημα Καςτοριάσ Τμήμα Πληροφορικήσ και Τεχνολογίασ Υπολογιςτών

ΣΕΙ Δυτικήσ Μακεδονίασ, Παράρτημα Καςτοριάσ Τμήμα Πληροφορικήσ και Τεχνολογίασ Υπολογιςτών τοιχεία του μαθήματοσ (ημζρα εβδομάδασ, ώρεσ, ζτοσ): ΣΕΙ Δυτικήσ Μακεδονίασ, Παράρτημα Καςτοριάσ Τμήμα Πληροφορικήσ και Τεχνολογίασ Υπολογιςτών Εργαςτηριακή ομάδα αςκήςεων 2 για το μάθημα «ΑΡΧΙΣΕΚΣΟΝΙΚΗ

Διαβάστε περισσότερα

Έλαο πίνακας σσμβόλων ππνζηεξίδεη δύν βαζηθέο ιεηηνπξγίεο:

Έλαο πίνακας σσμβόλων ππνζηεξίδεη δύν βαζηθέο ιεηηνπξγίεο: Πίνακες Σσμβόλων Έλαο πίνακας σσμβόλων ππνζηεξίδεη δύν βαζηθέο ιεηηνπξγίεο: Εηζαγσγή ελόο ζηνηρείνπ Αλαδήηεζε ζηνηρείνπ κε δεδνκέλν θιεηδί Άιιεο ρξήζηκεο ιεηηνπξγίεο είλαη: Δηαγξαθή ελόο θαζνξηζκέλνπ ζηνηρείνπ

Διαβάστε περισσότερα

Intel Accelerate Your Code

Intel Accelerate Your Code Intel Accelerate Your Code Semester Project at Parallel & Distributed systems Dimitrios S. Tsiktsiris University of Western Macedonia Department of Informatics & Telecommunications Engineering Kozani,

Διαβάστε περισσότερα

Δξγαιεία Καηαζθεπέο 1 Σάμε Δ Δ.Κ.Φ.Δ. ΥΑΝΗΩΝ ΠΡΩΣΟΒΑΘΜΗΑ ΔΚΠΑΗΓΔΤΖ. ΔΝΟΣΖΣΑ 2 ε : ΤΛΗΚΑ ΩΜΑΣΑ ΔΡΓΑΛΔΗΑ ΚΑΣΑΚΔΤΔ. Καηαζθεπή 1: Ογθνκεηξηθό δνρείν

Δξγαιεία Καηαζθεπέο 1 Σάμε Δ Δ.Κ.Φ.Δ. ΥΑΝΗΩΝ ΠΡΩΣΟΒΑΘΜΗΑ ΔΚΠΑΗΓΔΤΖ. ΔΝΟΣΖΣΑ 2 ε : ΤΛΗΚΑ ΩΜΑΣΑ ΔΡΓΑΛΔΗΑ ΚΑΣΑΚΔΤΔ. Καηαζθεπή 1: Ογθνκεηξηθό δνρείν Δξγαιεία Καηαζθεπέο 1 Δ.Κ.Φ.Δ. ΥΑΝΗΩΝ ΠΡΩΣΟΒΑΘΜΗΑ ΔΚΠΑΗΓΔΤΖ ΔΝΟΣΖΣΑ 2 ε : ΤΛΗΚΑ ΩΜΑΣΑ ΔΡΓΑΛΔΗΑ ΚΑΣΑΚΔΤΔ Καηαζθεπή 1: Ογθνκεηξηθό δνρείν Καηαζθεπάδνπκε έλα νγθνκεηξηθό δνρείν από πιαζηηθό κπνπθάιη λεξνύ

Διαβάστε περισσότερα

ΣΡΑΠΕΖΑ ΘΕΜΑΣΩΝ Α ΛΤΚΕΙΟΤ

ΣΡΑΠΕΖΑ ΘΕΜΑΣΩΝ Α ΛΤΚΕΙΟΤ ΜΑΘΗΜΑ : ΑΡΧΑΙΑ ΕΛΛΗΝΙΚΑ ΣΡΑΠΕΖΑ ΘΕΜΑΣΩΝ Α ΛΤΚΕΙΟΤ Α/Α : 0_1382/153 1. Καη όηαλ έγηλε ε ππνρώξεζε αξγά ην απόγεπκα, επεηδή θνβήζεθαλ νη νιηγαξρηθνί κήπσο νη δεκνθξαηηθνί, αθνύ θάλνπλ επίζεζε, θαηαιάβνπλ

Διαβάστε περισσότερα

iii. iv. γηα ηελ νπνία ηζρύνπλ: f (1) 2 θαη

iii. iv. γηα ηελ νπνία ηζρύνπλ: f (1) 2 θαη ΔΠΑΝΑΛΗΠΣΙΚΑ ΘΔΜΑΣΑ ΣΟ ΓΙΑΦΟΡΙΚΟ ΛΟΓΙΜΟ Μάρτιος 0 ΘΔΜΑ Να ππνινγίζεηε ηα όξηα: i ii lim 0 0 lim iii iv lim e 0 lim e 0 ΘΔΜΑ Γίλεηαη ε άξηηα ζπλάξηεζε '( ) ( ) γηα θάζε 0 * : R R γηα ηελ νπνία ηζρύνπλ:

Διαβάστε περισσότερα

Δξγαιεία Καηαζθεπέο 1 Σάμε Σ Δ.Κ.Φ.Δ. ΥΑΝΙΧΝ ΠΡΧΣΟΒΑΘΜΙΑ ΔΚΠΑΙΓΔΤΗ. ΔΝΟΣΗΣΑ 11 ε : ΦΧ ΔΡΓΑΛΔΙΑ ΚΑΣΑΚΔΤΔ. Καηαζθεπή 1: Φαθόο κε ζσιήλα.

Δξγαιεία Καηαζθεπέο 1 Σάμε Σ Δ.Κ.Φ.Δ. ΥΑΝΙΧΝ ΠΡΧΣΟΒΑΘΜΙΑ ΔΚΠΑΙΓΔΤΗ. ΔΝΟΣΗΣΑ 11 ε : ΦΧ ΔΡΓΑΛΔΙΑ ΚΑΣΑΚΔΤΔ. Καηαζθεπή 1: Φαθόο κε ζσιήλα. Δξγαιεία Καηαζθεπέο 1 Δ.Κ.Φ.Δ. ΥΑΝΙΧΝ ΠΡΧΣΟΒΑΘΜΙΑ ΔΚΠΑΙΓΔΤΗ ΔΝΟΣΗΣΑ 11 ε : ΦΧ ΔΡΓΑΛΔΙΑ ΚΑΣΑΚΔΤΔ Καηαζθεπή 1: Φαθόο κε ζσιήλα Γηαθξάγκαηα Δξγαιεία Καηαζθεπέο 2 Η θαηαζθεπή πεξηγξάθεηαη ζηελ αληίζηνηρε ελόηεηα

Διαβάστε περισσότερα

Πνηα λνκίδεηο όηη ζα είλαη ε ζπλνιηθή αληίζηαζε κηαο ζπλδεζκνινγίαο δύν αληηζηαηώλ ζπλδεδεκέλεο ζε ζεηξά; Γηαηί;...

Πνηα λνκίδεηο όηη ζα είλαη ε ζπλνιηθή αληίζηαζε κηαο ζπλδεζκνινγίαο δύν αληηζηαηώλ ζπλδεδεκέλεο ζε ζεηξά; Γηαηί;... ΦΥΛΛΟ ΕΡΓΑΣΙΑΣ: Ιζοδύναμη ανηίζηαζη ζύνδεζηρ ανηιζηαηών Η δηδαζθαιία ηεο ηζνδύλακεο αληίζηαζεο γηα ζύλδεζε αληηζηαηώλ ζε ζεηξά θαη παξάιιεια ππάξρεη ζην Αλαιπηηθό Πξόγξακκα Σπνπδώλ ζηα καζήκαηα Φπζηθήο

Διαβάστε περισσότερα

ΠΛΗ36. Άσκηση 1. Άσκηση 2. Οη δηεπζύλζεηο ησλ 4 σλ ππνδηθηύσλ είλαη νη αθόινπζεο. Υπνδίθηπν Α: 10.101.1.64/27 Υπνδίθηπν Β: 10.101.1.

ΠΛΗ36. Άσκηση 1. Άσκηση 2. Οη δηεπζύλζεηο ησλ 4 σλ ππνδηθηύσλ είλαη νη αθόινπζεο. Υπνδίθηπν Α: 10.101.1.64/27 Υπνδίθηπν Β: 10.101.1. Άσκηση 1 ΠΛΗ36 1. Η κόλε πεξίπησζε λα έρνπκε ζύγθξνπζε κεηαμύ παθέησλ ησλ δύν θόκβσλ είλαη λα ζηείιεη ν δεύηεξνο πξηλ πξνιάβεη λα πιεξνθνξεζεί γηα ηελ θαηάιεςε ηνπ δηάπινπ από ηνλ άιιν. Από ηε ζηηγκή πνπ

Διαβάστε περισσότερα

ΑΡΧΙΚΗ ΕΛΙΔΑ ΕΓΓΡΑΦΗ ΥΠΟΨΗΦΙΩΝ

ΑΡΧΙΚΗ ΕΛΙΔΑ ΕΓΓΡΑΦΗ ΥΠΟΨΗΦΙΩΝ ΑΡΧΙΚΗ ΕΛΙΔΑ ΕΓΓΡΑΦΗ ΥΠΟΨΗΦΙΩΝ Σηελ αξρηθή ζειίδα ελεκεξώλεζηε γηα ηηο εμεηαζηηθέο πεξηόδνπο θαη ηηο θαηαιεθηηθέο εκεξνκελίεο ηεο θάζε κηαο, πξνθεηκέλνπ γηα online ή έληππε εγγξαθή, θαζώο θαη γηα ηα 4

Διαβάστε περισσότερα

ΘΔΜΑ 1 ο Μονάδες 5,10,10

ΘΔΜΑ 1 ο Μονάδες 5,10,10 ΟΝΟΜΑΣΔΠΩΝΤΜΟ ΗΜΔΡΟΜΗΝΙΑ ΘΔΜΑ 1 ο Μονάδες 5,1,1 ΓΙΑΓΩΝΙΜΑ 1 ου ΜΔΡΟΤ ΣΗ ΑΝΑΛΤΗ Α Γώζηε ηνλ νξηζκό ηεο αληίζηξνθεο ζπλάξηεζεο Β Γείμηε όηη αλ κηα ζπλάξηεζε είλαη αληηζηξέςηκε ηόηε νη γξαθηθέο παξαζηάζεηο

Διαβάστε περισσότερα

ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΧΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ Ρέππα Μαξγαξίηα

ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΧΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ Ρέππα Μαξγαξίηα ΣΕΙ ΙΟΝΙΩΝ ΝΗΩΝ ΣΜΗΜΑ: ΣΕΧΝΟΛΟΓΙΑ ΠΛΗΡΟΦΟΡΙΚΗ ΚΑΙ ΣΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΧΕΙΜΕΡΙΝΟ ΕΞΑΜΗΝΟ 2011-12 Ρέππα Μαξγαξίηα ΔΙΑΔΙΕΡΓΑΣΙΚΗ ΕΠΙΚΟΙΝΩΝΙΑ Η αλαθαηεύζπλζε εμόδνπ> ρεηξηζηή ρξεζηκνπνηείηαη γηα λα ζηείιεη ηελ

Διαβάστε περισσότερα

ΣΡΑΠΕΖΑ ΘΕΜΑΣΩΝ Α ΛΤΚΕΙΟΤ

ΣΡΑΠΕΖΑ ΘΕΜΑΣΩΝ Α ΛΤΚΕΙΟΤ Α/Α : 0_3207/391 1. Τελ άιιε κέξα νη Τξηάθνληα, πνιύ ηαπεηλσκέλνη θαη ληώζνληαο εγθαηαιειεηκκέλνη, ζπγθεληξώζεθαλ ζην ρώξν ησλ ζπλεδξηάζεσλ παξάιιεια, νη «ηξεηο ρηιηάδεο», ζε όια ηα ζεκεία όπνπ είραλ ηνπνζεηεζεί,

Διαβάστε περισσότερα

PEOPLECERT Φνξέαο Πηζηνπνίεζεο Αλζξώπηλνπ Δπλακηθνύ e-mail: info@peoplecert.org, www.peoplecert.org

PEOPLECERT Φνξέαο Πηζηνπνίεζεο Αλζξώπηλνπ Δπλακηθνύ e-mail: info@peoplecert.org, www.peoplecert.org PEOPLECERT Φνξέαο Πηζηνπνίεζεο Αλζξώπηλνπ Δπλακηθνύ e-mail: info@peoplecert.org, www.peoplecert.org Πλεπκαηηθά Δηθαηώκαηα 2011 PEOPLECERT Α.Ε. Όια ηα δηθαηώκαηα είλαη θαηνρπξσκέλα. Καλέλα κέξνο ηνπ παξόληνο

Διαβάστε περισσότερα

Μονοψϊνιο. Αγνξά κε ιίγνπο αγνξαζηέο. Δύναμη μονοψωνίος Η ηθαλόηεηα πνπ έρεη ν αγνξαζηήο λα επεξεάζεη ηελ ηηκή ηνπ αγαζνύ.

Μονοψϊνιο. Αγνξά κε ιίγνπο αγνξαζηέο. Δύναμη μονοψωνίος Η ηθαλόηεηα πνπ έρεη ν αγνξαζηήο λα επεξεάζεη ηελ ηηκή ηνπ αγαζνύ. Μονοψϊνιο Ολιγοψώνιο Αγνξά κε ιίγνπο αγνξαζηέο. Δύναμη μονοψωνίος Η ηθαλόηεηα πνπ έρεη ν αγνξαζηήο λα επεξεάζεη ηελ ηηκή ηνπ αγαζνύ. Οπιακή αξία Δπηπξόζζεηα νθέιε από ηελ ρξήζε/θαηαλάισζε κηαο επηπξόζζεηε

Διαβάστε περισσότερα

ΑΝΤΗΛΙΑΚΑ. Η Μηκή ζθέθηεθε έλαλ ηξόπν, γηα λα ζπγθξίλεη κεξηθά δηαθνξεηηθά αληειηαθά πξντόληα. Απηή θαη ν Νηίλνο ζπλέιεμαλ ηα αθόινπζα πιηθά:

ΑΝΤΗΛΙΑΚΑ. Η Μηκή ζθέθηεθε έλαλ ηξόπν, γηα λα ζπγθξίλεη κεξηθά δηαθνξεηηθά αληειηαθά πξντόληα. Απηή θαη ν Νηίλνο ζπλέιεμαλ ηα αθόινπζα πιηθά: ΑΝΤΗΛΙΑΚΑ Η Μηκή θαη ν Νηίλνο αλαξσηήζεθαλ πνην αληειηαθό πξντόλ παξέρεη ηελ θαιύηεξε πξνζηαζία ζην δέξκα ηνπο. Τα αληειηαθά πξντόληα έρνπλ έλα δείθηε αληειηαθήο πξνζηαζίαο (SPF), ν νπνίνο δείρλεη πόζν

Διαβάστε περισσότερα

Σημεία Ασύπματηρ Ππόσβασηρ (Hot-Spots)

Σημεία Ασύπματηρ Ππόσβασηρ (Hot-Spots) Σημεία Ασύπματηρ Ππόσβασηρ (Hot-Spots) 1.1 Σςνοπτική Πεπιγπαυή Hot Spots Σα ζεκεία αζύξκαηεο πξόζβαζεο πνπ επηιέρζεθαλ αλαθέξνληαη ζηνλ επόκελν πίλαθα θαη παξνπζηάδνληαη αλαιπηηθά ζηηο επόκελεο παξαγξάθνπο.

Διαβάστε περισσότερα

Μηα ζπλάξηεζε κε πεδίν νξηζκνύ ην Α, ζα ιέκε όηη παξνπζηάδεη ηοπικό μέγιζηο ζην, αλ ππάξρεη δ>0, ηέηνην ώζηε:

Μηα ζπλάξηεζε κε πεδίν νξηζκνύ ην Α, ζα ιέκε όηη παξνπζηάδεη ηοπικό μέγιζηο ζην, αλ ππάξρεη δ>0, ηέηνην ώζηε: 1 ΟΡΙΜΟΙ MONOTONIA AKΡOTATA Μηα ζπλάξηεζε κε πεδίν νξηζκνύ ην Α, ζα ιέκε όηη παξνπζηάδεη ηοπικό μέγιζηο ζην, αλ ππάξρεη δ>0, ηέηνην ώζηε: Σν ιέγεηαη ζέζε ή ζεκείν ηνπ ηνπηθνύ κεγίζηνπ θαη ην ( ηνπηθό κέγηζην.

Διαβάστε περισσότερα

Άσκηση 1 - Μοπυοποίηση Κειμένου

Άσκηση 1 - Μοπυοποίηση Κειμένου Άσκηση 1 - Μοπυοποίηση Κειμένου Σηηο παξαθάησ γξακκέο εθαξκόζηε ηε κνξθνπνίεζε πνπ πεξηγξάθνπλ Γξακκή κε έληνλε γξαθή Γξακκή κε πιάγηα γξαθή Γξακκή κε ππνγξακκηζκέλε γξαθή Γξακκή κε Arial Font κεγέζνπο

Διαβάστε περισσότερα

Έθδνζε /11/2014. Νέα ιεηηνπξγηθόηεηα - Βειηηώζεηο

Έθδνζε /11/2014. Νέα ιεηηνπξγηθόηεηα - Βειηηώζεηο Έθδνζε 2.89.33 19/11/2014 Η έθδνζε 2.89.33, πεξηιακβάλεη : Βειηηώζεηο Εμαγωγή αξρείνπ XML γηα ηελ ππνβνιή ηωλ εληύπωλ Ε5, Ε8, Ε9 Αξρείν πιεξωκώλ Web Banking γηα Εζληθή Τξάπεδα Νέα επηινγή Φπζηθό Πξόζωπν

Διαβάστε περισσότερα

ΟΠΤΙΚΗ Α. ΑΝΑΚΛΑΣΖ - ΓΗΑΘΛΑΣΖ

ΟΠΤΙΚΗ Α. ΑΝΑΚΛΑΣΖ - ΓΗΑΘΛΑΣΖ ΟΠΤΙΚΗ Α. ΑΝΑΚΛΑΣΖ - ΓΗΑΘΛΑΣΖ. Μία αθηίλα θωηόο πξνζπίπηεη κε κία γωλία ζ ζηε επάλω επηθάλεηα ελόο θύβνπ από πνιπεζηέξα ν νπνίνο έρεη δείθηε δηάζιαζεο ε =,49 (ζρήκα ). Βξείηε πνηα ζα είλαη ε κέγηζηε γωλία

Διαβάστε περισσότερα

ΛΟΓΗΜΗΚΟ ONLINE ΓΗΑΥΔΗΡΗΖ ΔΝΣΤΠΩΝ ΔΡΓΩΝ

ΛΟΓΗΜΗΚΟ ONLINE ΓΗΑΥΔΗΡΗΖ ΔΝΣΤΠΩΝ ΔΡΓΩΝ ΛΟΓΗΜΗΚΟ ONLINE ΓΗΑΥΔΗΡΗΖ ΔΝΣΤΠΩΝ ΔΡΓΩΝ ΔΓΥΔΗΡΗΓΗΟ ΥΡΖΖ ΣΖ ON-LINE ΔΦΑΡΜΟΓΖ ΣΖ ΚΑΣΑΥΩΡΖΖ ΣΩΝ ΩΡΩΝ ΔΡΓΑΗΑ ΑΜΔΗΒΟΜΔΝΩΝ Δ ΔΡΔΤΝΖΣΗΚΑ ΠΡΟΓΡΑΜΜΑΣΑ & ΟΡΗΕΟΝΣΗΑ ΠΑΡΑΚΟΛΟΤΘΖΖ ΣΟΤ Έκδοζη 1.0 19/1/2010 1 1. Δισαγωγή

Διαβάστε περισσότερα

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙΜΟ Α ΛΤΚΔΙΟΤ. Ημεπομηνία: 10/12/11 Ώπα εξέτασηρ: 09:30-12:30 ΠΡΟΣΔΙΝΟΜΔΝΔ ΛΤΔΙ

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙΜΟ Α ΛΤΚΔΙΟΤ. Ημεπομηνία: 10/12/11 Ώπα εξέτασηρ: 09:30-12:30 ΠΡΟΣΔΙΝΟΜΔΝΔ ΛΤΔΙ ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΔΣΑΙΡΔΙΑ ΠΑΓΚΤΠΡΙΟ ΓΙΑΓΩΝΙΜΟ Α ΛΤΚΔΙΟΤ Ημεπομηνία: 10/12/11 Ώπα εξέτασηρ: 09:30-12:30 ΠΡΟΣΔΙΝΟΜΔΝΔ ΛΤΔΙ Πρόβλημα 1: α) Να δείμεηε όηη αλ ζεηηθνί πξαγκαηηθνί αξηζκνί ηζρύεη: β) Αλ είλαη

Διαβάστε περισσότερα

4) Να γξάςεηε δηαδηθαζία (πξόγξακκα) ζηε Logo κε όλνκα θύθινο πνπ ζα ζρεδηάδεη έλα θύθιν. Λύζε Γηα θύθινο ζηθ επαλάιαβε 360 [κπ 1 δε 1] ηέινο

4) Να γξάςεηε δηαδηθαζία (πξόγξακκα) ζηε Logo κε όλνκα θύθινο πνπ ζα ζρεδηάδεη έλα θύθιν. Λύζε Γηα θύθινο ζηθ επαλάιαβε 360 [κπ 1 δε 1] ηέινο Λσμένες αζκήζεις ζηη Logo Στεδίαζη ζτημάηων με ηη τελώνα 1) Να γξάςεηε δηαδηθαζία (πξόγξακκα) ζηε Logo κε όλνκα ηεηξάγσλν πνπ ζα ζρεδηάδεη έλα ηεηξάγσλν κε πιεπξά 120. Γηα ηεηξάγσλν επαλάιαβε 4 [κπ 120

Διαβάστε περισσότερα

DOM. Γηδάζθνληεο: Π. Αγγειάηνο, Γ. Εήλδξνο Δπηκέιεηα δηαθαλεηώλ: Π. Αγγειάηνο. Σρνιή Ζιεθηξνιόγωλ Μεραληθώλ θαη Μεραληθώλ Υπνινγηζηώλ

DOM. Γηδάζθνληεο: Π. Αγγειάηνο, Γ. Εήλδξνο Δπηκέιεηα δηαθαλεηώλ: Π. Αγγειάηνο. Σρνιή Ζιεθηξνιόγωλ Μεραληθώλ θαη Μεραληθώλ Υπνινγηζηώλ DOM Γηδάζθνληεο: Π. Αγγειάηνο, Γ. Εήλδξνο Δπηκέιεηα δηαθαλεηώλ: Π. Αγγειάηνο Σρνιή Ζιεθηξνιόγωλ Μεραληθώλ θαη Μεραληθώλ Υπνινγηζηώλ Σηόρνο ηεο ώξαο Δμνηθείωζε κε ην DOM Γέληξν DOM: Γηάζρηζε Τξνπνπνίεζε

Διαβάστε περισσότερα

ΔΝΓΔΙΚΣΙΚΔ ΛΤΔΙ ΣΑ ΜΑΘΗΜΑΣΙΚΑ ΠΡΟΑΝΑΣΟΛΙΜΟΤ 2017

ΔΝΓΔΙΚΣΙΚΔ ΛΤΔΙ ΣΑ ΜΑΘΗΜΑΣΙΚΑ ΠΡΟΑΝΑΣΟΛΙΜΟΤ 2017 α: κολάδα β: κολάδες Σειίδα από 8 ΔΝΓΔΙΚΣΙΚΔ ΛΤΔΙ ΣΑ ΜΑΘΗΜΑΣΙΚΑ ΠΡΟΑΝΑΣΟΛΙΜΟΤ 7 ΘΔΜΑ Α Α Έζηω, κε Θα δείμνπκε όηη f ( ) f ( ) Πξάγκαηη, ζην δηάζηεκα [, ] ε f ηθαλνπνηεί ηηο πξνϋπνζέζεηο ηνπ ΘΜΤ Επνκέλωο,

Διαβάστε περισσότερα

Αζθήζεηο 5 νπ θεθαιαίνπ Crash course Step by step training. Dipl.Biol.cand.med. Stylianos Kalaitzis

Αζθήζεηο 5 νπ θεθαιαίνπ Crash course Step by step training. Dipl.Biol.cand.med. Stylianos Kalaitzis Αζθήζεηο 5 νπ θεθαιαίνπ Crash course Step by step training Dipl.Biol.cand.med. Stylianos Kalaitzis Stylianos Kalaitzis Μνλνϋβξηδηζκνο 1 Γπν γνλείο, εηεξόδπγνη γηα ηνλ αιθηζκό θάλνπλ παηδηά. Πνία ε πηζαλόηεηα

Διαβάστε περισσότερα

Πολυεπίπεδα/Διασυμδεδεμέμα Δίκτυα

Πολυεπίπεδα/Διασυμδεδεμέμα Δίκτυα Πολυεπίπεδα/Διασυμδεδεμέμα Δίκτυα Κοιμωμικά δίκτυα (multiplex network) Έρεηε ινγαξηαζκό ζην Facebook? Έρεηε ινγαξηαζκό ζην LinkedIn? Έρεηε ινγαξηαζκό ζην Twitter? Αεροπορικές γραμμές της Ευρώπης(multiplex

Διαβάστε περισσότερα

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΕΣΑΙΡΕΙΑ ΜΑΘΗΜΑΣΙΚΗ ΚΤΣΑΛΟΓΡΟΜΙΑ 2007 ΓΙΑ ΣΟ ΓΤΜΝΑΙΟ Παπασκευή 26 Ιανουαπίου 2007 Σάξη: Α Γυμνασίου ΥΟΛΕΙΟ..

ΚΤΠΡΙΑΚΗ ΜΑΘΗΜΑΣΙΚΗ ΕΣΑΙΡΕΙΑ ΜΑΘΗΜΑΣΙΚΗ ΚΤΣΑΛΟΓΡΟΜΙΑ 2007 ΓΙΑ ΣΟ ΓΤΜΝΑΙΟ Παπασκευή 26 Ιανουαπίου 2007 Σάξη: Α Γυμνασίου ΥΟΛΕΙΟ.. ΜΑΘΗΜΑΣΙΚΗ ΚΤΣΑΛΟΓΡΟΜΙΑ 2007 ΓΙΑ ΣΟ ΓΤΜΝΑΙΟ Παπασκευή 26 Ιανουαπίου 2007 Σάξη: Α Γυμνασίου έλαξμεο 09.30 ιήμεο 09.45 Σην παξαθάησ ζρήκα θαίλεηαη ηκήκα ελόο πνιενδνκηθνύ ζρεδίνπ κηαο πόιεο. Οη ζθηαζκέλεο

Διαβάστε περισσότερα

ύζηεκα Ωξνκέηξεζεο Πξνζσπηθνύ (Έθδνζε 2) ΤΠΗΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΩΝ ΤΣΗΜΑΣΩΝ

ύζηεκα Ωξνκέηξεζεο Πξνζσπηθνύ (Έθδνζε 2) ΤΠΗΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΩΝ ΤΣΗΜΑΣΩΝ ύζηεκα Ωξνκέηξεζεο Πξνζσπηθνύ (Έθδνζε 2) ΤΠΗΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΩΝ ΤΣΗΜΑΣΩΝ Πεξηερόκελα Σερληθά Υαξαθηεξηζηηθά Καηαγξαθή Ώξαο πγρξνληζκόο πζηήκαηνο Παξνπζίαζε πζηήκαηνο Πηζαλά ελάξηα Υξήζεο 2 Σερληθά Υαξαθηεξηζηηθά

Διαβάστε περισσότερα

Εςθςή ζςζηήμαηα επισειπήζεων και αξιολόγηζη

Εςθςή ζςζηήμαηα επισειπήζεων και αξιολόγηζη Εςθςή ζςζηήμαηα επισειπήζεων και αξιολόγηζη Μάθημα 11 Τμήμα Μάπκεηινγκ και Διοίκηζηρ Λειηοςπγιών Τα δηαγξάκκαηα θαηάζηαζεο (state diagrams) ρξεζηκνπνηνύληαη γηα λα βνεζήζνπλ ηνλ πξνγξακκαηηζηή λα θαηαιάβεη

Διαβάστε περισσότερα

Δξγαζηεξηαθή άζθεζε 03. Σηεξενγξαθηθή πξνβνιή ζην δίθηπν Wulf

Δξγαζηεξηαθή άζθεζε 03. Σηεξενγξαθηθή πξνβνιή ζην δίθηπν Wulf Δξγαζηεξηαθή άζθεζε 03 Σηεξενγξαθηθή πξνβνιή ζην δίθηπν Wulf Ζιίαο Χαηδεζενδσξίδεο Οθηώβξηνο / Ννέκβξηνο 2004 Τη είλαη ην δίθηπν Wulf Δπίπεδν ζην νπνίν κπνξνύκε λα αλαπαξαζηήζνπκε ηξηζδηάζηαηα ζρήκαηα,

Διαβάστε περισσότερα

Σύνθεζη ηαλανηώζεων. Έζησ έλα ζώκα πνπ εθηειεί ηαπηόρξνλα δύν αξκνληθέο ηαιαληώζεηο ηεο ίδηαο ζπρλόηεηαο πνπ πεξηγξάθνληαη από ηηο παξαθάησ εμηζώζεηο:

Σύνθεζη ηαλανηώζεων. Έζησ έλα ζώκα πνπ εθηειεί ηαπηόρξνλα δύν αξκνληθέο ηαιαληώζεηο ηεο ίδηαο ζπρλόηεηαο πνπ πεξηγξάθνληαη από ηηο παξαθάησ εμηζώζεηο: Σύνθεζη ηαλανηώζεων Α. Σύλζεζε δύν α.α.η ηεο ίδιας ζστνόηηηας Έζησ έλα ζώκα πνπ εθηειεί ηαπηόρξνλα δύν αξκνληθέο ηαιαληώζεηο ηεο ίδηαο ζπρλόηεηαο πνπ πεξηγξάθνληαη από ηηο παξαθάησ εμηζώζεηο: Η απνκάθξπλζε

Διαβάστε περισσότερα

Αντισταθμιστική ανάλυση

Αντισταθμιστική ανάλυση Θεσξήζηε έλαλ αιγόξηζκν Α πνπ ρξεζηκνπνηεί κηα δνκή δεδνκέλσλ Γ : Καηά ηε δηάξθεηα εθηέιεζεο ηνπ Α ε Γ πξαγκαηνπνηεί κία αθνινπζία από πξάμεηο. Παξάδεηγκα: Θπκεζείηε ην πξόβιεκα ηεο εύξεζεο-έλσζεο Δίρακε

Διαβάστε περισσότερα

Πρόβλεμα Online Gaming με modem Thomson και Speedtouch

Πρόβλεμα Online Gaming με modem Thomson και Speedtouch Πρόβλεμα Online Gaming με modem Thomson και Speedtouch Περιγραθή προβλήμαηος Εάλ πξνζπαζείηε λα παίμεηε online παηρλίδηα αιιά εκθαλίδεηαη error ζηνλ ππνινγηζηή ζαο γηα NAT/DMZ/Port forwarding δνθηκάζηε

Διαβάστε περισσότερα

ΔΡΓΑΙΑ 1. Γιαδικησακά πληροθοριακά σζηήμαηα. Ομάδα Δργαζίας: Μεηαπηστιακοί Φοιηηηές. ηέθανος Κονηοβάς ΑΔΜ :283. Πάζτος Βαζίλειος ΑΔΜ :288

ΔΡΓΑΙΑ 1. Γιαδικησακά πληροθοριακά σζηήμαηα. Ομάδα Δργαζίας: Μεηαπηστιακοί Φοιηηηές. ηέθανος Κονηοβάς ΑΔΜ :283. Πάζτος Βαζίλειος ΑΔΜ :288 ΔΡΓΑΙΑ 1 Γιαδικησακά πληροθοριακά σζηήμαηα Ομάδα Δργαζίας: Μεηαπηστιακοί Φοιηηηές ηέθανος Κονηοβάς ΑΔΜ :283 Πάζτος Βαζίλειος ΑΔΜ :288 1.Γιάγραμμα Ονηολογίας. Σην παξαπάλω δηάγξακκα θαίλεηαη ε δηάξζξωζε

Διαβάστε περισσότερα

ΚΔΦ. 2.4 ΡΗΕΔ ΠΡΑΓΜΑΣΗΚΩΝ ΑΡΗΘΜΩΝ

ΚΔΦ. 2.4 ΡΗΕΔ ΠΡΑΓΜΑΣΗΚΩΝ ΑΡΗΘΜΩΝ ΚΔΦ.. ΡΗΕΔ ΠΡΑΓΜΑΣΗΚΩΝ ΑΡΗΘΜΩΝ Οξηζκόο ηεηξαγσληθήο ξίδαο: Αλ 0 ηόηε νλνκάδνπκε ηεηξαγσληθή ξίδα ηνπ ηελ κε αξλεηηθή ιύζε ηεο εμίζσζεο:. Γειαδή ηεηξαγσληθή ξίδα ηνπ 0 ιέγεηαη ν αξηζκόο 0 πνπ όηαλ πςσζεί

Διαβάστε περισσότερα

Κβαντικοί Υπολογισμοί. Πέκπηε Γηάιεμε

Κβαντικοί Υπολογισμοί. Πέκπηε Γηάιεμε Κβαντικοί Υπολογισμοί Πέκπηε Γηάιεμε Kπθισκαηηθό Mνληέιν Έλαο θιαζηθόο ππνινγηζηήο απνηειείηαη από αγσγνύο θαη ινγηθέο πύιεο πνπ απνηεινύλ ηνπο επεμεξγαζηέο. Σηνπο θβαληηθνύο ε πιεξνθνξία βξίζθεηαη κέζα

Διαβάστε περισσότερα

7. ΚΑΤΑΧΩΡΗΤΕΣ ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ. 3. Έλαο θαηαρσξεηήο SISO ησλ 4 bits έρεη: α) Μία είζνδν, β) Δύν εηζόδνπο, γ) Σέζζεξεηο εηζόδνπο.

7. ΚΑΤΑΧΩΡΗΤΕΣ ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ. 3. Έλαο θαηαρσξεηήο SISO ησλ 4 bits έρεη: α) Μία είζνδν, β) Δύν εηζόδνπο, γ) Σέζζεξεηο εηζόδνπο. 7. ΚΑΤΑΧΩΡΗΤΕΣ ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ 1. Ση είλαη έλαο θαηαρσξεηήο; O θαηαρσξεηήο είλαη κηα νκάδα από flip-flop πνπ κπνξεί λα απνζεθεύζεη πξνζσξηλά ςεθηαθή πιεξνθνξία. Μπνξεί λα δηαηεξήζεη ηα δεδνκέλα ηνπ

Διαβάστε περισσότερα