2010-02-17 11 views
44

Jestem stoi dokładnie problem wymieniony w tych linków:App rozpoczyna się zawsze świeże z działalności głównym zamiast wznawianie stan tła (znany bug)

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

I mieć prostą aktywność roota przy zamiarach LAUNCHER i MAIN i nic innego. Zaczynam inną działalność z żadnych flag ani niczego dodatkowego w manifeście w ogóle.

Uruchamiam aplikację (główna aktywność) i stamtąd rozpocznę 2. działanie. Po naciśnięciu przycisku Home zadanie przechodzi do tła. Po ponownym uruchomieniu aplikacji (z Launchera lub przytrzymaniu przycisku Strona główna dla ostatnich aplikacji) uruchamia nową instancję aktywności głównej na istniejącym stosie.

Jeśli naciśniesz przycisk Wstecz, nowe działanie "root" zostanie zamknięte, a stara druga czynność będzie widoczna, co oznacza, że ​​zostanie uruchomiona aktywność root w tym samym zadaniu zamiast przenieść zadanie na pierwszy plan.

Aby temu zaradzić, uruchomiłem tryb uruchamiania głównej aktywacji singleTask. Teraz, kiedy ponownie naciśniesz stronę domową i ponownie uruchomię aplikację, wyczyści ona czynności powyżej starego zadania głównego i przeniesie stare zadanie główne na pierwszy plan, zamiast tylko przenieść całe stare zadanie z drugim działaniem na wierzch. Zauważ, że stare zadanie root nadal zachowuje swój stan aplikacji, co oznacza, że ​​nie było to nowe wystąpienie, ale wyższe aktywności zostały zabite.

Występuje nawet w przypadku innych aplikacji pobranych z rynku. Metoda ręcznej instalacji nie ma dla mnie żadnego efektu, wciąż jest uruchamiana w ten sam sposób.

+0

Kurian, mam do czynienia z tym samym problemem. Czy istnieje jakieś miejsce pracy? Z góry dziękuję. –

+1

Wystarczy nacisnąć i wrócić do aplikacji całkowicie po wdrożeniu jej z Eclipse. Uruchom go ponownie z telefonu. – Monstieur

+0

Możliwy duplikat problemu z zamawieniem stosu zadań podczas uruchamiania aplikacji z instalatora aplikacji na Androida i ekranu początkowego (http: // stackoverflow.com/questions/6356467/activity-stack-ordering-problem-when-launching-application-from-android-app-inst) – blahdiblah

Odpowiedz

24

Jest to spowodowane intencjami używanymi do uruchamiania aplikacji. Eclipse uruchamia aplikację, używając intencji bez akcji i bez kategorii. Program uruchamiający uruchamia aplikację, używając intencji z kategorią android.intent.action.MAIN action i android.intent.category.LAUNCHER. Instalator uruchamia aplikację z operacją android.intent.action.MAIN i bez kategorii.

Ktokolwiek zgłosił błąd prawdopodobnie powinien to sformułować jako prośbę o rozszerzenie wtyczki Eclipse, ponieważ najwyraźniej chcą, aby Eclipse mógł udawać program uruchamiający i uruchamiać aplikacje z tą samą intencją, co program uruchamiający.

+2

Problem jednak występuje nawet po uruchomieniu aplikacji bezpośrednio z telefonu ... – Monstieur

+1

Tak, Kurian ma rację - nie jest to tylko problem wtyczki Eclipse. To samo dzieje się na urządzeniu podczas aktualizacji OTA. To najbardziej dziwny problem z Androidem, z którym miałem do czynienia. Nie mogę uwierzyć, że to wciąż nowy problem powstający rok temu !!! –

+1

Wygląda na to, że problem nie został rozwiązany. Hmmm ... Zastanawiam się, co ludzie naprawdę robią? –

57
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { 
     // Activity was brought to front and not created, 
     // Thus finishing this will get us to the last viewed activity 
     finish(); 
     return; 
    } 

    // Regular activity creation code... 
} 
+5

To jest tak opóźnione - nie twoje rozwiązanie, ale problem na samym początku. – JohnyTex

+0

Czy to błąd, czy jest to celowo? - sposób, w jaki Android ustawił to – Micro

+3

nie działa dla mnie, więc zmieniłem 'android: launchMode =" singleInstance "' na 'android: launchMode =" singleTask "' i zadziałało :) –

5

Oto rozwiązanie:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) { 
     finish(); 
     return; 
    } 

Your code.... 
} 

EDIT: Miałem problemy z nowymi zamiarów i powiadomień. Poprzednie rozwiązanie nie działa z zawiadomień i zamiarów ...

0

Podobne rozwiązanie dla Xamarin.Android:

if (!IsTaskRoot) 
      { 
       string action = this.Intent.Action; 
       if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain) 
       { 
        Finish(); 
        return; 
       } 
      } 
+0

gdzie napisać ten kod? –

+0

@HimanshuDwivedi to jest za bardzo stary błąd, już tego nie potrzebujesz – CDrosos

Powiązane problemy