startActivityForResult funktioniert nicht richtig mit launchMode singleInstance
Möchte ich Aktivitäten auf meinem Anwendung Activity-stack auf nur eine Instanz. Ich habe mehrere Bildschirme, die sind ListActivities und ich möchte nicht gehen durch die Schmerzen und leiden der Aktualisierung der Listen in einer früheren Instanz der ListActivity wenn eine weitere Instanz, die ListActivity ist geändert (Hinzugefügt, geändert, entfernt, etc) (oder gibt es eine einfache Möglichkeit, dies zu tun?).
Hinweis: ich habe gelesen, dass singleTop dies tun (obwohl es zerstört die Aktivität, wenn Sie die Schaltfläche " zurück), aber es funktioniert nicht. Ich habe ein Menü und wenn ich gehe auf meine Startseite, dann gehe ich zu meinem QuickList-Bildschirm, und dann gehe ich zu meinem Posteingang-Bildschirm wieder, es schafft eine neue Inbox-Aktivität.
Gerade jetzt, auf meinem ListActivities, ich habe launchMode eingestellt singleInstance. Das problem ist: Wenn ich das starten einer anderen Activity mit startActivityForResult, die onActivityResult-handler feuert sofort (bevor die neue Aktivität angelegt wird). Wenn ich führen Sie die erforderliche Aktion auf dem nächsten Bildschirm, um wieder das Ergebnis, der onActivityResult-handler nicht ausgelöst.
Was ist Los?
Hier ist, wie ich Feuer die neue Aktivität:
Intent intentLaunchQuickList = new Intent(ActivityMyList.this, ActivityQuickList.class);
startActivityForResult(intentLaunchQuickList, REQUEST_QUICKLIST);
Hier ist, wie ich das Ergebnis zurückgeben:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
QuickListItem qlItem = m_Adapter.getItem(position);
if (qlItem != null && qlItem.getQLId() != -1) {
Intent data = new Intent();
data.putExtra("ql_id", qlItem.getQLId());
if (getParent() == null) {
setResult(Activity.RESULT_OK, data);
}
else {
getParent().setResult(Activity.RESULT_OK, data);
}
}
finish();
}
Hier ist mein onActivityResult-handler:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_QUICKLIST) {
if (resultCode == Activity.RESULT_OK) {
Bundle extras = data.getExtras();
if (extras != null) {
int id = extras.getInt("ql_id");
if (id > 0) {
launchQLItemsThread(id);
}
}
}
}
}
InformationsquelleAutor der Frage Andrew | 2010-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Dokumentation der
startActivityForResult
: "Zum Beispiel, wenn die Aktivität, die Sie starten, verwendet die singleTask-launch-Modus, es wird nicht führen Sie in Ihre Aufgabe und so erhalten Sie sofort einen Abbrechen Ergebnis."singleInstance
Aktivitäten sind auf die gleiche Weise.In anderen Worten, wenn Sie verwenden möchten, sAFR, werden Sie brauchen, um mehrere aktivitätsinstanzen. Was ich raten würde ist das speichern der Liste Stand für Ihre
ListActivity
Instanzen inonPause
einige app-global spot (ein singleton oder was auch immer) und lade von dort aus inonResume
. Dann, auch wenn mehrereListActivity
- Instanzen erstellt, die Spitze wird immer ein update der Daten vor dem älteren zu bekommen wieder aufgenommen, und die Listen werden immer angezeigt, aktuelle an den Benutzer.Beachten Sie, dass Sie tun sollten, jedenfalls wenn Sie Ihre Daten gemeint ist, ausdauernd zu sein, denn Ihre ganze Prozess kann getötet werden, das system jederzeit nach der
onPause
nennen, und wenn Sie noch nicht alle änderungen gespeichert, die irgendwo durch die Zeit, zurück, haften Sie stillschweigend verloren unter einige-oft seltene und unvorhersehbare Umstände--. In diesem Fall werden Sie wollen, um mit lokalen Dateien oder SQLite-Datenbanken, halten nicht an dem Netzwerk.onPause
muss schnell zurück, weil der Benutzer nicht mit dem system interagieren, während es läuft, so speichern Sie auf lokalen Speicher und dann synchronisieren, um das Netzwerk zu einem anderen Zeitpunkt, vielleicht über einen service gestartet vononPause
.InformationsquelleAutor der Antwort Walter Mundt
Verwenden ein einheitliches Modell. Zum Beispiel, deine Daten sind hoffentlich in einer Datenbank. Jeder
ListActivity
hat eineCursor
auf den Teil der Datenbank, die es braucht. Haben, dassCursor
eine "managed Cursor" (viastartManagingCursor()
), und IhreListViews
werden automatisch aktualisiert, inonResume()
. Dann machen Sie Ihre änderungen in Ihr Modell über die Datenbank.Das ist, was es tun soll. Unter Angabe der Dokumentation:
(Fettdruck zur Hervorhebung Hinzugefügt)
Bitte tun Sie das nicht.
InformationsquelleAutor der Antwort CommonsWare