Android. App in den Hintergrund, anstatt zu beenden.

statt

finish();

folgenden Code verwenden:

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain);
 

Android Webview App. Beim Aufrufen der App bei Klick auf Push Notification wird eine neue Activity erstellt. Fix.

Szenario:

Man hat eine App bzw. in meinem Fall eine Webview App. Per Push erhält man eine Nachricht, dass eine neue Nachricht eingegangen ist. Man klickt nun auf die Push-Notification und anstatt die eventuell vorhandene Activity zu öffnen, wird eine neue Activity gestartet. Das wollte ich gern vermeiden.

Nach echt langer Recherche bin ich dann auf diesen Link gestoßen: http://www.helloandroid.com/tutorials/communicating-between-running-activities

Relevanter Inhalt:

In der Main-Activity:

protected void onNewIntent(Intent intent) {
     super.onNewIntent(intent);
     setIntent(intent);//must store the new intent unless getIntent() will return the old one
       intent = getIntent();
        WebView myWebView = (WebView) findViewById(R.id.webview);
          myWebView.loadUrl(url);
    }

In der Notifiaction Sende Klasse:

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("tag", tag);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);

Höhe und Breite eines HTML Elements mit CSS proportional halten - bei dynamischer Breite/Höhe..

Quelle: http://www.mademyday.de/css-height-equals-width-with-pure-css.html

Mit diesem CSS Trick, bekommt man ein div Element, welches immer die selbe Höhe hat, wie es breit ist.


HTML:

<div class="box">
<div class="content">
Aspect ratio of 1:1</div>
</div>


CSS:
.box{
position: relative;
width: 50%;
}
.box:before{
content: "";
display: block;
padding-top: 100%;
}

In meinem Fall war es nötig einen runden Kreis hinzubekommen bei dynamischer Breite.
(div wird zum kreis mit border-radius:1000px)

HTML Select funktioniert nicht unter Android 2.3. Fix.

Link zum Original-Fix: http://wil.to/android-positioning/

Inhalt, falls der Link irgendwann nicht mehr geht:

"On Android 2.3, a fixed element that contains an absolute positioned element, which itself contains an absolute positioned element, will cause select menus on the page to stop responding altogether.

By removing that nested absolute element (represented by the red square above) the select menu will work normally. Alternately, by removing the fixed positioning of the parent element—either by not disabling user-scalable in one’s viewport tag or by removing the fixed positioning.

Edit: It seems this bug pertains not specifically to nested absolute elements, but to empty absolute elements—including whitespace. By adding a non-breaking space to the nested element, the problem is solved."



Also zum leeren Element einfach ein

<span style='display:none'>&#160;</span>

Javascript dynamisch via Javascript nachladen

Hier http://murksfurtz.blogspot.de/2008/12/mit-ajax-nachgeladene-javascript.html habe ich gezeigt, wie man per Ajax nachgeladenen Javascript-Code ausführbar machen kann.

Eine wahrscheinlich bessere Variante ist es, das Javascript einfach dynamisch in der Hauptdatei via Javascript nachzuladen, denn es sind dann keine Anpassungen an der Syntax des Scripts notwendig und es entfällt auch die Evaluierung, welche je nach Rechenkraft schon etwas Zeit in Anspruch nehmen kann.

Ein Beispiel:

<script type="text/javascript">
function loadScript(scriptname) {
var snode = document.createElement('script');
snode.setAttribute('type','text/javascript');
snode.setAttribute('src',scriptname);
document.getElementsByTagName('head')[0].appendChild(snode);
}
loadScript('../js/benoetigtes_script.js');
</script>


So kann man also Javascript-Funktionen nachladen, die man für neue nachgeladene Ajax-Inhalte benötigt. Zum Beispiel ein Script eines ColorPickers, den man für eine Design-Funkion benötigt.

IE 9, Ajax, Error c00c023f

Bei Ajax-Anwendungen, kann es in unregelmäßigen Abständen zu komischen Fehlermeldungen kommen. Error c00c023f. Ziemlich doof, da dann wichtige Funktionen einfach abgebrochen werden.

