<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Is it just &#12415;?</title>
	<atom:link href="http://blog.himmelrath.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.himmelrath.net</link>
	<description>ungeordneter Unfug</description>
	<lastBuildDate>Fri, 30 Dec 2011 14:42:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[Linux] Verzeichnis mit Hard-Links kopieren</title>
		<link>http://blog.himmelrath.net/blog/2011/11/16/linux-verzeichnis-mit-hard-links-kopieren/</link>
		<comments>http://blog.himmelrath.net/blog/2011/11/16/linux-verzeichnis-mit-hard-links-kopieren/#comments</comments>
		<pubDate>Wed, 16 Nov 2011 18:51:49 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[hard links]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1556</guid>
		<description><![CDATA[Wieder einer dieser Einträge um es selbst nicht wieder zu vergessen...

Wenn man versucht ein Verzeichnis mit Hard-Links einfach so zu kopieren, erstellt man für jede Datei eine neue im Zielverzeichnis, auch wenn im Original zwei Dateien auf die gleichen Daten auf der Festplatte zeigen (hard link).

In meinem Fall hatte ich <a href="http://blog.himmelrath.net/blog/2011/11/16/linux-verzeichnis-mit-hard-links-kopieren/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Wieder einer dieser Einträge um es selbst nicht wieder zu vergessen&#8230;</p>
<p>Wenn man versucht ein Verzeichnis mit Hard-Links einfach so zu kopieren, erstellt man für jede Datei eine neue im Zielverzeichnis, auch wenn im Original zwei Dateien auf die gleichen Daten auf der Festplatte zeigen (hard link).</p>
<p>In meinem Fall hatte ich ein inkrementelles Backup gemacht, bei dem alle unveränderten Dateien nur &#8220;hart&#8221; mit der Datei aus dem letzten Backup verlinkt wurden, so habe ich jeweils einen Snapshot des so gesicherten Verzeichnisses ohne sehr viel Platz einzunehmen. Beim Versuch meine Backup-Platte auf eine Größere umzuziehen sagte er mir dann, dass mir ein paar TB an Platz fehlen.</p>
<p>Die Lösung ist einfach: Hard-Links mit kopieren. Das mache ich mit dem gleichen Tool mit dem ich das Backup auch erstellt habe, rsync:</p>
<pre>rsync -a -H -v /altePlatte/backup /neuePlatte/backup</pre>
<p>Die Optionen machen folgendes:</p>
<table style="margin-left: 30px; margin-right: 30px;">
<tbody>
<tr>
<td style="width: 40px; vertical-align: top;">-a</td>
<td>Ist eine zusammenfassung (fast) aller Optionen die man benötigt um ein Backup mit rsync zu machen</td>
</tr>
<tr>
<td style="width: 40px; vertical-align: top;">-H</td>
<td>Der springende Punkt &#8211; sucht nach Hard-Links und stellt diese im Zielverzeichnis wieder her</td>
</tr>
<tr>
<td style="width: 40px; vertical-align: top;">-v</td>
<td>Zeigt welche Datei gerade kopiert wird. Gibt mir ein besseres Gefühl, wenn ich nicht Stundenlang auf einen leeren Bildschirm gucke und einfach nur hoffe, dass im Hintergrund alles läuft.</td>
</tr>
</tbody>
</table>
<p>Vorsicht: die &#8220;-H&#8221;-Option benötigt ziemlich viel Speicher, weil rsync sich für jede Datei merken muss, wo ihre Daten liegen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/11/16/linux-verzeichnis-mit-hard-links-kopieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Android] Service automatisch mit dem Gerät starten</title>
		<link>http://blog.himmelrath.net/blog/2011/09/30/android-service-mit-gerat-starten/</link>
		<comments>http://blog.himmelrath.net/blog/2011/09/30/android-service-mit-gerat-starten/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 16:35:27 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Sonstiges]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1476</guid>
		<description><![CDATA[Nachdem ich beschrieben habe, wie man auch einfache Weise zwischen einem Service und einer Activity kommunizieren kann, möchte ich natürlich den Service auch als solchen nutzen, nämlich als stillen Wächter im Hintergrund der (fast) immer aktiv ist.

Dazu muss ich den Service irgendwie automatisch starten. Wie man das macht findet man <a href="http://blog.himmelrath.net/blog/2011/09/30/android-service-mit-gerat-starten/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/blog/2011/09/28/android-zugriff-auf-ui-durch-service/">Nachdem ich beschrieben habe</a>, wie man auch einfache Weise zwischen einem Service und einer Activity kommunizieren kann, möchte ich natürlich den Service auch als solchen nutzen, nämlich als stillen Wächter im Hintergrund der (fast) immer aktiv ist.</p>
<p>Dazu muss ich den Service irgendwie automatisch starten. Wie man das macht <a href="http://stackoverflow.com/questions/990217/android-app-with-service-only">findet man relativ schnell</a> &#8211; nun will ich es hier einmal <a href="http://blog.himmelrath.net/blog/2011/09/28/android-zugriff-auf-ui-durch-service/">am oben genannten Beispiel</a> zeigen.</p>
<p>Um einen Service zu starten, wenn etwas bestimmtes passiert, müssen wir drei Dinge tun:</p>
<ol>
<li>Unseren Service auf die gewünschten Ereignisse &#8220;lauschen&#8221; lassen.</li>
<li>Uns die Erlaubnis holen diese Ereignisse zu bedienen.</li>
<li>Den Service starten sobald das Ereignis eintrifft.</li>
</ol>
<p>Um das zu bewerkstelligen muss man sogenannte Intents nutzen. Dafür gibt es Intents selber, Intent Categories, Broadcastreceiver usw. und das ist IMHO nicht sonderlich intuitiv &#8211; daher habe ich darüber <a href="http://blog.himmelrath.net/blog/2099/09/29/android-das-problem-mit-intents/">einen eigenen Artikel</a> geschrieben.</p>
<p>&#8220;Lauschen&#8221; kann man mit Hilfe eines so genannten BroadcastReceivers, das ist einfach eine Klasse die die Klasse BroadcastReceiver erweitert und deren Methode onReceive() automatisch aufgerufen wird sobald ein registriertes Broadcast-Event eintritt.</p>
<p>In meinem Fall füge ich die folgende Klasse &#8220;ServiceBroadcastReceiver&#8221; einfach neue Klasse meinem Service hinzu:</p>
<pre>    public class ServiceBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action != null) {
                if (
                    action.equals(Intent.ACTION_BOOT_COMPLETED)
                    || action.equals(Intent.ACTION_USER_PRESENT)
                ) {
                    Intent startServiceIntent = new Intent(context, MyService.class);
                    context.startService(startServiceIntent);
                }
            }
        }
    }</pre>
<p><strong>Wichtig:</strong> Man kann den Receiver augenscheinlich nicht als Nested Class innerhalb einer anderen Klasse wie z.B. dem Service deklarieren, wenn man ihn über das Manifest registrieren möchte.</p>
<p>Das obige Codebeispiel sorgt dafür, dass im Falle der Ereignisse &#8220;Gerät wurde gestartet&#8221; (Intent.ACTION_BOOT_COMPLETED) und &#8220;Bildschirm wurde entsperrt&#8221; (Intent.ACTION_USER_PRESENT) der Service &#8220;MyService&#8221; gestartet wird. Falls der Service schon läuft passiert nichts.</p>
<p>Damit lauscht der Receiver allerdings noch nicht, er muss noch in der AndroidManifest.xml als Receiver eingetragen werden, damit das System weiß, dass dort überhaupt ein Receiver ist.</p>
<p>Ein kleiner Hinweis zum Namen: Wenn ich einen Klassennamen in das Manifest eintrage, kann ich das auf mehrere Arten tun:</p>
<ol>
<li>Vollständiger Name. Sowas wie &#8220;com.hell.the.what.android.MyClass&#8221;</li>
<li>Name im festgelegten &#8220;default&#8221; package. Sowas wie &#8220;.MyClass&#8221; &#8211; bedeutet, dass &#8220;MyClass&#8221; in dem package gesucht wird, dass im Manifest als attribut &#8220;package&#8221; festgelegt wurde.</li>
<li>Nur der Name. Sowas wie &#8220;MyClass&#8221; &#8211; sollte im Zweifelsfall genauso funktionieren wie 2, ist aber AFAIK nicht spezifiziert.</li>
</ol>
<p>(Spezialfall: Der Vollständige Name einer &#8220;Nested Class&#8221; wird als Name der umgebenden Klasse, dahinter ein &#8220;$&#8221; und dahinter der Name der verschachtelten Klasse geschrieben: &#8220;.MyClass$NestedClass&#8221;  &#8211; Aber wie oben bereits gesagt, funktioniert das augenscheinlich nicht bei Receivern.)</p>
<p>In diesem Fall fügt man folgendes in das AndroidManifest ein:</p>
<pre>    &lt;receiver android:name=".ServiceBroadcastReceiver"&gt;
        &lt;intent-filter&gt;
            &lt;action android:name="android.intent.action.BOOT_COMPLETED"&gt;&lt;/action&gt;
            &lt;action android:name="android.intent.action.USER_PRESENT"&gt;&lt;/action&gt;
            &lt;category android:name="android.intent.category.DEFAULT"&gt;&lt;/category&gt;
        &lt;/intent-filter&gt;
    &lt;/receiver&gt;</pre>
<p>Damit sagt man nichts anderes als &#8220;Im Falle von BOOT_COMPLETED oder USER_PRESENT, rufe meinen Receiver auf&#8221;. Die Default Category muss hinzugefügt werden, damit der Matcher auf die beiden Ereignisse anspricht &#8211; ansonsten passiert einfach nichts.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/09/30/android-service-mit-gerat-starten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Android] Das Problem mit Intents</title>
		<link>http://blog.himmelrath.net/blog/2011/09/30/android-das-problem-mit-intents/</link>
		<comments>http://blog.himmelrath.net/blog/2011/09/30/android-das-problem-mit-intents/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 16:35:06 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1486</guid>
		<description><![CDATA[Bei Android dreht sich alles um Intents. Wenn man eine einfache Applikation in Eclipse entwickelt muss man sich damit nicht unbedingt auseinandersetzen, weil die korrekten Daten für einen eingetragen werden, aber spätestens wenn man einen Service implementiert oder auf externe Ereignisse reagieren will muss man sich mit Intents beschäftigen.

Da ich <a href="http://blog.himmelrath.net/blog/2011/09/30/android-das-problem-mit-intents/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Bei Android dreht sich alles um <a href="http://developer.android.com/guide/topics/intents/intents-filters.html">Intents</a>. Wenn man eine einfache Applikation in Eclipse entwickelt muss man sich damit nicht unbedingt auseinandersetzen, weil die korrekten Daten für einen eingetragen werden, aber spätestens wenn man einen Service implementiert oder auf externe Ereignisse reagieren will muss man sich mit Intents beschäftigen.</p>
<p>Da ich Probleme damit hatte das System zu verstehen, will ich hier einmal das was ich gelernt habe zusammenfassen, schon alleine weil ein Aufschreiben immer dabei hilft das eigene Wissen in geordnete Bahnen zu lenken und Lücken zu finden.</p>
<h3>Was sind Intents</h3>
<p>Intents sind erst einmal nur eines: Nachrichten.</p>
<p>Google hat in seinem Android-Betriebssystem quasi eine Architektur gebaut, in der alle möglichen Komponenten getrennt voneinander erstellt werden können und über diese Nachrichten miteinander kommunizieren, sich aufrufen und aufeinander reagieren können. Intents sind quasi IPC, Hooks, Systemintegration und Prozess-Aufrufe in einem.</p>
<p>Intents können für folgende Aufgaben genutzt werden:</p>
<ol>
<li>Eine Aktivity oder einen Service starten</li>
<li>Das Programm im System verankern</li>
<li>Auf ein Ereignis reagieren</li>
</ol>
<p>Dafür gibt es zwei Arten von Intents (die im Quelltext beide ein &#8220;Intent&#8221; sind), die sich durch die enthaltene Information unterscheiden:</p>
<ul>
<li>explizite Intents</li>
<li>implizite Intents</li>
</ul>
<p>Explizite Intents enthalten einen absoluten Komponentennamen, z.B. den genauen Namen des Service der gestartet werden soll. Android kümmert sich darum, dass diese Intents genau bei dieser Komponente ankommen.</p>
<p>Implizite Intents enthalten quasi &#8220;nur&#8221; Informationen darüber was passiert &#8211; wer/was darauf reagiert hängt davon ab welche Applikationen sich im System mit einem passenden Intent-Filter registriert haben. Passt der Implizite Intent auf den registrierten Filter einer Applikation wird die Komponente zu der der Filter definiert wurde aufgerufen.</p>
<h3>Eine Aktivity oder einen Service starten</h3>
<p>Der einfachste und offensichtlichste Fall. Genau dafür gibt es folgende Methoden der Klasse Context: <a href="http://developer.android.com/reference/android/content/Context.html#startActivity(android.content.Intent)">startActivity</a> und <a href="http://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)">startService</a> &#8211; denen übergibt man einen Intent der den genauen Namen der Activity bzw. des Service (also ein expliziter Intent) enthält (man kann darüber hinaus nahezu beliebige zusätzliche Informationen in den Intent packen und diese dann beim Starten des Service oder der Activity abfragen). Das macht man im Code einer Activity dann z.B. so:</p>
<pre>    startService(new Intent(this, MyService.class));</pre>
<p>Hier wird ein neuer Intent erstellt, mit der aufrufenden Activity als Context und dem zu startenden Service als Komponentenname  direkt an die Methode startService der Activity übergeben wird. Es handelt sich hier um einen expliziten Intent, da die zu startende Komponente eindeutig spezifiziert ist (nämlich durch den Wert von MyService.class).</p>
<h3>Das Programm im System verankern</h3>
<p>Dieser Fall ist deutlich weniger intuitiv als der vorherige. Ich will das ganze mal an einem in wohl 95% aller Applikationen vorhandenem Beispiel veranschaulichen:</p>
<p>Um meine Applikation in der Liste der vorhandenen Applikationen aufzulisten muss ich diese im System registrieren &#8211; soweit alles wie üblich. Allerdings muss ich bei Android nicht die Applikation, sondern z.B. eine meiner Activities registrieren, und zwar für den Intent der für die Applikationsliste &#8220;gesendet&#8221; wird. Genauer: Im Manifest meiner Applikation muss stehen, dass meine Activity auf den Intent mit der Action &#8220;android.intent.action.MAIN&#8221; in der (Intent-)Category &#8220;android.intent.category.LAUNCHER&#8221; registriert ist.</p>
<p>Im Manifest sieht das dann z.B. so aus:</p>
<pre>    &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
        &lt;activity android:name=".MainActivity"&gt;
            &lt;intent-filter&gt;
                &lt;action android:name="android.intent.action.MAIN"&gt;&lt;/action&gt;
                &lt;category android:name="android.intent.category.LAUNCHER"&gt;&lt;/category&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;
    &lt;/application&gt;</pre>
<p>Eclipse erstellt diesen Intent-Filter sogar automatisch.</p>
<h3>Auf ein Ereignis reagieren</h3>
<p>Wenn ich es richtig verstehe ist dies eigentlich nur eine andere Form des vorherigen.</p>
<p>Wenn ich z.B. möchte, dass mein Service automatisch gestartet wird, sobald das Telefon startet, dann muss ich ihn für die Action &#8220;android.intent.action.BOOT_COMPLETED&#8221; registrieren und dann natürlich noch eine Möglichkeit zur Verfügung stellen darauf zu reagieren. Die Action wird vom System erzeugt, dann guckt das System nach was sich dafür registriert hat (genauer, welche Intent-Filter passen) und schickt dann diesen Intent an genau diese registrierten Applikationen &#8211; das nennt Android dann &#8220;Broadcast&#8221;.</p>
<p>Um einen Broadcast empfangen (&#8220;to receive&#8221;) zu können benötigt man einen &#8211; Überraschung! &#8211; BroadcastReceiver, darauf gehe ich in <a href="http://blog.himmelrath.net/blog/2099/09/29/android-service-mit-gerat-starten/">diesem Posting</a> näher ein. Ein ganz einfacher Receiver sieht ungefähr so aus:</p>
<pre>    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // Do something based on the Intent received
        }
    }</pre>
<p>Da wo jetzt der Kommentar steht würden wir natürlich überprüfen welche Action gesendet wurde und im Falle von &#8220;android.intent.action.BOOT_COMPLETED&#8221; eben den Service starten.</p>
<p>Jetzt muss ich diesen Receiver genau wie meine Activity im vorherigen Beispiel noch im Manifest eintragen und dort in Form eines Intent-Filters mitteilen wann das System denn nun den Receiver aufrufen soll. Das sieht dann in unserem Beispiel so aus:</p>
<pre>    &lt;receiver android:name="com.example.MyBroadcastReceiver"&gt;
        &lt;intent-filter&gt;
            &lt;action android:name="android.intent.action.BOOT_COMPLETED"&gt;&lt;/action&gt;
            &lt;category android:name="android.intent.category.HOME"&gt;&lt;/category&gt;
        &lt;/intent-filter&gt;
    &lt;/receiver&gt;</pre>
<p>Dieser Abschnitt muss (genau wie das activity-Element oben) innerhalb des application-elements geschachtelt sein.</p>
<h3>Hinweis</h3>
<p>Hier endet mein &#8220;Wissen&#8221; über Intents, ich will schwer hoffen, dass sich das in nächster Zeit noch vertiefen wird, aber das kommt dann mit der weiteren Entwicklung.</p>
<p>Über Hinweise, Korrekturen und Kritik würde ich mich sehr freuen &#8211; ich hab schließlich noch einen langen Weg vor mir bis zum Android-Experten. <img src='http://blog.himmelrath.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/09/30/android-das-problem-mit-intents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Android] Zugriff auf UI durch einen Service</title>
		<link>http://blog.himmelrath.net/blog/2011/09/29/android-zugriff-auf-ui-durch-service/</link>
		<comments>http://blog.himmelrath.net/blog/2011/09/29/android-zugriff-auf-ui-durch-service/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 17:07:14 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1465</guid>
		<description><![CDATA[Da ich mich gerade wieder mit Android beschäftige, möchte ich hier einmal einen einfachen Weg darstellen, wie man die UI (Activity) von einem Hintergrund-Dienst (Service) aus verändern kann.

Wenn man im Netz nach einer Lösung für dieses Problem sucht, wird man schnell in Richtung Handler geschickt - diese Lösung finde ich <a href="http://blog.himmelrath.net/blog/2011/09/29/android-zugriff-auf-ui-durch-service/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Da ich mich gerade wieder mit Android beschäftige, möchte ich hier einmal einen einfachen Weg darstellen, wie man die UI (<a href="http://developer.android.com/guide/topics/fundamentals/activities.html">Activity</a>) von einem Hintergrund-Dienst (<a href="http://developer.android.com/guide/topics/fundamentals/services.html">Service</a>) aus verändern kann.</p>
<p>Wenn man im Netz nach einer Lösung für dieses Problem sucht, wird man schnell in Richtung Handler geschickt &#8211; diese Lösung finde ich für Minimalaufgaben zu groß und zu aufwändig. Ich wollte einfach nur Nachrichten an die UI schicken, sofern diese überhaupt da ist &#8211; dafür benötigt man keinen extra Handler.</p>
<p>Das Problem ist folgendes: Der Service läuft im Hintergrund und losgelöst von der UI &#8211; er arbeitet also in einem eigenen Thread. Die UI kann nur aus ihrem eigenen Thread verändert werden. Sobald ich also versuche aus dem Service direkt eine Methode in der UI-Activity aufzurufen um eben diese zu verändern, hagelt es Exceptions. Um das zu umgehen muss ich also irgendwie dem UI-Thread sagen &#8220;mach das für mich&#8221; &#8211; hier ist die einfachste Methode, die ich gefunden habe:</p>
<p><strong>Man gibt dem UI-Thread Runnable-Objekte in seine Queue von abzuarbeitenden Aufgaben mit Hilfe der <a href="http://developer.android.com/reference/android/view/View.html#post%28java.lang.Runnable%29">post()-Methode der View</a>.</strong></p>
<p>Und nun die Details:</p>
<p>Erst einmal muss ich den Service starten, so dass er unabhängig von der UI im Hintergrund läuft &#8211; das ist ein anderes Thema, dazu gibt es aber <a href="http://www.google.de/search?hl=en&amp;q=android+start+service">genügend Tutorials im Netz</a>.</p>
<p>Wenn der Service einmal läuft muss er natürlich wissen ob eine Activity vorhanden ist und falls ja, wie er sie erreichen kann. Und hier kommt die schnelle Lösung ins Spiel, die mir zwar theoretisch ein wenig Kopfschmerzen macht, aber praktisch wunderbar funktioniert (sollte dies ein erfahrener Android-Entwickler lesen: Ich freue mich sehr über Verbesserungsvorschläge): Da der Service nur einmal im Hintergrund läuft, geben wir ihm einfach eine statische <a href="http://de.wikipedia.org/wiki/Singleton_%28Entwurfsmuster%29">Singleton</a>-Methode, die von der Activity abgefragt werden kann.</p>
<p>Jetzt müssen wir dem Service nur noch mitteilen, dass die Activity vorhanden ist (quasi wie einen Listener hinzufügen) und schon kann der Service jederzeit mit der Activity kommunizieren. Dafür erstellen wir eine Activity-Variable im Service und eine setActivity()-Methode. (Und falls wir mehrere Activities benachrichtigen wollen machen wir daraus eben eine List&lt;Activity&gt; und eine addActivity()-Methode.)</p>
<p>Jetzt kann der Service jederzeit Methoden auf der Activity aufrufen (so lange diese vorhanden ist).</p>
<p>Wir gehen also folgendermaßen vor:</p>
<ol>
<li>Activity wird gestartet.</li>
<li>Activity erstellt einen Intent zum Starten des Service (da der Service nur einmal gestartet wird, wird dieser also ignoriert wenn der Service schon läuft).</li>
<li>Die Activity erstellt einen Thread, der nichts anderes macht als die Singleton-Methode des Services aufzurufen &#8211; und zwar so lange bis ein valides Service-objekt zurückgegeben wird (das sollte im Normalfall sehr schnell gehen) und diesem nun die Activity mitteilt.</li>
<li>Der Service überprüft wenn er etwas mitteilen soll ob die Activity vorhanden ist &#8211; und falls ja, teilt der Activity mit welche Methode ausgeführt werden soll.</li>
</ol>
<p>Punkt vier ist der interessant Punkt, denn hier passiert die Übergabe von einem Thread in den anderen. In meinem Beispiel will ich der Activity einfach nur einen Text hinzufügen, dafür benutze ich folgenden Code in dem ich das Layout der Activity direkt manipuliere:</p>
<pre>    public void showMessage(String message) {
        TextView tv = new TextView(this);
        tv.setText(message);
        layout.addView(tv);        
    }</pre>
<p>Vorher habe ich das Layout (hier ein LinearLayout) und die View (hier Scrollview) in der onCreate()-Methode der Activity mit folgendem Code in den Membervariablen layout und view abgespeichert, so dass ich nun darauf zugreifen kann:</p>
<pre>        view = new ScrollView(this);
        layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        view.addView(layout);        

        setContentView(view);</pre>
<p>Die Methode showMessage() funktioniert so aber nur, wenn sie im UI-Thread aufgerufen wird. Um das ganze aus dem Thread des Service ausführen zu können, verändere ich den Code folgendermaßen: (&#8220;MainActivity&#8221; muss durch den Namen der Activity-Klasse ersetzt werden.)</p>
<pre>    public void showMessage(final String message) {
        view.post(new Runnable() {
            @Override
            public void run() {
                TextView tv = new TextView(MainActivity.this);
                tv.setText(message);
                layout.addView(tv);        
            }
        });
    }</pre>
<p>Man beachte das &#8220;final&#8221; vor dem Parameter &#8211; dies ist notwendig um den Wert der Variablen im anderen Thread nutzen zu können. Nun muss ich showMessage() nur noch mit meiner Nachricht als Parameter aufrufen und es wird automatisch im UI-Thread ausgeführt.</p>
<p>&nbsp;</p>
<p>Damit alles läuft und der Service auch startet: Nicht vergessen den Service in die AndroidManifest.xml einzutragen.</p>
<hr />
<p><span id="more-1465"></span>In meinem Fall handelt es sich um einen Hintergrunddienst, der passiv auf Location-Updates horcht und diese für spätere Verwendung speichert, hier der Beispiel-Quelltext (den Location-Kram habe ich entfernt und durch eine UI-Spam-Methode ersetzt):</p>
<p>Activity:</p>
<pre>package mi.android.locationTracker;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity {
    // Classes should not contain public Properties. See Coding Guidelines.
    ////////////////////////////////// Constants ///////////////////////////////////
    /////////////////////////////// Static Properties //////////////////////////////
    ///////////////////////////// Public Static Methods ////////////////////////////
    ////////////////////// Protected & Private Static Methods //////////////////////
    ////////////////////////////////// Properties //////////////////////////////////

    private LinearLayout layout;
    private ScrollView view;

    private LocationTrackerService service;

    /////////////////////////// Constructor & Destructor ///////////////////////////
    ////////////////////////////// Implements Activity /////////////////////////////

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create UI
        view = new ScrollView(this);
        layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);
        view.addView(layout);        

        setContentView(view);

        showMessage("UI created...");

        showMessage("Starting service...");

        // Start Service if not already started
        startService(new Intent(this, LocationTrackerService.class));

        showMessage("Waiting for service...");

        // Now tell the service we are here
        new ServiceFetcher(this).start();
    }

    //////////////////////////////// Public Methods ////////////////////////////////

    public void showMessage(final String message) {
        view.post(
            new Runnable() {
                @Override
                public void run() {
                    TextView tv = new TextView(MainActivity.this);
                    tv.setText(message);
                    layout.addView(tv);
                }
            }
        );
    }

    ////////////////////////// Protected & Private Methods /////////////////////////
    //////////////////////////////// Nested Classes ////////////////////////////////

    public class ServiceFetcher extends Thread {
        MainActivity activity = null;

        public ServiceFetcher(MainActivity activity) {
            super();
            this.activity = activity;
        }

        @Override
        public void run() {
            while ((service = LocationTrackerService.getInstance()) == null) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {}
            }

            if (service instanceof LocationTrackerService) {
                service.setActivity(activity);
                showMessage("Service connected...");
            } else {
                showMessage("Service error:" + String.valueOf(service));
            }
        }
    }
}</pre>
<p>Service:</p>
<pre>package mi.android.locationTracker;

import java.util.Date;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class LocationTrackerService extends Service {
    // Classes should not contain public Properties. See Coding Guidelines.
    ////////////////////////////////// Constants ///////////////////////////////////
    /////////////////////////////// Static Properties //////////////////////////////

    private static LocationTrackerService instance = null;

    ///////////////////////////// Public Static Methods ////////////////////////////

    public static LocationTrackerService getInstance() {
        return instance;
    }

    ////////////////////// Protected & Private Static Methods //////////////////////
    ////////////////////////////////// Properties //////////////////////////////////

    private MainActivity activity = null;

    /////////////////////////// Constructor & Destructor ///////////////////////////
    ////////////////////////////// Implements Service //////////////////////////////

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // Horribly simple singleton. Should suffice for our purposes
        instance = this;

        // [snipped] Request passive Location updates etc. Not part of this tutorial...

        // Just for kicks, spam the UI:
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        onSomethingHappened();                        
                        Thread.sleep(5000);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
            }
        }.start();

    }

    public void onSomethingHappened() {
        // Pseudo-method that is called when the activity should be notified

        if (activity instanceof MainActivity) {
            try {
                StringBuffer message = new StringBuffer();
                message.append(new Date().toLocaleString());
                message.append("Calling UI...");

                activity.showMessage(message.toString());
            } catch (Exception e) {
                // TODO: The activity does not seem to be there.
            }
        }

    }

    //////////////////////////////// Public Methods ////////////////////////////////

    public void setActivity(MainActivity activity) {
        this.activity = activity;
    }

    ////////////////////////// Protected & Private Methods /////////////////////////
    //////////////////////////////// Nested Classes ////////////////////////////////
}</pre>
<p>HTH und ich freue mich über Verbesserungsvorschläge.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/09/29/android-zugriff-auf-ui-durch-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bye bye Social Networks</title>
		<link>http://blog.himmelrath.net/blog/2011/09/29/bye-bye-social-networks/</link>
		<comments>http://blog.himmelrath.net/blog/2011/09/29/bye-bye-social-networks/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 16:26:53 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1492</guid>
		<description><![CDATA[Naja, nicht so ganz - ich bleibe noch bei Google+ und Twitter, zumindest so lange bis ich mich dort auch nicht mehr wohl fühle. (Und bei Twitter werde ich immer inaktiver und das wo ich eh nie wirklich aktiv war.)

Zumindest mein Facebook-Account ist seit heute nicht mehr existent, und der <a href="http://blog.himmelrath.net/blog/2011/09/29/bye-bye-social-networks/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Naja, nicht so ganz &#8211; ich bleibe noch bei <a href="https://plus.google.com/115826897067005610321/">Google+</a> und <a href="http://twitter.com/himmelrath">Twitter</a>, zumindest so lange bis ich mich dort auch nicht mehr wohl fühle. (Und bei Twitter werde ich immer inaktiver und das wo ich eh nie wirklich aktiv war.)</p>
<p>Zumindest mein Facebook-Account ist seit heute nicht mehr existent, und der studivz-Account musste gleich mit dran glauben. Bei Facebook ist es ganz klar die Datenschutzpolitik mit der ich nicht einverstanden bin, bei studivz ist es schlicht und ergreifend die Tatsache, dass ich es seit mindestens einem Jahr nicht mehr genutzt habe.</p>
<p>Mal sehen ob meine sozialen Kontakte nun tatsächlich weniger werden, oder &#8211; wie meine SWMBO behauptet &#8211; die wirklichen Kontakte sogar stärker.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/09/29/bye-bye-social-networks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Bild] Rohrbach Markt bei Nacht</title>
		<link>http://blog.himmelrath.net/blog/2011/07/24/rohrbach-markt-bei-nacht/</link>
		<comments>http://blog.himmelrath.net/blog/2011/07/24/rohrbach-markt-bei-nacht/#comments</comments>
		<pubDate>Sun, 24 Jul 2011 14:39:58 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Photos]]></category>
		<category><![CDATA[Animated]]></category>
		<category><![CDATA[Langzeitbelichtung]]></category>
		<category><![CDATA[Photo]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1451</guid>
		<description><![CDATA[<p style="text-align: center;"><a href="http://blog.himmelrath.net/wp-content/uploads/2011/07/ampel_animation_big.gif"><img class="size-full wp-image-1455 aligncenter" title="ampel_animation" src="http://blog.himmelrath.net/wp-content/uploads/2011/07/ampel_animation1.gif" alt="" width="500" height="333" /></a></p>
Das neue Stativ musste ausprobiert werden - außerdem wollte ich mal wieder ein animiertes GIF machen...]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://blog.himmelrath.net/wp-content/uploads/2011/07/ampel_animation_big.gif"><img class="size-full wp-image-1455 aligncenter" title="ampel_animation" src="http://blog.himmelrath.net/wp-content/uploads/2011/07/ampel_animation1.gif" alt="" width="500" height="333" /></a></p>
<p>Das neue Stativ musste ausprobiert werden &#8211; außerdem wollte ich mal wieder ein animiertes GIF machen&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/07/24/rohrbach-markt-bei-nacht/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Selbsportrait</title>
		<link>http://blog.himmelrath.net/blog/2011/07/12/selbsportrait/</link>
		<comments>http://blog.himmelrath.net/blog/2011/07/12/selbsportrait/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 10:19:45 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Photos]]></category>
		<category><![CDATA[Photo]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1441</guid>
		<description><![CDATA[Ich weiß, es ist schon ziemlich eitel ein Bild von sich selbst ins Netz zu stellen - das hier hat aber was, denke ich. <a href="http://blog.himmelrath.net/blog/2011/07/12/selbsportrait/">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>Ich weiß, es ist schon ziemlich eitel ein Bild von sich selbst ins Netz zu stellen &#8211; das hier hat aber was, denke ich.</p>
<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/07/mrt_jens_128.gif"><img class="size-full wp-image-1442 aligncenter" title="Selbstportrait" src="http://blog.himmelrath.net/wp-content/uploads/2011/07/mrt_jens_128.gif" alt="" width="128" height="128" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/07/12/selbsportrait/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[Bild] You know you shouldn&#8217;t</title>
		<link>http://blog.himmelrath.net/blog/2011/07/07/bild-you-know-you-shouldnt/</link>
		<comments>http://blog.himmelrath.net/blog/2011/07/07/bild-you-know-you-shouldnt/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 21:09:49 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Photo]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1437</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/07/IMGA0024.jpg"><img class="size-medium wp-image-1438 aligncenter" title="IMGA0024" src="http://blog.himmelrath.net/wp-content/uploads/2011/07/IMGA0024-225x300.jpg" alt="" width="225" height="300" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/07/IMGA0024.jpg"><img class="size-medium wp-image-1438 aligncenter" title="IMGA0024" src="http://blog.himmelrath.net/wp-content/uploads/2011/07/IMGA0024-225x300.jpg" alt="" width="225" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/07/07/bild-you-know-you-shouldnt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/26/neues-vom-kuhlschrank-63/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/26/neues-vom-kuhlschrank-63/#comments</comments>
		<pubDate>Sun, 26 Jun 2011 19:26:59 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1170</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9949.jpg"><img class="size-medium wp-image-1171 aligncenter" title="img_9949" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9949-300x80.jpg" alt="" width="300" height="80" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9949.jpg"><img class="size-medium wp-image-1171 aligncenter" title="img_9949" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9949-300x80.jpg" alt="" width="300" height="80" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/26/neues-vom-kuhlschrank-63/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/25/neues-vom-kuhlschrank-62/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/25/neues-vom-kuhlschrank-62/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 17:26:21 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1167</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9948.jpg"><img class="size-medium wp-image-1168 aligncenter" title="img_9948" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9948-300x264.jpg" alt="" width="300" height="264" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9948.jpg"><img class="size-medium wp-image-1168 aligncenter" title="img_9948" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9948-300x264.jpg" alt="" width="300" height="264" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/25/neues-vom-kuhlschrank-62/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/24/neues-vom-kuhlschrank-61/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/24/neues-vom-kuhlschrank-61/#comments</comments>
		<pubDate>Fri, 24 Jun 2011 06:25:40 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1164</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9947.jpg"><img class="size-medium wp-image-1165 aligncenter" title="img_9947" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9947-300x160.jpg" alt="" width="300" height="160" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9947.jpg"><img class="size-medium wp-image-1165 aligncenter" title="img_9947" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9947-300x160.jpg" alt="" width="300" height="160" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/24/neues-vom-kuhlschrank-61/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/23/neues-vom-kuhlschrank-64/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/23/neues-vom-kuhlschrank-64/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 19:27:33 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1173</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9950.jpg"><img class="size-medium wp-image-1174 aligncenter" title="img_9950" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9950-269x300.jpg" alt="" width="269" height="300" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9950.jpg"><img class="size-medium wp-image-1174 aligncenter" title="img_9950" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9950-269x300.jpg" alt="" width="269" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/23/neues-vom-kuhlschrank-64/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/22/neues-vom-kuhlschrank-59/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/22/neues-vom-kuhlschrank-59/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 07:24:19 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1158</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9945.jpg"><img class="size-medium wp-image-1159 aligncenter" title="img_9945" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9945-300x84.jpg" alt="" width="300" height="84" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9945.jpg"><img class="size-medium wp-image-1159 aligncenter" title="img_9945" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9945-300x84.jpg" alt="" width="300" height="84" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/22/neues-vom-kuhlschrank-59/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/21/neues-vom-kuhlschrank-58/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/21/neues-vom-kuhlschrank-58/#comments</comments>
		<pubDate>Tue, 21 Jun 2011 14:23:22 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1155</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9944.jpg"><img class="size-medium wp-image-1156 aligncenter" title="img_9944" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9944-300x134.jpg" alt="" width="300" height="134" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9944.jpg"><img class="size-medium wp-image-1156 aligncenter" title="img_9944" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9944-300x134.jpg" alt="" width="300" height="134" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/21/neues-vom-kuhlschrank-58/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Neues vom Kühlschrank</title>
		<link>http://blog.himmelrath.net/blog/2011/06/20/neues-vom-kuhlschrank-57/</link>
		<comments>http://blog.himmelrath.net/blog/2011/06/20/neues-vom-kuhlschrank-57/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 11:22:46 +0000</pubDate>
		<dc:creator>Jens</dc:creator>
				<category><![CDATA[Asides]]></category>
		<category><![CDATA[Kühlschrankpoesie]]></category>

		<guid isPermaLink="false">http://blog.himmelrath.net/?p=1152</guid>
		<description><![CDATA[<a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9943.jpg"><img class="size-medium wp-image-1153 aligncenter" title="img_9943" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9943-300x110.jpg" alt="" width="300" height="110" /></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9943.jpg"><img class="size-medium wp-image-1153 aligncenter" title="img_9943" src="http://blog.himmelrath.net/wp-content/uploads/2011/04/img_9943-300x110.jpg" alt="" width="300" height="110" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.himmelrath.net/blog/2011/06/20/neues-vom-kuhlschrank-57/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

