Chcę wiedzieć, czy użytkownik powróci do ekranu głównego, jeśli opuści bieżącą aktywność.
Chcę wiedzieć, czy użytkownik powróci do ekranu głównego, jeśli opuści bieżącą aktywność.
Odpowiedzi:
AKTUALIZACJA (lipiec 2015):
Od getRunningTasks () się przestarzałe, z API 21 lepiej podążać raukodraug odpowiedź lub Ed Burnette jeden (wolałbym drugi).
Istnieje możliwość sprawdzenia aktualnych zadań i ich stosu za pomocą ActivityManagera .
Aby więc ustalić, czy czynność jest ostatnią:
Użyj poniższego kodu:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Pamiętaj, że powyższy kod będzie ważny tylko wtedy, gdy masz jedno zadanie. Jeśli istnieje taka możliwość, że dla Twojej aplikacji będzie istniała taka liczba zadań - musisz sprawdzić inne elementy taskList . Przeczytaj więcej o zadaniach Zadania i stosie wstecznym
isTaskRoot()
metodą.
Zamierzam zamieścić komentarz @ H9kDroid jako najlepszą odpowiedź dla osób, które mają podobne pytanie.
Możesz użyć isTaskRoot (), aby dowiedzieć się, czy działanie jest katalogiem głównym zadania.
mam nadzieję, że to pomoże
if (isTaskRoot()) { // do something }
Mam nadzieję, że pomoże to nowym początkującym, Opierając się na powyższych odpowiedziach, które dla mnie działają dobrze, udostępniam również fragment kodu, więc będzie łatwy do wdrożenia.
rozwiązanie: użyłem, isTaskRoot()
które zwracają wartość true, jeśli bieżąca aktywność jest tylko aktywnością na twoim stosie, a inna niż ja również obsługuję przypadek, w którym jeśli mam jakąś aktywność na stosie, przejdź do ostatniej aktywności na stosie zamiast otwierania nowej niestandardowej.
W Twojej działalności
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
istnieje najłatwiejsze rozwiązanie tego problemu, możesz użyć isTaskRoot () w swoim działaniu
Chociaż może istnieć sposób, aby to osiągnąć (zobacz inne odpowiedzi), sugeruję, aby tego nie robić. Zwykłe aplikacje na Androida nie powinny wiedzieć, czy ekran główny ma się wyświetlić, czy nie.
Jeśli próbujesz zapisać dane, umieść kod zapisujący dane w metodzie onPause (). Jeśli próbujesz dać użytkownikowi możliwość zmiany zdania na temat istniejącej aplikacji, możesz przechwycić klawisz w górę / w dół dla klawisza Wstecz i metody onBackPressed () i przedstawić im pytanie „Czy na pewno?” skłonić.
Jednym ze sposobów śledzenia tego jest dołączenie znacznika podczas rozpoczynania nowej czynności i sprawdzenie, czy znacznik istnieje.
Za każdym razem, gdy zaczynasz nową aktywność, wstaw znacznik:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
Możesz to sprawdzić w ten sposób:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Problem z użyciem rozwiązania sandrstar ActivityManager
jest następujący: potrzebujesz pozwolenia na pobieranie zadań w ten sposób. Znalazłem lepszy sposób:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Pozycja Activity
na dole stosu powinna zawsze mieć domyślnie tę kategorię, podczas gdy inne działania jej nie powinny.
Ale nawet jeśli to się nie powiedzie na niektórych urządzeniach, możesz to ustawić podczas uruchamiania Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Stworzyłem klasę bazową dla wszystkich moich działań, rozszerzając AppCompatActivity i która ma statyczny licznik:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Jak dotąd działało to wystarczająco dobrze; i niezależnie od wersji API. Wymaga to oczywiście, aby wszystkie działania rozszerzały tę klasę bazową - co w moim przypadku robią.
Edycja: Zauważyłem jeden przypadek, gdy licznik spada do zera, zanim aplikacja całkowicie się zamknie, czyli wtedy, gdy orientacja zostanie zmieniona i tylko jedno działanie jest otwarte. Kiedy zmienia się orientacja, działanie jest zamykane i tworzone jest inne, tak więc onDestroyed
wywoływane jest ostatnie działanie, a następnie onCreate
wywoływane, gdy to samo działanie jest tworzone ze zmienioną orientacją. Należy uwzględnić to zachowanie; Ewentualnie można użyć OrientationEventListener .
Android implementuje stos aktywności, sugeruję, abyś przeczytał o tym tutaj . Wygląda na to wszystko, co chcesz zrobić jest jednak odzyskać aktywność numerem: getCallingActivity()
. Jeśli bieżąca aktywność jest pierwszą aktywnością w Twojej aplikacji, a aplikacja została uruchomiona z ekranu głównego, powinna (zakładam) powrócić null
.
Jedyną rzeczą, której tutaj brakowało, jest kliknięcie „klawisza Home”, po aktywacji nie można tego wykryć w swojej aktywności, więc lepiej byłoby programowo kontrolować stos aktywności, obsługując naciśnięcie klawisza „Wstecz” i przechodząc do żądanej czynności lub po prostu wykonując niezbędne kroki.
Ponadto nie możesz być pewien, że rozpoczęcie aktywności z listy „Ostatnia aktywność” można wykryć, ustawiając dodatkowe dane w celu otwarcia czynności, ponieważ w takim przypadku są one ponownie wykorzystywane.