2012-12-20 8 views
5

jaki jest lepszy sposób sprawdzenia, czy aktywność jest nadal w stosie, aby móc ją oddzwonić?jak sprawdzić, czy aktywność jest nadal w stosie?

Intent i = new Intent(getApplicationContext(),MyClass.class); 
startActivity(i); 
+2

Dlaczego troska? To zależy od Androida. – m0skit0

+0

zobacz ten artykuł na http://stackoverflow.com/questions/5975811/how-to-check-if-an-activity-is-the-last-one-in-the-activity-stack-for-an-applica/ 6242122 # 6242122 –

+0

cos Mam działanie, które potrzebuje params w celu pobrania danych z pliku xml, więc chcę wywołać je z powrotem ze stosu, aby uniknąć przekazywania parametrów i pobierania danych z pliku, bo będzie to bolesne dla użytkownika zobacz za każdym razem ProgressDialog. – leonidas79

Odpowiedz

-1

Spójrz na ActivityManager API

Aby uzyskać instancją ActivityManager użyć tego kodu:

ActivityManager mngr = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
+8

Byłoby wspaniale mieć więcej szczegółów na temat tego, jak dokładnie powinienem używać ActivityManager, aby sprawdzić, czy aktywność jest na stosie. Po prostu "przeczytaj dokumentację tej klasy" nie jest wystarczająco dobry IMO. – Tapemaster

+0

Miał na myśli ActivityManager.getRunningTasks, ale został wycofany z Lollipop. – grebulon

1

Jestem zaskoczony, jak niepopularne to (niby) pytanie (s) jest.

Zacznę od roztworu pierwszy:
Od ActivityManager.getRunningTasks jest nieaktualna od 21 API,
Musimy znaleźć inny sposób na jakie działania są w backstack. I zdałem sobie sprawę, że możemy faktycznie wdrożyć własny "stos"!

oświadczyłem ArrayList w MyOwnApplication:

private ArrayList<Class> runningActivities = new ArrayList<>(); 

I dodaje publicznych metod dostępu i zmiany tej listy:

public void addThisActivityToRunningActivityies (Class cls) { 
    if (!runningActivities.contains(cls)) runningActivities.add(cls); 
} 

public void removeThisActivityFromRunningActivities (Class cls) { 
    if (runningActivities.contains(cls)) runningActivities.remove(cls); 
} 

public boolean isActivityInBackStack (Class cls) { 
    return runningActivities.contains(cls); 
} 

w A BaseActivity gdzie wszystkie działania przedłużyć go:

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ((MyOwnApplication)getApplication()).addThisActivityToRunningActivityies(this.getClass()); 
    } 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    ((MyOwnApplication)getApplication()).removeThisActivityFromRunningActivities(this.getClass()); 
} 

A następnie można łatwo użyć isActivityInBackStack, aby sprawdzić.

DLACZEGO JEST TO NIEZBĘDNE?

Tak, oczywiście, większość przypadków można wykonać za pomocą znaczników intencji i właściwej nawigacji.
Ale jest taki przypadek użycia, który moim zdaniem powinien być powszechny, że nie znajduję rozwiązania po prostu używając flag intencji.

Załóżmy, że mam aplikację, która ma szufladę nawigacji w prawie każdym działaniu.
Przejmuję od MainActivity do ActivityA, a następnie utworzono ChildActivityB z ActivityA. Należy pamiętać, że ActivityA nie jest macierzystym z ChildActivityB od ChildActivityB można otworzyć z innych działań, takich jak powiadomienia.

Należy pamiętać, że ChildActivityB ma również szufladę. Mogę przejść do ActivityA przez szufladę, zamiast naciskać przycisk w górę lub w tył. Teraz wyobraź sobie, że przechodzisz przez taki proces: Aktywność A -> Aktywność dla dzieci B -> Szuflada -> Aktywność A -> Aktywność dla dzieciB -> Szuflada -> Aktywność A ..... Nieskończone czynności zostaną utworzone w backstacku.
Aby rozwiązać taki problem, musimy użyć intent Flags:

(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

tej pory tak dobrze. Mam jednak niestandardowe animacje przejścia aktywności za pomocą overridePendingTransition().Zauważyłem, że jeśli wstawię powyższe flagę intencji razem z overridePendingTransition(), pojawi się błąd w animacji, ponieważ aktywność jest niszczona w środku animacji, ze względu na flagę Intent.FLAG_ACTIVITY_CLEAR_TOP.

Teraz, jeśli jestem w stanie wykryć czy ActivityA jest w backstack czy nie, zachowanie będzie idealny:

private void navigateToDrawerItems(Class cls) { 
    drawerLayout.closeDrawer(GravityCompat.END); 
    Intent intent = new Intent(this, cls); 
    if (((MyOwnApplication)getApplication()).isActivityInBackStack(cls)) { 
     intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(intent); 
    } else { 
     startActivity(intent); 
     overridePendingTransition(R.anim.slide_right_in, R.anim.slide_left_out); 
    } 
} 
+0

+1 za wzmiankę o korzystaniu z nawigacji. Dodam, że chociaż jest to ważny przypadek użycia dla szuflady nawigacji, to jest jeszcze ważniejsze dla nawigacji paska kart (inaczej BottomNavigationView). Android nie ma FLAG_ACTIVITY_REORDER_TO_FRONT dla fragmentu backstack. Jeśli więc chcesz łatwo zachować stan podczas przełączania między kartami ORAZ nie zabraknie pamięci, jedynym sposobem jest użycie kart aktywności zamiast kart fragmentów. – flopshot

Powiązane problemy