mogę myśleć dwa sposoby prowadzenia go:
Wariant 1:
można stworzyć usługę, która skanuje dla bieżącej aplikacji na pierwszym planie i sprawdzić, czy to jest Twoja aktywność. Oto kod można użyć, wziąłem go z innej odpowiedzi:
Jest to prosty sposób na uzyskanie listę uruchomionych zadań z usługi ActivityManager. Możesz zażądać maksymalnej liczby zadań uruchomionych w telefonie, a domyślnie aktywne zadanie to zwrócone jako pierwsze.
Po uzyskaniu informacji o obiekcie ComponentName można poprosić o topActivity z listy.
Oto przykład.
ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
// get the info from the currently running task
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
Log.d("topActivity", "CURRENT Activity ::"
+ taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();
Potrzebne będą następujące pozwolenia na swoim manifeście:
<uses-permission android:name="android.permission.GET_TASKS"/>
Link odpowiedź: Android: How can I get the current foreground activity (from a service)?
można nazwać każdą jedną sekundę lub mniej, aby wykryć, czy aplikacji jest nadal aktywny.Należy pamiętać, że jest przestarzała i nie jest zalecana do korzystania z tego rodzaju rzeczy, według oficjalnej dokumentacji:
getRunningTasks()
Uwaga: metoda ta jest przeznaczona tylko do debugowania i prezentacji zadań zarządzanie interfejsami użytkownika. Nigdy nie powinno to być używane w logice rdzeniowej w aplikacji, na przykład podczas wybierania między różnymi zachowaniami opartymi na w odniesieniu do informacji znajdujących się tutaj. Takie zastosowania nie są obsługiwane i prawdopodobnie ulegną uszkodzeniu w przyszłości. Na przykład, jeśli wiele aplikacji może aktywnie działać w tym samym czasie, to założenia dotyczące znaczenia tych danych dla celów sterowania przepływem będą niepoprawne w przypadku .
Opcja 2:
Drugą opcją jest utworzyć klasę, która rozciąga Application
z flagą, na przykład isAppRunning
, który będzie prawda czy fałsz według jeśli aplikacja znajduje się na na pierwszym planie czy nie:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
}
Następnie na AndroidManifest.xml
trzeba dodać do tej klasy tak będzie używany podczas swojej applic Rozpoczęcie ation. Wystarczy dodać android:name=".MyAppContext"
pod tagiem aplikacji:
<application
android:name=".MyAppContext"
Teraz w każdej działalności, które masz powinny przesłonić onResume()
i onPause()
i ustawić flagę do odpowiedniej wartości:
class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
((MyAppContext)getApplication()).setIsAppRunning(true);
}
@Override
protected void onPause() {
((MyAppContext)getApplication()).setIsAppRunning(false);
super.onPause();
}
}
Na ten sposób za każdym razem kiedy Rozpocznij działanie, wartość isAppRunning
w MyAppContext
będzie true
, po wyjściu z Activity
będzie to false
, ale jeśli otworzy się inne działanie (na przykład, jeśli naciśniesz przycisk Wstecz, aby powrócić do poprzednia czynność) wartość będzie ponownie true
ponownie.
Kiedy wreszcie zakończyć wszystkie swoje działania żadna z metod onResume()
zostaną nazwane i wszystkie metody onPause()
będzie nazwany tak isAppRunning
będzie false
i wiesz już swój Activity
jest na pierwszym planie.
Tak więc wznawianie, jeśli isAppRunning
jest true
Twoja aplikacja znajduje się na pierwszym planie (uruchom śledzenie sesji) w przeciwnym razie zniknie (zatrzymaj śledzenie sesji). Można utworzyć Timer
w MyAppContext
klasę sprawdzić wartość isAppRunning
okresowo, więc byłoby:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public final int timerRate = 500; // Execute timer task every 500mS
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
@Override
public void onCreate() {
super.onCreate();
Timer mTimer = new Timer();
mTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
if(isAppRunning) startSesionTracking();
else stopSesionTracking();
}
}, 0, REFRESH_TIME);
}
private void startSesionTracking() { ... };
private void stopSesionTracking() { ... };
}
Należy zmodyfikować timerRate
zgodnie z precyzją chcesz dostać w śledzeniu sesji.
, więc użycie opcji onPause nie spowoduje podania informacji o aplikacji dotyczącej przejścia na inną aplikację lub inną aktywność ... – Kasma
Nie, to tylko część działań. Działa, działa, gdy aktywność nie jest już aktywna. Dzieje się tak, gdy użytkownik przełącza się do innej aplikacji, inna aplikacja zaczyna skupiać się na pierwszym planie (zauważyłem, że dzieje się tak, gdy dodasz słowo do słownika na klawiaturze), a nawet gdy urządzenie jest zablokowane przez użytkownika, lub czas oczekiwania na ekranie blokuje urządzenie. – EvilGeniusJamie
ale jak śledzić, czy chodzi o inną aktywność ... – Kasma