Znalazłem błąd w mojej aplikacji, gdy jest ona uruchamiana za pomocą przycisku „Otwórz” w aplikacji Sklep Google Play (poprzednio nazywanej Android Market). Wygląda na to, że uruchomienie go ze Sklepu Play działa inaczej Intent
niż uruchomienie go z menu ikon aplikacji telefonu. Prowadzi to do uruchamiania wielu kopii tego samego działania, które są ze sobą w konflikcie.
Na przykład, jeśli moja aplikacja składa się z ABC działań, ten problem może prowadzić do stosu ABCA.
Próbowałem użyć android:launchMode="singleTask"
we wszystkich działaniach, aby rozwiązać ten problem, ale ma to niepożądany efekt uboczny polegający na wyczyszczeniu stosu działań do katalogu głównego, za każdym razem, gdy naciskam przycisk HOME.
Oczekiwane zachowanie to: ABC -> HOME -> A kiedy aplikacja zostanie przywrócona, potrzebuję: ABC -> HOME -> ABC
Czy istnieje dobry sposób, aby zapobiec uruchamianiu wielu działań tego samego typu bez konieczności resetowania do działania głównego podczas korzystania z przycisku HOME?
źródło
Odpowiedzi:
Dodaj to do onCreate i powinieneś być gotowy:
źródło
finish()
wywoła, użytkownik zobaczy działanie, które znajdowało się pod spodem. Dzięki temu można spokojnie założyć, że istniejąca instancja aplikacji zostanie przeniesiona na pierwszy plan. Gdyby tak nie było, miałbyś wiele wystąpień aplikacji w oddzielnych zadaniach, a tworzona aktywność byłaby źródłem jej zadania.Wyjaśnię tylko, dlaczego to się nie udaje i jak programowo odtworzyć ten błąd, abyś mógł włączyć go do swojego zestawu testów:
Kiedy uruchamiasz aplikację za pośrednictwem Eclipse lub Market, uruchamia się ona z flagami intencji: FLAG_ACTIVITY_NEW_TASK.
Podczas uruchamiania za pomocą programu uruchamiającego (strona główna) używa flag: FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED i używa akcji „ MAIN ” i kategorii „ LAUNCHER ”.
Jeśli chcesz to odtworzyć w przypadku testowym, wykonaj następujące kroki:
Następnie zrób wszystko, co konieczne, aby przejść do innej czynności. Dla moich celów właśnie umieściłem przycisk, który uruchamia inną czynność. Następnie wróć do programu uruchamiającego (strona główna) za pomocą:
I zasymuluj uruchomienie go za pomocą programu uruchamiającego za pomocą tego:
Jeśli nie zastosowałeś obejścia isTaskRoot (), spowoduje to odtworzenie problemu. Używamy tego w naszych automatycznych testach, aby upewnić się, że ten błąd nigdy się nie powtórzy.
Mam nadzieję że to pomoże!
źródło
Czy wypróbowałeś tryb uruchamiania singleTop ?
Oto część opisu z http://developer.android.com/guide/topics/manifest/activity-element.html :
źródło
Może to jest ten problem ? Lub inna forma tego samego błędu?
źródło
Myślę, że zaakceptowana odpowiedź ( Duane Homick ) ma nieobsłużone przypadki:
Masz różne dodatki (i w rezultacie duplikaty aplikacji):
Oto rozwiązanie (SDK_INT> = 11 dla powiadomień), które, jak sądzę, obsługuje również te przypadki i powiadomienia na pasku stanu.
Manifest :
Aktywność programu uruchamiającego :
Usługa :
Powiadomienie :
źródło
Zdaję sobie sprawę, że pytanie nie ma nic wspólnego z Xamarinem na Androida, ale chciałem coś opublikować, ponieważ nigdzie indziej tego nie widziałem.
Aby rozwiązać ten problem w Xamarin Android, użyłem kodu z @DuaneHomick i dodałem do
MainActivity.OnCreate()
. Różnica w porównaniu z platformą Xamarin polega na tym, że należy postępować poXamarin.Forms.Forms.Init(this, bundle);
iLoadApplication(new App());
. Więc mójOnCreate()
wyglądałby tak:* Edycja: od Androida 6.0 powyższe rozwiązanie nie jest wystarczające w niektórych sytuacjach. Ustawiłem teraz również
LaunchMode
naSingleTask
, co wydaje się sprawiać, że wszystko znów działa poprawnie. Niestety nie jestem pewien, jaki wpływ może to mieć na inne rzeczy.źródło
Miałem ten sam problem i naprawiłem go za pomocą następującego rozwiązania.
W swojej głównej aktywności dodaj ten kod na górze
onCreate
metody:nie zapomnij dodać tego uprawnienia w swoim manifeście.
mam nadzieję, że ci to pomoże.
źródło
Ja też miałem ten problem
android:configChanges="mcc|mnc"
- jeśli masz połączenie z siecią komórkową, zobacz http://developer.android.com/guide/topics/manifest/activity-element.html#config, dla której konfiguracji występuje podczas uruchamiania systemu, otwierania lub czegokolwiek innego.źródło
Wypróbuj to rozwiązanie:
utwórz
Application
klasę i zdefiniuj w niej:Następnie w swojej pierwszej (Launcher) aktywności
onCreate
przedsetContentView(...)
dodaniem tego:PS
Controller
to mojaApplication
klasa.źródło
IS_APP_RUNNING
będzietrue
i Twoja aplikacja natychmiast się zakończy. Nie jest to coś, co użytkownik mógłby uznać za zabawne.spróbuj użyć trybu uruchamiania SingleInstance z powinowactwem ustawionym na allowtaskreparenting. Spowoduje to zawsze utworzenie działania w nowym zadaniu, ale także umożliwi jego ponowne rodzicielstwo. Sprawdź atrybut dis: Affinity
źródło
Znalazłem sposób, aby zapobiec rozpoczynaniu tych samych czynności, to działa świetnie
źródło