Android
Spickzettel für Android-Entwicklung.
Links
- Android developers - Die offizielle Seite für Android-Entwicklung
- Mapping von Android Version und API-Level
- Übersicht über Android-Core-Icons
- Übersicht über die View-Typen
- Blog-Artikel Using SVG Vector Drawables in Android
Background-Thread und UI-Thread
TODO ausarbeiten
TODO hinzufügen: https://stackoverflow.com/questions/12850143/android-basics-running-code-in-the-ui-thread
AsyncTask.execute(new Runnable() {
@Override
public void run() {
// Your background code
}
});
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
// Your UI thread code
}
});
Heap-Dump ansehen
- Im Menü von Android Studio: Tools -> Android -> Android Device Monitor
- Im Android Device Monitor:
- Links Prozess wählen
- Links oben in Toolbar "Update Heap" aktivieren
- Im Tab "Heap" auf "Cause GC" klicken
- Links oben in Toolbar "Dump HPROF file" klicken. Das dauert eine Weile ohne Progress. Irgendwann kommt Speichern-Dialog.
hprof
-Datei in Android Studio öffnen
Android-Quellcode besorgen
Google legt einem einige Steine in den Weg, wenn man den Android-Java-Code holen möchte. Einen einfachen Download der Quellen oder gar ein sources.zip im Maven-Repository gibt es nicht.
Die folgende Anleitung zeigt wie es geht:
Android auschecken (dauert eine Weile, ca. 560 MB, Stand: 21.03.2011):
git clone git://git.source.android.com/platform/frameworks/base android-base
Tags auflisten:
cd android-base/
git tag -l android-*
Gewünschten Tag auschecken:
git checkout android-1.6_r2
Alle Java-Quell-Dateien in ein src.zip packen:
rm ../android-src.zip
startdir=`pwd` && for srcdir in `find . -path '*/java'`; do cd $srcdir && zip -vgr $startdir/../android-src.zip . -i '*.java' && cd $startdir; done
Hinweis: In dem Zip ist nicht der Quellcode der externen Bibliotheken (z.B. commons HttpClient) enthalten. Diesen muss man evtl. noch dazu packen (z.B. den Quellcode des Apache commons HttpClient, Version 4.0 für Android 1.6).
Quellcode in Maven-Repo installieren:
mvn install:install-file -Dfile=../android-src.zip -DgroupId=com.google.android -DartifactId=android -Dversion=1.6_r2 -Dpackaging=jar -Dclassifier=sources
KML-Files im Emulator abspielen
KML-Datei erstellen:
- Google Earth öffnen
- Eine Route erstellen
- In der linken Liste Rechtsklick auf die Route
- Im Kontextmenü "Ort speichern unter" auswählen
- Als kml-Datei abspeichern
Der Emulator Control ist zu blöd, eine solche kml-Datei zu lesen. Daher muss man sie erst konvertieren (Ergebnis ist wieder kml):
- kml-Datei hier konvertieren: http://ge2adt.appspot.com/
Emulator Control öffnen:
- In Eclipse: Window -> Show View -> Emulator Control
- Im ddms: Rechts oben "Emulator Control" auswählen.
kml-Datei laden:
- Im "Emulator Control" zum Bereich "Location Controls" scrollen
- Auf den Tab "KML" wechseln.
- Hier kann man nun die kml-Datei laden
- Unter der Tabelle sind Knöpfe zum Abspielen der Route im Emulator
How-Tos
How-To: Eine Activity hinzufügen
Unter res/layout
eine neue Layout-XML-Datei anlegen (im Beispiel: res/layout/my.xml
).
Die Activity-Klasse schreiben:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my);
... // Init view
loadSettings();
}
@Override
public void onPause() {
saveSettings();
super.onPause();
}
private void saveSettings() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = prefs.edit();
...
editor.commit();
}
private void loadSettings() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
...
}
}
Die Activity in der AndroidManifest.xml
bekannt machen:
<manifest ...>
<application ...>
<activity
android:name=".activity.MyActivity"
android:label="@string/my_activity_title"
android:configChanges="keyboardHidden|orientation"
android:theme="@style/MyTheme"
android:screenOrientation="portrait">
</activity>
</application>
</manifest>
Den Activity-Titel in die res/values/strings.xml
eintragen:
<resources>
<string name="my_activity_title">My activity</string>
</resources>
Das Theme in die res/values/styles.xml
eintragen:
<resources>
<style name="MyTheme" parent="@android:style/Theme.Light">
</style>
</resources>
Workarounds
Button in ListView verhindert onItemClick
Wenn in einer ListView
in einer Zeile eine fokusierbare View
(zum Beispiel ein Button
) drin steckt, dann wird bei einem Klick auf die Zeile der OnItemClickListener
nicht aufgerufen.
Die Lösung dieses Problem ist, die fokusierbare View
nicht mehr fokusierbar zu machen.
Beispiel-Layout einer solchen Zeile:
<LinearLayout
...>
...
<Button
...
android:focusable="false"
android:focusableInTouchMode="false">
</Button>
</LinearLayout>