Tryb uruchamiania singleTask czy singleInstance w systemie Android? [Zamknięte]

84

Mam aplikację, której głównym działaniem jest lista, a następnie możesz klikać elementy, które otwierają szczegółowy widok tego elementu. Mam również aktywność wyszukiwania, która jest podobna do głównej i działa zgodnie z zamierzeniami.

Jednak chcę, aby ta czynność wyszukiwania miała tylko jedną instancję na stosie, aby użytkownicy mogli wyszukiwać wiele razy, a kliknięcie wstecz spowoduje powrót do poprzedniego widoku, w którym byli przed rozpoczęciem wyszukiwania (zamiast wracać do poprzednich wyników wyszukiwania)

Wydaje się, że zarówno tryb uruchamiania singleTask, jak i singelInstance robi to, co chcę, więc nie jestem pewien, który z nich powinienem używać do tego celu i dlaczego?

Kman
źródło

Odpowiedzi:

141

Ze strony Application Fundamentals w przewodniku dla programistów Androida:

Domyślnie wszystkie działania w aplikacji są ze sobą powiązane - to znaczy, że preferowane jest, aby wszystkie należały do ​​tego samego zadania.

Działanie „singleInstance” występuje samodzielnie jako jedyne działanie w ramach swojego zadania. Jeśli rozpocznie inną czynność, zostanie ona uruchomiona w innym zadaniu niezależnie od trybu uruchomienia - tak jakby FLAG_ACTIVITY_NEW_TASK było w zamiarze. Pod wszystkimi innymi względami tryb „singleInstance” jest identyczny z trybem „singleTask”.

Jak wspomniano powyżej, nigdy nie istnieje więcej niż jedno wystąpienie działania „singleTask” lub „singleInstance”, więc oczekuje się, że to wystąpienie będzie obsługiwać wszystkie nowe intencje. Aktywność „singleInstance” zawsze znajduje się na szczycie stosu (ponieważ jest to jedyna czynność w zadaniu), więc zawsze jest w stanie obsłużyć intencję. Jednak działanie „singleTask” może mieć inne działania na stosie lub nie. Jeśli tak, to nie jest w stanie poradzić sobie z intencją i zamiar zostaje odrzucony. (Nawet jeśli zamiar został odrzucony, jego nadejście spowodowałoby, że zadanie wyszłoby na pierwszy plan, gdzie pozostałoby).

4 Czynności w zadaniu

Ponieważ nigdy nie ma więcej niż jednej instancji działania w jednym z trybów uruchamiania, przycisk Wstecz zawsze przeniesie Cię do istniejącej instancji działania w Twoim przypadku.

Ważną różnicą jest to, że „singleTask” nie wymaga tworzenia nowego zadania dla nowych działań uruchamianych, gdy coś zostanie wybrane. Nie będzie też musiał za każdym razem usuwać tego nowego zadania z przycisku Wstecz.

Ponieważ twój stos działań odnosi się do „zadania” jednego użytkownika i nie wygląda na to, że masz skomplikowaną strukturę intencji, w której singleInstance może być korzystne, aby zawsze je obsługiwać, sugerowałbym użycie trybu uruchamiania pojedynczego zadania.

Tutaj jest dobry post na blogu, aby uzyskać więcej informacji, a także napisać autorstwo obrazu: Seria działań i zadań systemu Android - wprowadzenie do modelu komponentów interfejsu użytkownika systemu Android

Guzba
źródło
4
Dzięki! wygląda na dobrą lekturę ... chodzi o to, że zdałem sobie sprawę, że faktycznie CHCĘ wielu wystąpień czynności i tylko wtedy, gdy czynność na pierwszym planie jest czynnością wyszukiwania i wykonywane jest inne wyszukiwanie, powinno to wykorzystać tę istniejącą czynność (np. jak działa rynek). za to singeTop jest dokładnie tym, czego szukam, ale i tak dzięki za pomoc =) dzięki
Kman.
1
Hej dzięki. Ten dobrze napisany post pomógł mi w uszczypnięciu.
icecreamman,
Dziękuję za szczegóły, szczególnie ten (chociaż zamiar został odrzucony, jego nadejście spowodowałoby, że zadanie wyszło na pierwszy plan, gdzie by pozostało.) , Co natychmiast usuwa moje zamieszanie. Właśnie zastanawiałem się, co zrobić, jeśli jedno zadanie nie znajduje się na szczycie stosu, podczas gdy nadal chcę do niego przejść bez określania FLAG_ACTIVITY_CLEAR_TOP .
neevek
Należy przeczytać „ androidsrc.net/android-activity-launch-mode-example
Dhiraj Himani,
30

W prosty sposób-

singleTask:

System tworzy nowe zadanie i tworzy instancję działania w katalogu głównym nowego zadania. Jeśli jednak instancja działania już istnieje w oddzielnym zadaniu, system kieruje intencję do istniejącej instancji poprzez wywołanie jej onNewIntent()metody, zamiast tworzyć nową instancję. one instanceW danym momencie może istnieć tylko aktywność.

Uwaga: Chociaż czynność rozpoczyna się w nowym zadaniu, przycisk Wstecz nadal powoduje powrót użytkownika do poprzedniej czynności.

pojedyncza instancja-

To samo co "singleTask", z tą różnicą, że system nie uruchamia żadnych innych działań w zadaniu obsługującym instancję . Działalność jest zawsze jedynym i jedynym członkiem jej zadania; wszelkie działania rozpoczęte przez to otwierają się w osobnym zadaniu .

Tarun Varshney
źródło
4

singleTaska singleInstancedziałania mogą tylko rozpocząć zadanie. Znajdują się one zawsze w katalogu głównym stosu aktywności. Ponadto urządzenie może pomieścić tylko jedno wystąpienie czynności w danym momencie - tylko jedno takie zadanie.
więcej android: launchMode .

Rupesh Yadav
źródło
1
ostatnie zdanie jest prawdziwe dla singleInstance, a nie singleTask
Serdar Samancıoğlu
@SerdarS. doceniam twój komentarz. Dodawanie więcej informacji singleTask- system tworzy nowe zadanie i tworzy instancję działania w katalogu głównym nowego zadania. Jeśli jednak instancja działania już istnieje w oddzielnym zadaniu, system kieruje intencję do istniejącej instancji poprzez wywołanie jej onNewIntent()metody, zamiast tworzyć nową instancję. Jednocześnie może istnieć tylko jedno wystąpienie działania. więcej developer.android.com
Rupesh Yadav
Rozumiem, wtedy się myliłem. Przepraszam, że przeszkadzam.
Serdar Samancıoğlu