Your SlideShare is downloading. ×

Android app todolo_lbs

676

Published on

The complete presentation of our android project app of a location based todo-list TODOLO

The complete presentation of our android project app of a location based todo-list TODOLO

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
676
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Mobile Anwendungen (38610) Gruppe 4 Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger
  • 2. Agenda – Teil 1 (Business)• Marktanalyse – Marktstatus und Entwicklung – Konkurrenzanalyse• Kundenbedarf und -nutzen – Zielgruppe – Nutzen – Use Case – User Stories• Finanzierung – Kosten – Erlösmodell Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 2
  • 3. Agenda – Teil 1 (Business)• Vorgehen – Aufgabenverteilung – Entwicklung – Projektstrukturplan• Abschluss – Was muss noch gemacht werden?• Lessons Learned – Was lief gut? – Was lief schlecht? Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 3
  • 4. Agenda – Teil 2 (Entwicklung)• Graphical User Interface (GUI) – Konzept – Aktivities – Elemente• Applikation/Alerts• Datenbank – Modell – Entwurfsmuster• Global Positioning System (GPS) Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 4
  • 5. Was ist todolo? Applikation für die orts- und zeitabhängige Aufgabenverwaltung für Android- BetriebssystemeNamensfindung:to do list = todolocation = lo 5
  • 6. MarktanalyseMarktanteile mobiler Betriebssysteme weltweit Q3 2010 (Quelle: Gartner 2010, http://www.gartner.com/it/page.jsp?id=1466313) Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 6
  • 7. MarktanalyseMarktanteile mobiler Betriebssysteme weltweit Q3 2009 (Quelle: Gartner 2010, http://www.gartner.com/it/page.jsp?id=1466313) Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 7
  • 8. Marktanalyse Marktanteile mobiler Betriebssysteme teamintern (Eigene Erhebung 2010)Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 8
  • 9. MarktanalyseKonkurrenzanalyse• 3 Konkurrenzprodukte: – GeoNote von Jim McLaughlin -> Hauptkonkurrent – GeoNotes Lite von Hispamedia – GeoNotes: Location Based Notes von DroidSolutions• Alle Versionen kostenlos verfügbar -> Werbung, Funktionseinschränkung Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 9
  • 10. MarktanalyseKonkurrenzanalyse GeoNote von Jim McLaughlinFeatures:• off / on function• 2 default locations: Home and Work• Edit Location: Name, Location, Notes• Set Location: Location on Map, Current Location, Address• Reminder: Display when leaving / arriving at location / one time only, Leaving distance (50 – 2000 meters), Arriving distance (100 meters)• Sleep feature (preserve battery)• Google Maps add-in 10
  • 11. MarktanalyseKonkurrenzanalyse GeoNotes Lite von HispamediaFeatures:• New notes via phone menu• Note: Name, Category, Description, Relevance• Sort: sort by name, sort by category• Geopositioning not allowed in trial version• Google Maps add-in 11
  • 12. MarktanalyseKonkurrenzanalyse GeoNotes: Location Based Notes von DroidSolutionsFeatures:• New notes via phone menu• Note: Title, Address, Notify Close to Address, GeoNote• Track movement start options: duration (now – 1 week), date/time• Notification distance: 50 – 5000 feet 12
  • 13. MarktanalyseKonkurrenzanalyse (SWOT-Analyse)• Stärken und Schwächen: • Fokus liegt auf dem englischsprachigen Raum (Alle) • Nicht alle Funktionen in den „Lite“-Versionen enthalten (2 Produkte) • mangelnde Benutzerfreundlichkeit der Oberfläche (Alle) • keine freie Adressbestimmung (2 Produkte) • Google Maps-Anbindung (2 Produkte) Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 13
  • 14. MarktanalyseKonkurrenzanalyse (SWOT-Analyse)• Chancen: • Fokus auf dem deutschen Raum und Privatleuten • keine eingeschränkte Version (nur Add-On!) • benutzerfreundliche und seriöse Gestaltung der Oberfläche • mehrere Möglichkeiten der Ortsbestimmung (GPS, textuelle Eingabe, Google Maps) • Google Maps-Anbindung • Ortszuweisung via Favoriten Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 14
  • 15. Kundenbedarf und -nutzenZielgruppendefinition (soziodemographisch)• Alter: Jugendliche und junge Erwachsene zwischen 18 und 40 Jahren• Wohnort: Deutschsprachiger Raum (evtl. englisch)• Soziale Lage: Obere Mittelschicht Oberes Bildungsniveau Andere Nutzer werden nicht ausgeschlossen, sondern liegen nur nicht im Mittelpunkt unserer strategischen Ausrichtung. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 15
  • 16. Kundenbedarf und -nutzenZielgruppenbedürfnisse und Motivation• Mobilität hoch mobil und ständig unterwegs, sehr flexibel Wunsch nach Sicherheit und einem geregelten Lebensverlauf• Stressabbau durch Organisation stressiger und zeitlich straff geregelter Tagesablauf, handelt strukturiert nutzt Terminplaner und Notizfunktionen zur Alltagsbewältigung• Trend- und Technikaffinität ist sehr stark technikaffin und besitzt hohe Medienkompetenz offen für neue Trends, probiert gern neues aus und ist experimentell Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 16
  • 17. Kundenbedarf und -nutzenNutzenargumentation• Ist-Zustand: Der Nutzer der definierten Zielgruppe vergisst häufiger Tätigkeiten zu erledigen wenn er an einem bestimmten Ort ist. Zudem könnte er zeit-unkritische Aufgaben an bestimmten Orten nebenbei erledigen, er denkt aber nicht daran.• Soll-Zustand: Der Nutzer organisiert seinen Tagesablauf optimal. Er erledigt unwichtige Tätigkeiten nebenbei und spart sich doppelte Wege durch vergessene Aufgaben. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 17
  • 18. Kundenbedarf und -nutzenNutzenversprechen Der zielgruppenentsprechende Nutzer kann Tätigkeiten nicht nur zeitabhängig, sondern zusätzlich auch ortsabhängig planen und verwalten. Er wird dann nicht nur durch Erreichen eines bestimmten Zeitpunktes, sondern auch bei der räumlichen Annäherung an einen bestimmten Ort daran erinnert. Dies spart dem Nutzer Zeit und Nerven. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 18
  • 19. Kundenbedarf und -nutzenNutzenversprechen Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 19
  • 20. Kundenbedarf und -nutzenUse Case (Use Case-Diagramm) 20
  • 21. Kundenbedarf und -nutzenUser Story (1)Anja läuft durch die Königstraße und entdeckt im Schaufenster einer Boutiqueein rotes Paar High Heels. Weil sie sich unsicher ist, möchte sie ihre FreundinTanja, mit der sie geplant hat morgen Einkaufen zu gehen, um Rat fragen. Siezückt ihr Smartphone, startet todolo und fügt eine neue Aufgabe hinzu.Dieser weist sie den aktuellen Standort zu und legt den Umkreis fest. Dannbeendet sie todolo und geht nach Hause.Am nächsten Tag läuft sie mit Tanja durch die Stadt. Als sie sich in der Näheder Boutique befinden, bekommt Anja eine Meldung auf dem Smartphoneund wird an das Paar Schuhe in dem Schaufenster erinnert. Nun fragt sieTanja um Rat. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 21
  • 22. Kundenbedarf und -nutzenUser Story (2)Hannelore ist neu in der Stadt und kennt sich nicht gut aus. Sie kommt aneinem Restaurant vorbei, von dem sie schon viel Gutes gehört hat. Da siegerade gegessen hat, aber dort gerne Essen würde, erstellt sie sich mit todoloeine Erinnerung. Diese soll sie an das Restaurant erinnern, falls sie zufälligwieder in der Nähe ist.Einige Wochen später läuft sie zufällig in einer Parallelstraße des Restaurantsund bekommt eine Meldung auf dem Display angezeigt. Zum Glück hatHannelore diesmal Hunger und testet schließlich das Restaurant. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 22
  • 23. FinanzierungAufwand und Kosten• Lohnkosten: 0€ Alle vier Projektmitglieder verzichten auf Bezahlung• Entwicklungskosten: 0€ Ausschließlich Open-Source-Software und lizenzfreies Sekundärmaterial• Equipment-Kosten: 0€ Es wird das an der HdM zur Verfügung gestellte und eigene Equipment genutzt• Vertriebskosten: ca. 25€ Kosten für Einbindung in den Android Marketplace. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 23
  • 24. FinanzierungPrivat BusinessKOSTENLOS KOSTENPFLICHTIGWerbefinanziert mit hoch Zusätzliche Features:effizientem Targeting: • Ortsabhängig • Ticket-System • Inhaltsabhängig • Schnittstellen • Synchronisation Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 24
  • 25. FinanzierungErlösmodell• Kurzfristig (6 Monate – 1 Jahr): – Aufbau von Image durch (erfolgreiche) Verbreitung im Android Marketplace – Keine Maßnahmen zur Gewinnerzielung• Langfristig (1 – 2 Jahre): – Werbeschaltung zur Gewinnerzielung – Business-Version zur Gewinnerzielung Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 25
  • 26. Vorgehen1. Monat - Beginn• Sammlung von Projektideen• Aufteilung in Business (Markt-, Konkurrenzanalyse,…) – 2 Personen• und Entwicklung (Klick-Prototyp,…) – 2 Personen• Erstellung von Arbeitspaketen Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 26
  • 27. Vorgehen2. Monat + 3. Monat - Entwicklung• Aufteilung der Haupt-Arbeitspakete – Prototyp-Erstellung• Einarbeitung / Entwicklung / Testing• Fertigstellung der Entwicklungsschritte – Zusammenführen der Ergebnisse• Weihnachtsferien! Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 27
  • 28. Vorgehen4. Monat - Abschluss• Zusammenführen der Ergebnisse – Bugfixing• Vorbereitungen für die MediaNight – Präsentation / Poster – Funktionsfähige Applikation• Abschluss der Entwicklung – Präsentation der Ergebnisse – Abgabe des Source-Code Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 28
  • 29. VorgehenEntwicklung• Aufteilung in Haupt-Arbeitspakete – GUI – Alert – Datenbank – GPS• Eclipse als Entwicklungsumgebung + SVN + Redmine• Detaillierte Informationen im zweiten Teil Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 29
  • 30. Vorgehen (Projektstrukturplan) todolo Projektziel: Ortsabhängige Aufgabenverwaltung für Android-Betriebssysteme GPS GUI Datenbank Alert Organisation Datenbank- GPS-Modul Validierung von Anbindung Alert bei Erreichen Verantwortlichkeit aktivieren / Ideensammlung Nutzereingaben implementieren des Umkreises en festlegen deaktivieren (DAO)Ermittlung des Icons für Entity- Alert bei Erreichen aktuellen Redmine-Tickets Quelltext Favoriten-Buttons Relationship- desStandorts per anlegen kommentieren festlegen Modell Fälligkeitsdatums GPSOptimierte GPS- Optimierungen für SQL-Statements Aufwand buchen Abfrage Bildschrimgrößen GPS-Koordinaten Google Maps- speichern / Abschlusspräsent GUI-Design Anbindung Favoriten ation vorbereiten hinterlegen MediaNight- Ortssuche via Präsentation Google Maps vorbereiten Business-Plan erstellen 30
  • 31. AbschlussWas muss noch getan werden?• Entwicklung: – Beseitigung von kleineren Bugs – Testing – Sortierfunktion via Bewegungssensor implementieren• Informationsrecherche zur Bereitstellung im Android Marketplace• Langfristig: – Überlegungen hinsichtlich Werbeschaltung für kostenlose Version – Bedarfsanalyse hinsichtlich Business-Version – Neue Version mit erweitertem Funktionsumfang durch Feedbacks Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 31
  • 32. Lessons LearnedWas lief schlecht?• Kein strukturiertes Vorgehen, sondern direktes Programmieren -> Stichwort „Modellierung“• Keine anfänglich detaillierte Zerlegung der Teilaufgaben• Studium- und Zeitdruck -> geringer Fortschritt gegen Ende des Projektes Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 32
  • 33. Lessons LearnedWas lief gut?• Zusammenarbeit zwischen Teammitgliedern• … durch regelmäßige Meetings / E-Mails / Redmine• … trotz Erfahrungsdifferenzen• Aufteilung der Aufgaben und Verantwortlichkeiten• … selbständige Arbeitsweise ohne Zeitdruck Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 33
  • 34. Agenda – Teil 2 (Entwicklung)• Graphical User Interface (GUI) – Konzept – Aktivities – Elemente• Applikation/Alerts• Datenbank – Modell – Entwurfsmuster• Global Positioning System (GPS) Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 34
  • 35. GUIKonzept• Tabs ähnlich einem Browser• Listenansicht für Aufgaben• Logischer Aufbau der Bearbeiten-Maske• sprechende Icons• Aussagekräftige Beschriftung, möglichst gering• „as simple as possible“ Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 35
  • 36. GUI Activity TabHost TabWidget ListView ListItem ImageView TextView CheckBoxKarol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 36
  • 37. GUI Activity TabHost TabWidget ListView ListItem ImageView TextView CheckBoxKarol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 37
  • 38. GUI Activity ScrollView Textview EditText ImageButton Spinner ButtonKarol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 38
  • 39. GUI Activity MapView EditText Button ImagebuttonKarol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 39
  • 40. Applikation 1/2• Zwei-Schichten-Architektur – Darstellung & Geschäftslogik – Datenzugriffschicht• Plus Helferklassen• Aspekte einer ereignisgetriebenen Architektur Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 40
  • 41. Aplikation 2/2ui entity• ActTab • Location• TodoList • Task • ActShowOpen • ActShowAll• ActEdit• ActMap• LocationServiceutil dao• Constants • Dao• ListAdapter• LocationNotFoundException• ProxAlert
  • 42. User Interface• 6 Activities• 1 Interface• 1 Service
  • 43. Util• Constants – Konstanten für den Application Context• ListAdapter – Füllen und Anzeigen der Aufgabenlisten – Aktionen auf Listenelementen• LocationNotFoundException• ProxAlert – Handhabung der Ereignisse
  • 44. Ablauf bei Anlegen/BearbeitenActTab ActShowAll ActEdit ActMap ActPos ActShowAll
  • 45. ActEdit Favorite Places@Overrideprotected Dialog onCreateDialog(int id) { ... switch (id) { … case CHOSE_EDIT_FAV_OPTIONS: { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(getText(R.string.take_the_new_place_for_all_tasks_question)).setCancelable(false).setPositiveButton( getText(R.string.yes),new DialogInterface.OnClickListener() {Für alle übernehmen public void onClick(DialogInterface dialog,int id) { use_new_coordiinates_for_all_flag = true; location.setLatitude(lat); Neue Koordinaten bei location.setLongitude(lng); bestehendem Ort Dao.getInstance(ActEdit.this).persist(location); } }).setNegativeButton(getText(R.string.no), new DialogInterface.OnClickListener() {Nur für aktuellen Task public void onClick(DialogInterface dialog, int id) { use_new_coordiinates_for_all_flag = false; Dao dao = Dao.getInstance(ActEdit.this); int favId = location.getFavoriteId(); Ort wird Markierung „Favorit“ entzogen location.setFavoriteId(0); dao.persist(location); location = new Location(lat, lng); Neuer Ort erhält Markierung location.setFavoriteId(favId); Log.v("FavId", "FavId " + favId); location = dao.persist(location); } }); …}
  • 46. ActShowAll List Adapter 1/2public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; try { if (view == null) { LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = vi.inflate(R.layout.list_item, null); } Definition eines Listeneintrags final Task listItem = (Task) mList.get(position); if (listItem != null) { ((TextView) view.findViewById(R.id.tv_name)).setText(listItem.getText().length()>27?listItem .getText().substring(0, 28)+"...":listItem .getText()); ((CheckBox) view.findViewById(R.id.checkbox)).setChecked(listItem.isDone()); Setzen des Icons switch (listItem.getLocation().getFavoriteId()) { case 1: { ((ImageView) view.findViewById(R.id.image)) .setImageResource(R.drawable.ic_fav_1home); break; } case 2: { ((ImageView) view.findViewById(R.id.image)) .setImageResource(R.drawable.ic_fav_2work); break; } case 3: { ((ImageView) view.findViewById(R.id.image)) .setImageResource(R.drawable.ic_fav_3shop); break; } default: { ((ImageView) view.findViewById(R.id.image)) .setImageResource(R.drawable.ic_compass); break; } }…
  • 47. ActShowAll List Adapter 2/2((CheckBox) view.findViewById(R.id.checkbox)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { listItem.setDone(!listItem.isDone()); Dao dao = Dao.getInstance(mContext); Task task = dao.getTaskById(listItem.getId()); Aktualisieren des Status task.setDone(listItem.isDone()); dao.updateTask(task); Benachrichtigung des Nutzers String text = (listItem.isDone() ? mContext.getString(R.string.done_conf): mContext. getString(R.string.open_conf)); Toast.makeText(mContext, textToast.LENGTH_SHORT).show(); if(listItem.isDone()) { Verhindern von Ereignissen task.setConsumed(true); Dao.getInstance(mContext).updateTask(task); } Update der gesamten Liste TodoList showOpen = (TodoList) mContext; showOpen.fillListView(); …
  • 48. Alert @Override public void onReceive(Context context, Intent intent) { long eventID = intent.getIntExtra(EVENTIDEXTRA, -1); Dao dao = Dao.getInstance(context); Task task = dao.getTaskById((int)eventID); if (task.isConsumed()) {Ereignis kann ignoriert werden return; } else { Ereignis wird konsumiert task.setConsumed(true); dao.updateTask(task); } ...
  • 49. ActShowAll Setzen von ProximityAlertsprivate void setProximityAlert(double lat, double lon, float radius, int eventID) { LocationManager locManager = (LocationManager).getSystemService(Context.LOCATION_SERVICE); Intent intent = Identifier new Intent("de.hdm.mobanwend.gruppe4.ui.PROXIMITYALERT"); intent.putExtra(ProxAlert.EVENTIDEXTRA, eventID); PendingIntent pendingIntent = PendingIntent.getBroadcast( getApplicationContext(), eventID - 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); Registrieren locManager.addProximityAlert(lat, lon, radius, -1, pendingIntent);}
  • 50. ActShowAll Setzen von TimeAlerts private void setTimeAlert(int year, int month, int day, int hour, int minute, int eventID) { Intent intent = new Intent("de.hdm.mobanwend.gruppe4.ui.PROXIMITYALERT"); intent.putExtra(ProxAlert.EVENTIDEXTRA, eventID); Definition der Handlung PendingIntent pendingIntent = PendingIntent.getBroadcast(this, eventID + 10000, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar cur_cal = new GregorianCalendar(); cur_cal.setTimeInMillis(System.currentTimeMillis()); Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month - 1); cal.set(Calendar.DAY_OF_MONTH, day); cal.set(Calendar.HOUR_OF_DAY, hour); cal.set(Calendar.MINUTE, minute);Zeit bis zum ersten Auslösen long firstStart = cal.getTimeInMillis() - cur_cal.getTimeInMillis() + SystemClock.elapsedRealtime(); Setzen des Alarms alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstStart, pendingIntent); }
  • 51. Datenbank • SQLite Datenbank unter Android verwendet • 2 Tabellen für Aufgaben und OrteTask LocationID INT PK ID INT PKTEXT TEXT NN LONGITUDE REAL NNLOCATIONID INT NN LATITUDE REAL NNDONE INT NN FAVORITID INTRADIUS INT NNDATETIME DATETIMECONSUMED INT Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 51
  • 52. Datenbank Entwurfsmuster • Singleton-Muster sichert zu, dass es nur eine Instanz einer Klasse gibt und bietet einen globalen Zugriffspunkt für die Instanz • Data Access Object kapselt Zugriff auf Datenquelle, so dass Datenquelle ausgetauscht werden kann, ohne dass der Code verändert wird • Entitäten verwendet um eindeutige Objekte zu bestimmenKarol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 52
  • 53. DatenbankSingleton- Gehört zu den Creational Patterns- Verhindert, dass von einer Klasse mehr als ein Objekt erzeugt werden kann- Üblicherweise global verfügbar- Wird verwendet wenn nur ein Objekt einer Klasse existieren darf oder von dem einizgen Objekt Unterklassen gebildet werden- Z.B. Protokollobjekt für die Ausgabe in einer Datei oder eben Datenbankzugriff Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 53
  • 54. DatenbankSingletonVorteile (gegenüber globalen Variablen)• Zugriffskontrolle lässt sich realisieren• Spezialisierung durch Unterklassenbildunh möglich• Welche Unterklassen verwendet werden, kann man zur Laufzeit entscheiden• Die Einzelinstanz wird erzeugt wenn sie benötigt wird  LAZY CREATION (spart Rechenzeit und Speicherbedarf)• Falls man später doch mehrere Objekte benötigt, lässt sich dies einfach ändern Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 54
  • 55. DatenbankSingletonNachteile- Gefahr der Prozeduralisierung (statt Object-Orientiert zu arbeiten)- Kopplung wird erhöht- Abhängigkeiten zur Singleton Klasse werden verschleiert- Thread-Safety muss zusätzlich implementiert werden (speziell bei Nebenläufigkeit und verteilten System)- Testen teilweise schwieriger Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 55
  • 56. Datenbank Singleton: Aufbau 1. Eine statische Variable des gleichen Typs 2. Einen privaten Konstruktor (von außen kann kein weiteres Objekt der Klasse erzeugt werden) 3. Eine Statische Methode, welche die Instanz zurück gibtDer ganze Trick: Die Klasse verwaltet selbst seine Instanzen. Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 56
  • 57. Datenbankpublic static Dao getInstance(Context ctx) { if (instance == null) { instance = new Dao(ctx, Constants.DATABASE_NAME, Task.DATABASE_TABLE, Task.DATABASE_VERSION); try { db = instance.getWritableDatabase(); } catch (SQLiteException se) { … } db.execSQL(Task.TABLE_CREATE); db.execSQL(Location.TABLE_CREATE); } return instance; } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 58
  • 58. Global Positioning System (GPS)Map-View (Layout)<com.google.android.maps.MapViewandroid:id="@+id/mapview"android:clickable="true"android:apiKey=„Unser apiKey"android:layout_below="@string/maps_suchbereich"android:layout_height="wrap_content"android:layout_width="fill_parent„android:layout_above="@string/maps_auswahlbereich"/> Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 59
  • 59. Global Positioning System (GPS)GPS (LocationManager)if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){progDialog = ProgressDialog.show(ActPos.this, "Bitte warten...", "Position wird ermittelt...", true, false);progDialog.setCancelable(true);mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);LocationListener mlocListener = new MyLocationListener();mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300000, 50, mlocListener);mlocManager.requestLocationUpdates(locationManager.NETWORK_PROVIDER, 300000, 50, mlocListener);getGPS(); }else {showGPSDisabledAlertToUser(); } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 60
  • 60. Global Positioning System (GPS)GPS (LocationListener)public class MyLocationListener implements LocationListener {public void onLocationChanged(Location loc) {int lon = (int) loc.getLatitude();int lat = (int) loc.getLongitude();…ActPos.this.mlocManager.removeUpdates(this); }public void onProviderDisabled(String provider) {// TODO Auto-generated method stub }public void onProviderEnabled(String provider) {// TODO Auto-generated method stub }public void onStatusChanged(String provider,int status, Bundle extras) {// TODO Auto-generated method stub } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 61
  • 61. Global Positioning System (GPS)GPS (GPS-Disabled-Dialog)private void showGPSDisabledAlertToUser(){AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);alertDialogBuilder.setMessage("GPS ist deaktiviert. Möchten Sie es aktivieren?").setCancelable(false).setPositiveButton("GPS aktivieren",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int id){Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);startActivity(callGPSSettingIntent); }});alertDialogBuilder.setNegativeButton("Abbrechen",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int id){finish(); }});AlertDialog alert = alertDialogBuilder.create();alert.show(); } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 62
  • 62. Global Positioning System (GPS)Ortssuche (Aktion bei Klick auf Such-Button)searchButton.setOnClickListener(new OnClickListener() {public void onClick (View arg0) {EditText location = (EditText)findViewById(R.string.ortssuche);String locationName = location.getText().toString();progDialog = ProgressDialog.show(ActMap.this, "Bitte warten...","Ort wird gesucht...", true, false);findLocation(locationName); }}); Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 63
  • 63. Global Positioning System (GPS)Ortssuche (findLocation)private void findLocation(final String locationName) {Thread thrd = new Thread() {public void run() {try {//HintergrundprozessaddressList = geocoder.getFromLocationName(locationName, 5);//leere Nachrichtzustellung um die Ergebnisse anzuzeigenuiCallback.sendEmptyMessage(0); }catch (IOException e) {e.printStackTrace(); }}};thrd.start(); } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 64
  • 64. Global Positioning System (GPS)Ortssuche (findLocation - Ergebnis)private Handler uiCallback = new Handler() {public void handleMessage(Message msg) {…if(addressList != null && addressList.size() > 0) {int lat = (int)(addressList.get(0).getLatitude()*1000000);int lng = (int)(addressList.get(0).getLongitude()*1000000);… Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 65
  • 65. Global Positioning System (GPS)Map-Marker (Marker setzen)private void placeMarker(int lat, int lng) {Drawable marker = getResources().getDrawable(R.drawable.pushpin);marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());myMapView.getOverlays().add(new InterestingLocations(marker, lat, lng)); }private void CenterLocation(GeoPoint centerGeoPoint) {placeMarker(centerGeoPoint.getLatitudeE6(), centerGeoPoint.getLongitudeE6()); }; Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 66
  • 66. Global Positioning System (GPS)Map-Marker (OverlayItem)class InterestingLocations extends ItemizedOverlay<OverlayItem> {private List<OverlayItem> locations = new ArrayList<OverlayItem>();private Drawable marker;private OverlayItem myOverlayItem;boolean MoveMap;public InterestingLocations(Drawable marker, int lat, int lng) {super(marker);this.marker = marker;GeoPoint myPlace = new GeoPoint(lat, lng);myOverlayItem = new OverlayItem(myPlace, "My Place", "My Place");locations.add(myOverlayItem);populate(); }…public void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);boundCenterBottom(marker); } Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 67
  • 67. Global Positioning System (GPS)Map-Marker (Marker bewegen)public boolean onTouchEvent(MotionEvent arg0, MapView arg1) {int Action = arg0.getAction();if (Action == MotionEvent.ACTION_UP){if(!MoveMap) {Projection proj = myMapView.getProjection();GeoPoint loc = proj.fromPixels((int)arg0.getX(), (int)arg0.getY());if (arg0.getAction() == 1) {GeoPoint p = arg1.getProjection().fromPixels((int) arg0.getX(),(int) arg0.getY()); Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 68
  • 68. Global Positioning System (GPS)Map-Marker (Marker bewegen)//Letzten Marker entfernenmyMapView.getOverlays().remove(0);CenterLocation(loc); }}else if (Action == MotionEvent.ACTION_DOWN){MoveMap = false; }else if (Action == MotionEvent.ACTION_MOVE){MoveMap = true; }… Karol Bronke, Daniel Frank, Duygu Kücük, Tobias Weidinger 69
  • 69. Vielen Dank! Gruppe 4 Karol Bronke, Daniel Frank,Duygu Kücük, Tobias Weidinger

×