2012-01-24 8 views
24

Zauważyłem, że w mojej aplikacji użytkownik może uzyskać całkiem "zagnieżdżone" w różnych czynnościach, które są otwierane, gdy użytkownik korzysta z aplikacji.Czy istnieje sposób na jedną i tylko jedną instancję każdego działania?

Na przykład:

  1. Menu Główne
  2. Lista Object
  3. Object Szczegóły
  4. Object Edit
  5. Object Szczegóły
  6. Object Child Szczegóły
  7. Dziecko Object Edit
  8. Obiekt Szczegóły dziecka

Teraz, gdy użytkownik naciśnie ponownie, musi dwukrotnie przejść przez "Szczegóły potomka obiektu" (ten sam obiekt, gdy jest edytowany, powraca do strony szczegółowej), i to samo dzieje się dla "Szczegóły obiektu nadrzędnego".

Czy istnieje sposób ponownego wykorzystania działań, jeśli są już otwarte w stosie i przeniesienia ich na początek? Jedyny sposób, jaki widziałem, dotyczy działań z atrybutem launcher. Wierzę, że widziałem singleTask i singleTop.

Jeśli mam używać tych dwóch atrybutów: singleTask i singleTop, jak mam ich użyć? Kiedy próbowałem włączyć je do aplikacji, nie robiło to żadnej różnicy. Czy muszę również ustawić flagę podczas uruchamiania intencji za pomocą startActivity?

Odpowiedz

30

w jawnym własności aktywny można podać ten parametr android:launchMode="singleInstance"

Read bardziej szczegółowo tutaj http://developer.android.com/guide/topics/manifest/activity-element.html

+6

** Nie używaj tego bez zrozumienia wszystkich implikacji 'launchMode =" singleInstance "'. Ta czynność _nie_ jest faktycznie _na porządek_ **, ponieważ zmusza działanie całkowicie do oddzielnego zadania (tj. Pojawi się oddzielnie od aplikacji na liście Ostatnie aplikacje). Jeśli zrobisz to dla każdego działania w aplikacji, zobaczysz każdy z nich jako osobne wpisy na liście Ostatnie aplikacje. Przynajmniej tak mówią doktorzy. [Rzeczywistość jest trochę inna] (https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en). –

+0

Moje zalecenie jest użycie 'Intent.FLAG_ACTIVITY_REORDER_TO_FRONT' zamiast (jak sugeruje w odpowiedzi Vikram poniżej), chociaż nie jest to idealne rozwiązanie. –

6

Tak, możesz zażądać utworzenia tylko jednej instancji tych czynności, ale generalnie nie jest to zalecane. Jeśli po prostu martwisz się historią, spójrz na Intent.FLAG_ACTIVITY_CLEAR_TOP.

17

To jest Twoja flaga! http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) 

Zanotuj 'addFlags'. Należy również pamiętać, że onCreate nie zostanie wywołany w tej Działalności, gdy zostanie mu przekazane nowe Zamiar. Zostanie dostarczony przez onNewIntent().

Nie gwarantuje to, że uruchomiona jest pojedyncza instancja działania. Aby upewnić się, że to sprawdzić: http://developer.android.com/guide/topics/manifest/activity-element.html#lmode

0

Dodaj zamiarom Flagi jako

Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP); StartActivity(srcActivity.java, DesiredActivity.class);

Następnie o onPause() PożądanyAktywność

Dodaj finish(), To wykonało pracę dla mnie.

14

Korzystanie z android: launchMode = "singleTask" jest prawdopodobnie najlepszym podejściem, ponieważ nie będzie odtworzyć działania, jeśli jest już uruchomione. Po prostu dodaj go do działania w swoim AndroidManifest.xml i powinieneś wszystko ustawić.

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

Oto kolejne pytanie, które mogą być użyteczne: Android singleTask or singleInstance launch mode?

0
Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_HISTORY); 

To działa na mnie :)

1

Ten pracował dla mnie.

Intent intent = new Intent(this, MyActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
startActivity(intent); 

Jeśli tworzona instancja tego aktywność już istnieje, zostanie przeniesiony do przodu. Jeśli instancja NIE istnieje, zostanie utworzona nowa instancja.

Powiązane problemy