5

Mam trzy czynności: - SplashActivity - główną działalność - PlayerActivityRozróżnić wciśnięciu przycisku „home” i otwarcie innej działalności

Oczywiście aplikacja rozpoczyna się SplashActivity, to zaczyna główną działalność i zamyka. MainActivity w pewnym momencie uruchamia PlayerActivity i przechodzi do backstack. (MainActivity żyje, ale jest onStop) Następnie potrzebuję otwartego MainActivity i ustaw PlayerActivity na background (PlayerActivity jest żywy, ale jest onStop). Następnie potrzebuję ponownie otworzyć PlayerActivity i ustawić MainActivity na tle.

Aktywność PlayerActivity i MainActivity często jest włączanaPause() i onStop() bez onDestroy, gdy aplikacja przełącza się między sobą iz powrotem.

Potrzebuję zakończyć wszystkie czynności i uruchomić aplikację dla SplashActivity za każdym razem, gdy użytkownik wciśnie przycisk "home", ale przycisk home powoduje to samo, co przełączanie pomiędzy działaniami (onPause() i onStop()). Więc nie mogę złapać różnicy, żeby zabić czynności.

Proszę o pomoc.

edycja: Niestety onUserLeaveHint nie pomaga, to jest to samo. Jeśli użytkownik naciska HOME to nazywa:

onUserInteraction, onUserLeaveHint, OnPause, OnStop

Ten aktywny powrót poprzedniej pracy (główny) bez jakichkolwiek działań użytkowników.

public class PlayerActivity rozciąga Aktywny {

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_next); 

    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      startActivity(new Intent(PlayerActivity.this, MyActivity.class)); 
     } 
    }, 5000); 
} 

}

Ale wciąż ta sama:

onUserInteraction, onUserLeaveHint, OnPause, OnStop

+0

Opadowej 'SplashActivity ', jeśli nic nie robisz. –

+1

Z drugiej strony, aplikacja działa dużo w SplashActivity, więc potrzebuję jej i muszę uruchomić SplashActivity za każdym razem, gdy użytkownik po prostu zwinie aplikację z przyciskiem głównym. –

Odpowiedz

2

Zgodnie z moją wiedzą, nie ma sposobu, aby zastąpić przycisk domu lub słuchać zdarzeń naciśnij przycisk domu.

jednak Twoim celem jest, aby aplikacja wiedzieć i podjąć działania w następujących przypadkach:

  • Żaden z Twoich działań są wyświetlane -> Jeden z twoich działań jest wyświetlana.

W takim przypadku należy wyświetlić okno powitalne.

Możesz śledzić, kiedy użytkownik jest w aplikacji i sprawdzić, czy użytkownik nawigował do Twojej aktywności z poziomu aplikacji.

AKTUALIZACJA: Zamiast modyfikować wszystkie działania, jak pokazano w przykładzie poniżej, można użyć obiektu ActivityLifecycleCallbacks, aby wiedzieć, kiedy wywoływane są wywołania zwrotne cyklu życia działań. Możesz wziąć mój przykład i go zmodyfikować. Wierzę, że ActivityLifecycleCallbacks.onActivityStarted() jest wywoływana po wywołaniu super.onStart(), więc będziesz musiał sprawdzić cameFromMyApplication() przed wywołaniem super.onStart() w Activity.onStart(). Jest to mniej podatne na błędy i wymaga mniejszej ilości kodu.

Modified How to check if activity is in foreground or in visible background?, aby dopasować to pytanie

Przykład Wdrożenie niestandardowej klasy Application:

public class MyApplication extends Application { 

    public static boolean cameFromMyApplication() { 
    return count != 0; 
    } 

    public static void activityStarted() { 
    count++; 
    } 

    public static void activityStopped() { 
    count--; 
    } 

    private static int count; 
} 

Zarejestruj swoją klasę aplikacji w AndroidManifest.xml:

<application 
    android:name="your.app.package.MyApplication" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 

Dodaj onStart i OnStop do każdego działania w projekcie (można stworzenie wspólnego przodka za swoje działania, jeśli chcesz):

@Override 
protected void onStart() { 
    super.onStart(); 
    //Do not include this check in the splash screen Activity 
    if(!MyApplication.cameFromMyApplication()) { 
    //User arrived from outside the application 
    //Application specific code (clear Activity backstack & show splash screen in your case) 
    } 
    MyApplication.activityStarted(); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    MyApplication.activityStopped(); 
} 
+0

Widzę, że nie jest to sposób, w jaki miałem nadzieję, ale to tylko ten, który działa. Wielkie dzięki! –

+0

Świetnie. Jedna rzecz do zapamiętania: Musisz zadzwonić do czynności Rozpoczęcie/działanieStopped we wszystkich działaniach. Zaktualizowałem odpowiedź. – vman

+0

Dzięki, działa idealnie dla mnie. – jose920405

1

Możesz złapać "kliknięcie przycisku strony głównej" z możliwą do zastąpienia funkcją onUserLeavesHint(), która może być wystarczająca w twojej sytuacji.

@Override 
public void onUserLeaveHint() { 
    super.onUserLeaveHint(); 
    // Do your thing 
} 

Dokumentacja z http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()

protected void onUserLeaveHint()

nazywane jako część cyklu aktywności, gdy działalność ma zamiar iść w tle jako rezultat wyboru użytkownika.Na przykład, gdy użytkownik naciśnie klawisz Strona główna, zostanie wywołana funkcja onUserLeaveHint(), ale , gdy przychodzące połączenie telefoniczne spowoduje, że Aktywność podczas połączenia będzie automatycznie przeniesiona na pierwszy plan, onUserLeaveHint() nie będzie wywoływana działanie jest przerywane. W przypadku wywołania: ta metoda jest wywoływana tuż przed wywołaniem funkcji onPause() działania.

To wywołanie zwrotne i onUserInteraction() mają na celu pomoc w inteligentnym zarządzaniu powiadomieniami o pasku stanu za pomocą czynności ; w szczególności dla działań pomocniczych określających właściwy czas anulowania notyfikacji.

+0

tnx, ale niestety to nie pomogło, zobacz mój montaż powyżej –

1

można sprawdzić to w ten sposób:

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
List<RunningTaskInfo> tasks = am.getRunningTasks(1); 
    // check if home was pressed 
    if (tasks.get(0).topActivity.getPackageName().equals("com.android.launcher")) { 
     // HOME button pressed 
    } else { 
     // RECENT APPS pressed (you can listen for the key event before) 
     // activity with FLAG_ACTIVITY_NEW_TASK started 
     // etc. 
    } 
0

Szukałem rozwiązania podobnego problemu i kodu dostarczonego przez ungalcrys powyżej umieścić mnie w dobrym kierunku, więc tutaj jest bardziej uniwersalne rozwiązanie problemu i dla każdego, kto potrzebuje

@Override 
protected void onStop() { 
     super.onStop(); 

     ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1); 

     // check if the app is still visible 
     if (!tasks.get(0).topActivity.getPackageName().equals(getPackageName())) { 
      // for some reason(HOME, BACK, RECENT APPS, etc.) the app is no longer visible 
      // do your thing here 
      } else { 
      // app is still visible, switched to other activity 
     } 
    }