Der Grund ist wohl ein Bug im IE9 bei der Behandlung von XMLHttpRequest(). Der IE9 nutzt nämlich erstmalig XMLHttpRequest(), statt seiner ActiveX-Objekte.

Die meisten Ajax Skripte haben - damit es auf allen Browsern läuft - immer beide Möglichkeiten unterstützt und meistens XMLHttpRequest() zu erst abgefragt.

Um den Fehler im IE9 also zu vermeiden reicht es, die if und else Zweige zu vertauschen und erst nach dem ActiveX Objekt zu fragen. Denn der IE9 kann diese natürlich auch noch benutzen.

Wie folgt sieht das dann aus:

if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
else if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/html; charset=iso-8859-1');
// zu dieser Zeile siehe weiter unten
}
}

Geheimtipp I/O NOOP Scheduler bei Hardware RAID Systemen

Unsere Datenbankserver waren trotz 4 SAS HDDs mit 15K UPM und Hardware RAID 10 immer der Flaschenhals. Beim Server an sich gabs auch nie Probleme mit der CPU Leistung.

Ich möchte in dem Artikel garnicht groß drum rum reden und viel erklären, da mir dazu auch die nötige Sachkenntnis fehlt. Außerdem hab ich keine Benchmarks gemacht. In unserem Fall konnte man die Veränderung direkt an der Projektgeschwindigkeit spüren. Das reichte uns :)

Mein Tipp: Bei Hardware RAID Systemen lohnt es sich mit I/O Schedulern herumzuexperimentieren.
Nachdem wir statt CFQ (OpenSuse 11.0 Standard) NOOP eingesetzt haben, lief alles bedeutend schneller.

Ein Scheduler ist dafür verantwortlich, wie die Festplatte(n) Lese- und Schreibvorgänge koordiniert. CFQ gehört dabei zu einer Variante die versucht die Anfragen möglichst sinnig zu sortieren, damit die Schreib- und Leseköpfe nicht unnötig viel umherspringen, sondern nahgelegene Operationen nacheinander abgearbeitet werden und eine "weit entferntere" Operation danach folgt.

NOOP hingegen lässt diese Optimierung gänzlich sein und arbeitet die Anfragen sequentiell ab. Dadurch wird natürlich Zeit gespart, da das ganze Berechnen und Koordinieren und evntl. Warten weggelassen wird, kann aber dazu führen, dass die Schreib- und Leseköpfe viele große Sprünge machen.
Bei Flash-Drives wird daher grundsätzlich NOOP empfohlen, da es dort keine Lese- und Schreibköpfe gibt und es dem Laufwerk egal ist wo der nächste Datenzugriff stattfindet.

So wie ich das jetzt, nach dem Lesen einiger Artikel, verstanden habe, verhält es sich ähnlich bei Hardware - Raid Systemen. Die Raid Controller nämlich, optimieren selbst schon ihre Operationen und ein weiterer Optimierer der keinen Einblick in diese Optimierungen hat, wäre verschwenderisch und im schlimmsten Fall kontraproduktiv.

Den I/O Scheduler kann man im laufendem Betrieb ändern und so problemlos testen. In einem Forum schrieb jemand, er hätte dabei mal einen Server-Freeze gehabt. Das kann ich von meiner Seite her nicht bestätigen. Es lief immer alles glatt.

So kann man gucken welcher I/O Scheduler derzeit aktiv ist:


cat /sys/block/sda/queue/scheduler
noop [anticipatory] deadline cfq

In diesem Fall wäre anticipatory aktiv.

Ändern kann man ihn wie folgt:

echo noop > /sys/block/sda/queue/scheduler

Man hat nun "noop" aktiviert.

Diese Änderung ist nach einem Neustart verloren. Man kann das auch permanent ändern, aber ich finde das grad nicht. Wird nachgereicht.

Links zum Thema:
http://www.linuxhowtos.org/System/iosched.htm
http://www.linuxtechnicalreview.de/content/download/420/3357/file/I-O-Scheduler-und-RAID-Performance.pdf