Попробуйте это
Второй вариант заключается в создании класса, расширяющего Application с помощью флага, например isAppRunning, который будет иметь значение true или false, если ваше приложение находится на переднем плане. или нет:
public class MyAppContext extends Application {
public boolean isAppRunning = true;
public void setIsAppRunning(boolean v){
isAppRunning = v;
}
public boolean isAppRunning(){
return isAppRunning;
}
}
Затем в вашем AndroidManifest. xml вы должны добавить этот класс, чтобы он использовался при запуске вашего приложения. Просто добавьте android: name = ". MyAppContext" под тегом приложения:
<application
android:name=".MyAppContext"
Теперь в каждом вашем действии вы должны переопределить onResume () и onPause () и установить для флага соответствующий значение:
class BaseActivity extends Activity {
@Override
protected void onResume() {
super.onResume();
((MyAppContext)getApplication()).setIsAppRunning(true);
}
@Override
protected void onPause() {
((MyAppContext)getApplication()).setIsAppRunning(false);
super.onPause();
}
}
Таким образом, при каждом запуске действия значение isAppRunning в MyAppContext будет иметь значение true, при выходе из действия оно будет иметь значение false, но если откроется другое действие (например, если вы нажали кнопка «назад», чтобы вы вернулись к предыдущему действию) значение снова сразу станет истинным.
Когда вы окончательно завершите sh все ваши действия, ни один из методов onResume () не будет вызван, и все onPause () будут вызваны методы, поэтому isAppRunning будет иметь значение false, и вы знаете, что ваша активность больше не находится на переднем плане.
Так что возобновите, если isAppRunning имеет значение true, ваше приложение находится на переднем плане (запустите отслеживание сеанса), в противном случае это ушел (остановите отслеживание сеанса). Вы можете создать Timer в классе MyAppContext, чтобы периодически проверять значение isAppRunning, поэтому оно будет:
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 () { ... };
}