Situation
Jeder, der sich bei einer Firma als Android-Entwickler bewirbt, muss sich oft mit den typischen personellen und psychologischen Stressfragen auseinandersetzen. Dabei geht es den Personalern eigentlich immer darum, etwas über die Person hinter dem Bewerber zu erfahren. Sobald ein Personaler einen Bewerber auf seine charakterlichen Eigenschaften hin geprüft wurde, gibt es in der Regel auch noch ein Gespräch mit einem oder mehreren Mitgliedern des Software-Entwickler-Teams, die den Bewerber auf seine fachliche Kompetenz hin testen. Welche möglichen Interview-Fragen dabei speziell an Android-Entwickler gerichtet werden könnten, haben wir dir in mehreren Blog-Artikeln zu diesem Thema zusammengestellt und liefern dir auch gleich noch die Antworten dazu an.
Dieser erste Blog-Beitrag liefert insgesamt zehn Fragen und Antworten. Für weitere Fragen geh einfach zu unserem zweiten Blog-Artikel.
Was versteht man unter einem „Content Provider“?
Android führt Apps in sogenannten Sandboxen aus, welche kleine abgeschottete Bereiche innerhalb des Betriebssystems darstellen. Diese Sandboxen sind ein Sicherheitskonzept von Android und bedeuten, dass eine App nicht einfach auf die Daten einer fremden App zugreifen kann. Will nun eine App, ihre Daten für Zugriffe durch andere Apps zur Verfügung stellen, benötigt sie einen Content Provider.
Zu welchem Problem könnte nachfolgender Code führen und wie würdest du das lösen?
Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage); sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); startActivity(sendIntent);
Problem: In der ersten Code-Zeile steht ein impliziter Intent, was man daran erkennt, dass in den Klammer () keine spezifische Klasse definiert wurde. Ein impliziter Intent bedeutet nun, dass nach Aufruf der Methode „startActivity(intent)“ irgendeine App auf dem System gestartet wird, die in der Lage ist, den Intent auszuführen. Welche App das am Ende wird, entscheidet entweder Android selbst (sofern nur eine fähige App installiert ist, die den Intent ausführen kann) oder der Benutzer, nachdem er aus einer Liste eine App ausgewählt hat, die den Intent ausführen soll. Der Programmierer geht beim obigen Code-Fragment jedoch davon aus, dass es immer eine App gibt, die den Intent ausführen kann! Das ist aber auf keinen Fall immer gesichert und könnte zu einem Absturz der App führen, sobald die Methode „startActivity()“ aufgerufen wurde!
Lösung: Um das beschriebene Problem zu lösen und den App-Absturz zu verhindern, sollte vor Aufruf der „startActivity()-Methode“ zunächst geprüft werden, ob es wenigsten eine fähige App gibt, die den Intent weiterverarbeiten kann. Folgendes Code-Fragment zeigt die programmiertechnische Lösung dazu:
if(sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent); }
Wozu werden Intents eingesetzt? Nenne drei Möglichkeiten!
- Zum Starten einer Activity (z.B. startActivity(intent))
- Zum Starten eines Services (z.B. startService(intent))
- Um einen Broadcast zu verschicken (z.B. sendBroadcast(intent))
Was ist eine Activity?
Eine Activity ist für die Darstellung einer Bildschirmseite und den darin befindlichen Steuerelemente (z.B. TextView) zuständig. Die Activity steht zudem für eine Tätigkeit, die in der Regel von einem Benutzer ausgelöst wird.
Worin besteht der Unterschied zwischen einem Fragment und einer Activity und in welchem Zusammenhang stehen die Beiden?
Eine Activity steht für eine Bildschirmseite und allen darin befindlichen Views. Ein Fragment dagegen ist ein modularer Abschnitt einer Activity mit eigenem Lebenszyklus, der beliebig hinzugefügt oder entfernt werden kann. Der Lebenszyklus eines Fragments hängt dabei direkt vom Lebenszyklus seiner Activity ab, d.h. wenn die Activity angehalten wird, werden auch alle Fragmente in ihr angehalten und wenn die Activity zerstört wird, werden auch alle Fragmente mitzerstört.
Was ist der Unterschied zwischen Serializable und Parcelable? Was findet eher Anwendung in Android?
„Serializable“ ist ein standardisiertes Java-Interface, welches zur Serialisierung einer Klasse in Java eingesetzt wird. Dabei enthält das Interface selbst keine Methoden, sondern wirkt lediglich durch seine Existenz, weswegen es auch „Marker-Interface” bezeichnet.
„Parcelable“ dagegen ist ein Android-spezifisches Interface, über welches Sie die Serialisierung implementieren können. Es ist weitaus effizienter als Serializable und löst auch einige Probleme des standardmäßigen Java-Serializable. In Android solltest du dieses Interface unbedingt zur Serialisierung vorziehen.
Was sind sogenannte „Launch Modes“? Wie können diese definiert werden?
Mit einem „Launch Mode“ kannst du festlegen, wie eine neue Instanz einer Activity mit der aktuellen Task verknüpft wird. Diese „Launch Modes“ können dabei auf zwei unterschiedliche Arten definiert werden:
- Über die Manifest-Datei: Wenn du eine Activity in deiner Manifestdatei deklarierst, kannst du angeben, wie die Activity mit Aufgaben verknüpft werden soll, wenn sie gestartet wird.
- Über Intent Flags: Wenn du die startActivity()-Methode aufrufst, kannst du ein Flag in den Intent einfügen, welches angibt, wie bzw. ob die neue Aktivität mit der aktuellen Task verknüpft werden soll.
Was ist der Unterschied zwischen Service und IntentService? Wie werden beide verwendet?
Ein Service wird eingesetzt, wenn eine Funktion unabhängig von der im Vordergrund befindlichen Aktivität permanent verfügbar sein soll (z.B. GPS-Tracker). Der Service wird dabei immer im Hintergrund und ohne Benutzerinteraktion ausgeführt.
Ein „IntentService“ dagegen ist eine abgeleitete Klasse von Service, die asynchrone Anfragen (Intents) bei Bedarf bearbeitet. Der IntentService dient dabei vorranging einfachen Hintergrundaufgaben und wird automatisch in einem eigenen Thread ausgeführt, so dass der Haupt-Thread niemals blockiert wird.
Was genau bedeutet ANR? Was führt dazu?
ANR steht für „Android Not Responding“. Diese Rückmeldung wird als Dialog angezeigt und tritt immer dann auf, wenn ein Benutzer mit einer Activity interagiert und die Activity sich gerade in der „onResume()-Methode“ befindet.
Zu diesem Zustand kommt es, wenn etwa eine langwierige Aufgabe wie z.B. das Herunterladen von Daten im Haupt-Thread ausgeführt wird. Die Lösung des Problems besteht darin, solche Aufgaben im Hintergrund mit Hilfe der AsyncTask-Klasse zu starten.
Besteht die Möglichkeit eine Activity ohne Benutzer-Oberfläche zu erstellen?
Ja, eine Activity kann ohne Benutzeroberfläche angelegt werden. Diese Activities werden als abstrakte Activities behandelt.