Android

Spickzettel für Android-Entwicklung.

Links

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

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:

Der Emulator Control ist zu blöd, eine solche kml-Datei zu lesen. Daher muss man sie erst konvertieren (Ergebnis ist wieder kml):

Emulator Control öffnen:

kml-Datei laden:

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>