Habe mich heute das erste mal etwas intensiver mit Android Development beschaeftigt. Ok, ich wusste es ist die Sprache Java und es gibt irgendwie Activities etc, aber das wars dann schon.
Erst mal Android Training durchgelesen und eine erste App erstellt. Im Grunde nichts neues, ist schnell zu verstehen... erinnert ein wenig an Webentwicklung aber es kommt immer wieder die Java-Krankheit durch aka XML-Hoelle und etwas Over-Engeneering, aber ich habe schon Schlimmeres gesehen. Der Android-Emulator ist Arschlangsam verglichen mit dem iOS-Simulator.
Eclipse hat mir dann auch nicht mehr gefallen und hab die Android-Integration von Intellij ausprobiert. Macht etwas mehr Spass. Hab dann versucht eine GUI zu bauen - haendisch mit XML... joaeeeeeoo..
Hab mich da jetzt nicht an irgendwelche Styleguides gehalten, weil ich die mir noch gar nicht angeschaut habe. Ich finde so wie es hier gemacht ist, macht es die ganze Sache auch nicht unbedingt leicht sich an die Styleguides zu halten, man muss sehr viel selber beachten. Apple gibt hier etwas mehr Hilfestellung. Ok. Es ist nicht die spassigste Entwicklererfahrung die ich jemals hatte, aber ich denke es ist Ok um GUIs zu bauen, wenn man etwas Uebung hat. Natuerlich fuehle ich mich in Xcode und Objective-C wohler, habe damit deutlich mehr gemacht...
Das wahrscheinlich Besonderste hinter Android ist wahrscheinlich das Konzept mit Activities und Intents. Eine Activity ist eine Java-Klasse die, soweit ich das verstanden habe, eine Sicht auf dem Smartphone repraesentiert, die der User gerade sieht. Jede andere "Seite" wird in der Regel in einer eigenen Activity beschrieben. Andere Activities ruft man auf, indem man Intents erstellt. Intent-Objekte definieren wie der Name wohl sagt die Intention eine Activity aufzurufen.
So kann man in meiner App von einem Screen zum naechsten wechseln, wenn man auf den Ok-Button tippt:
D.h. Intents werden praktisch verwendet um andere Views innerhalb der eigenen Anwendung aufzurufen. Der Witz ist jetzt, dass Intents auch verwendet werden um Activities anderer Apps aufzurufen. Dabei muss man nicht mal die andere App genau kennen, man kann z.B. die Intention ausdruecken eine bestimmte URL aufrufen zu wollen, oder ein Bild zu oeffnen... oder eine Mail verschicken zu wollen... oder eine Nummer zu waehlen... oder Text/Bild in einem Social Network zu sharen... ja sogar ein Bild von der Kamera aufzunehmen... wofuer iOS teilweise eigene APIs hat, basiert in Android das alles auf dem gleichen System: Man erstellt ein Intent-Objekt mit bestimmten Parametern und setzt es ab. Das macht die ganze Geschichte natuerlich etwas flexibler und erklaert die bessere Integration von Android-Apps untereinander.
Will ich eine Webseite aufrufen, macht man folgendes:
Apps koennen in einer Manifest-Datei definieren, dass sie bestimmte Intent-Typen unterstuetzen. Eine App kann definieren, dass sie HTTP-URLs oeffnen kann... oder Bilder... etc. etwas aehnliches hat iOS auch in Form von "welche Dateitypen kann ich als App oeffnen"... aber das System mit den Intents geht etwas weiter: Eine App kann definieren, dass sie E-Mails verschicken kann, oder Custom Webbrowser die den System-Browser ersetzen etc...
Mit einem Intent kann man Bilder von der Kamera aufnehmen, es startet die entsprechende Activity die Kamera-Bilder aufnehmen kann (was man wahrscheinlich auch durch eine andere App ersetzen koennte?):
...und das Bild dann auslesen... Intents kann man Parameter mitgeben, eine Activity einer ganz anderen App kann aufgerufen werden, und diese kann wiederum Resultate zurueckliefern, so wie hier das Bild:
Jetzt wird mein Bild angezeigt:
Wenn ich auf den Button klicke, rufe ich eine andere Activity auf. Dazu erzeuge ich eine neue Intent und gebe die eingegebenen Werte als Parameter mit:
Diese neue Activity kann die Parameter auswerten und ist eigentlich ziemlich entkoppelt von der ersten Activity:
Jede Activity wird, egal ob von extern oder intern, immer durch ein Intent-Objekt aufgerufen. Dieses Intent-Objekt kann die Activity mit getIntent() ermitteln und so die Intent-Parameter auslesen. Wenn der User auf dem Homescreen auf ein Icon klickt um eine App zu starten, wird auch ein Intent-Objekt erzeugt. Das ganze macht alles irgendwie Sinn.
Danach habe ich mich mit Notifications beschaeftigt. Auch hier spielen Intents eine Rolle. Man gibt der Notification eine Intent-Instanz mit, die angibt was passieren soll wenn der User auf die Notification tippt. In meinem Beispiel rufe ich onpsx mit dem Webbrowser des Users auf:
Intents everywhere.
Erst mal Android Training durchgelesen und eine erste App erstellt. Im Grunde nichts neues, ist schnell zu verstehen... erinnert ein wenig an Webentwicklung aber es kommt immer wieder die Java-Krankheit durch aka XML-Hoelle und etwas Over-Engeneering, aber ich habe schon Schlimmeres gesehen. Der Android-Emulator ist Arschlangsam verglichen mit dem iOS-Simulator.
Eclipse hat mir dann auch nicht mehr gefallen und hab die Android-Integration von Intellij ausprobiert. Macht etwas mehr Spass. Hab dann versucht eine GUI zu bauen - haendisch mit XML... joaeeeeeoo..
Hab mich da jetzt nicht an irgendwelche Styleguides gehalten, weil ich die mir noch gar nicht angeschaut habe. Ich finde so wie es hier gemacht ist, macht es die ganze Sache auch nicht unbedingt leicht sich an die Styleguides zu halten, man muss sehr viel selber beachten. Apple gibt hier etwas mehr Hilfestellung. Ok. Es ist nicht die spassigste Entwicklererfahrung die ich jemals hatte, aber ich denke es ist Ok um GUIs zu bauen, wenn man etwas Uebung hat. Natuerlich fuehle ich mich in Xcode und Objective-C wohler, habe damit deutlich mehr gemacht...
Das wahrscheinlich Besonderste hinter Android ist wahrscheinlich das Konzept mit Activities und Intents. Eine Activity ist eine Java-Klasse die, soweit ich das verstanden habe, eine Sicht auf dem Smartphone repraesentiert, die der User gerade sieht. Jede andere "Seite" wird in der Regel in einer eigenen Activity beschrieben. Andere Activities ruft man auf, indem man Intents erstellt. Intent-Objekte definieren wie der Name wohl sagt die Intention eine Activity aufzurufen.
So kann man in meiner App von einem Screen zum naechsten wechseln, wenn man auf den Ok-Button tippt:
Code:
Intent intent = new Intent(this, ResultActivity.class);
startActivity(intent);
Will ich eine Webseite aufrufen, macht man folgendes:
Code:
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.onpsx.de"));
startActivity(intent);
Mit einem Intent kann man Bilder von der Kamera aufnehmen, es startet die entsprechende Activity die Kamera-Bilder aufnehmen kann (was man wahrscheinlich auch durch eine andere App ersetzen koennte?):
Code:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);
...und das Bild dann auslesen... Intents kann man Parameter mitgeben, eine Activity einer ganz anderen App kann aufgerufen werden, und diese kann wiederum Resultate zurueckliefern, so wie hier das Bild:
Code:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK && requestCode == 0) {
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.get("data");
ImageView imageView = (ImageView)findViewById(R.id.user_picture);
imageView.setImageBitmap(bitmap);
}
}
Wenn ich auf den Button klicke, rufe ich eine andere Activity auf. Dazu erzeuge ich eine neue Intent und gebe die eingegebenen Werte als Parameter mit:
Code:
Intent intent = new Intent(this, ResultActivity.class);
intent.putExtra("firstName", ((EditText)findViewById(R.id.firstName)).getText().toString());
intent.putExtra("lastName", ((EditText)findViewById(R.id.lastName)).getText().toString());
intent.putExtra("age", ((EditText)findViewById(R.id.age)).getText().toString());
startActivity(intent);
Diese neue Activity kann die Parameter auswerten und ist eigentlich ziemlich entkoppelt von der ersten Activity:
Code:
Intent intent = getIntent();
String firstName = intent.getStringExtra("firstName");
String lastName = intent.getStringExtra("lastName");
String age = intent.getStringExtra("age");
TextView textView = (TextView)findViewById(R.id.result_text);
textView.setText("Thank you " + firstName + "! Your full name is " + firstName + " " + lastName + " and you are " + age + " years old." );
Danach habe ich mich mit Notifications beschaeftigt. Auch hier spielen Intents eine Rolle. Man gibt der Notification eine Intent-Instanz mit, die angibt was passieren soll wenn der User auf die Notification tippt. In meinem Beispiel rufe ich onpsx mit dem Webbrowser des Users auf:
Code:
Intent newIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.onpsx.de"));
NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification.Builder(getApplicationContext())
.setSmallIcon(R.drawable.onpsx)
.setContentTitle("Hey you!")
.setContentText("Visit OnPSX...")
.setContentIntent(PendingIntent.getActivity(this, 0, newIntent, 0))
.build();
nm.notify(1, notification);
Intents everywhere.