2013-07-17 7 views
21

Jeśli FirstActivity jest głównym zadaniem, a to kończy się i rozpoczyna SecondActivity, następnie wywołanie isTaskRoot() w SecondActivity natychmiast powróci false, ponieważ FirstActivity skończenie przebiega asynchronicznie, a więc nie jest jeszcze gotowe. Oczekiwanie na sekundę i następnie wywołanie isTaskRoot() zwraca wartość true.Sprawdzaj, czy bieżąca aktywność będzie ostatecznie korzeń zadanie, po oczekiwaniu czynności wykończeniowe zniknęły

public class FirstActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     finish(); 
     startActivity(new Intent(this, SecondActivity.class)); 
    } 
} 
public class SecondActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     ((TextView)findViewById(R.id.tv1)) 
       .setText("isTaskRoot() in onResume(): " + isTaskRoot()); 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       ((TextView)findViewById(R.id.tv2)) 
         .setText("isTaskRoot() after 1s: " + isTaskRoot()); 
      } 
     }, 1000); 
    } 
} 

screenshot of the result

Czy istnieje sposób, aby & hellip;

  • (optymalnie) dowiedzieć się, czy działalność będzie korzeniem zadanie ostatecznie, albo

  • (lepsze to niż nic) dostać jakąś powiadomień/oddzwanianie, gdy zadanie jest w swoim " końcowy "stan i tym samym isTaskRoot() zwróci" prawdę "?

+0

Możesz wywołać metodę isFinishing() na czynności, która była poprzednio rootem zadania, aby sprawdzić, czy jest ona w trakcie kończenia. –

+0

@RaghavSood Działa to tylko wtedy, gdy znam wszystkie czynności w stosie, które być może nie są. – balpha

+1

@balpha Hmm true. Możesz użyć 'registerActivityLifecycleCallbacks()' w aplikacji, jeśli masz zamiar obsługiwać API poziomu 14 i wyższego (a.k.a, Android 4.0+). Lub możesz użyć jednego z hacky nieoficjalnych snippets, aby uzyskać listę wszystkich działań w stosie –

Odpowiedz

1

Miałem podobny problem i chciałem ścisłej kontroli dokładnie tego, kim jest aktywność root. W moim przypadku root mógł być tylko jedną z moich własnych czynności (nie stron trzecich), więc mogłem zastosować następujące podejście:

Rozszerzyłem klasę Application, dodano słabe odniesienie do działania o nazwie currentRootActivity i dodano zsynchronizowany program pobierający i ustawiający.

Wówczas sam stanem udało mi się, gdy działania zostały stworzone/zniszczone. Mój przypadek użycia był trochę wyjątkowy, ponieważ chciałem zastąpić jednego root'a innym, więc wiedziałem dokładnie, gdzie zresetować moją nową zmienną stanu, ale jestem prawie pewien, że możesz zrobić to samo.

Byłem nawet w stanie dodać tę logikę stanów we wspólnej klasie bazowej dla wszystkich moich działań. To nie było tak obrzydliwe, jak się wydaje :)

Jak wspomniano w komentarzach, metoda działania isFinishing może się również przydać.

+0

Wdrożyłbym to rozwiązanie. – Sulfkain

-1

Spróbuj:

Intent intent = new Intent(this, SecondActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 

Spodziewam się, że to uczyni SecondActivity aktywność korzeni.

+0

Moje pytanie nie brzmi: jak spowodować, aby działanie było działaniem root. Moje pytanie brzmi, jak się dowiedzieć, czy tak jest. A raczej w końcu zostanie. – balpha

Powiązane problemy