2010-09-10 9 views
7

Ich habe Android gelernt und bin auf ein Problem mit launchMode = "singleTask" gestoßen. In der Dokumentation wird angegeben, dass die Aktivität bei Verwendung dieses Attributs immer in einer neuen Aufgabe als Stammaktivität gestartet wird. Zweitens heißt es in der Dokumentation, dass, wenn eine Absicht auf eine solche Aktivität abzielt, wenn darüber Aktivitäten in ihrem Aufgabenstapel liegen, solche Intents verworfen werden (obwohl die Aufgabe immer noch in den Vordergrund gebracht wird).Android: Verhalten von launchMode = "singleTask" nicht wie beschrieben?

Ich habe damit herum gespielt, und das Verhalten, das ich beobachte, ist völlig anders. Insbesondere: - Aktivitäten mit launchMode = "singleTask" sind nicht immer die Stammaktivität in einem Aufgabenstapel. Sie werden einfach mit der gleichen Affinität auf den vorhandenen Stapel gelegt. - Wenn eine Absicht auf eine solche Aktivität abzielt und sich darüber im Stapel weitere Aktivitäten befinden, wird die Absicht nicht verworfen. Stattdessen werden die darüber liegenden Aktivitäten im Stapel verworfen. Der Intent wird dann wie gewohnt über onNewIntent an die Aktivität übergeben.

Kann jemand bestätigen, dass dies das tatsächliche Verhalten ist? Wenn ja, warum sind die Dokumente falsch? Wenn nicht, was habe ich falsch gemacht? . .

EDIT:

Ein Beispiel dieses Verhalten zeigt, ist hier zu finden: http://groups.google.co.uk/group/android-developers/browse_thread/thread/fd8f249803b4688a# Sorry für die Cross-Post, aber ich war nicht in der Lage das Beispiel in einem anständigen Format zu bekommen, hier zu posten ...

+0

Ich kann dieses Verhalten bestätigen, aber ich verstehe es auch nicht. Die Kinderaktivitäten werden zerstört. –

Antwort

0

Ich kann diesem Modus etwas seltsames Verhalten hinzufügen. Vielleicht hilft mir auch die Antwort auf diese Frage.

Ich wollte meinem ersten Bildschirm eine Standortauswahl geben. Ich wollte die Anfrage an meine erste Aktivität zurückgeben. Diese Aktivität war Suchaufruf und Abfrageempfang. Allerdings "SingleTask" zerstört meine Pläne; (

Der Suchabsicht mit der Abfrage erreichte nie meine erste Aktivität. Stattdessen "android.intent.action.MAIN" erreicht meine erste Aktivität. Beim Entfernen "singleTask" der Suche Absicht durchkommt. Aber dann schaffe ich mehrere Instanzen von meinem Homescreen.

<activity 
    android:label="@string/app_name" 
    android:name="ActivityStart" 
    android:screenOrientation="portrait" 
    android:launchMode="singleTask"> 
    <intent-filter> 
    <action 
     android:name="android.intent.action.SEARCH" /> 
    <action 
     android:name="android.intent.action.MAIN" /> 
    <category 
     android:name="android.intent.category.LAUNCHER" /> 

    </intent-filter> 
    <meta-data 
    android:name="android.app.searchable" 
    android:resource="@xml/searchable" /> 

</activity> 

Jetzt benutze ich eine Textview statt ...

4

Dies ist ein Problem von taskAffinity. Wenn Sie eine Aktivität starten, Android überprüft der taskAffinity der Aktivität, die Sie starten möchten.Wenn es das gleiche wie die taskAffinity von t ist Er Root-Aktivität in Ihrer Aufgabe, dann wird es ignorieren launchMode="singleInstance" oder launchMode="singleTask" (weil diese Startmodi Android benötigen, um eine neue Aufgabe zum Starten der Aktivität in erstellen) und starten Sie die Aktivität in der aktuellen Aufgabe.

Leider ist dies nicht gut dokumentiert, aber taskAffinity hat Vorrang vor launchMode.

Wenn Sie wirklich eine oder singleInstance Aktivität wollen (was normalerweise nicht das Richtige ist, weil es eine ganze Menge anderer übler Dinge mit sich bringt, die Sie wahrscheinlich falsch verstehen), dann müssen Sie sicher gehen dass Ihre singleInstance oder singleTask Aktivität hat folgende im Manifest in seiner <activity> Definition:

android:taskAffinity="" 
2

Documentation sagt:

FLAG_ACTIVITY_NEW_TASK ... erzeugt das gleiche Verhalten wie die „singleTask“ launchMode ...

Wie die Aktivität mit Intent (FLAG_ACTIVITY_NEW_TASK) gestartet wird depends on activity affinity

Wenn es bereits eine bestehende Aufgabe mit der gleichen Affinität Als neue Aktivität wird die Aktivität in diese Aufgabe gestartet. Wenn nicht, beginnt eine neue Aufgabe .

Also, es muss eine gleiche Affinitätsprüfung für singleTask launchMode geben.

+0

Ich denke nicht, dass beide das "gleiche" Verhalten produzieren. Unter der Annahme, dass die Affinitäten in Ordnung sind, wird singleTask auch versuchen, die Task-Aktivitäten außer der Wurzel zu löschen. – zgulser

Verwandte Themen