Ответ 1
Я могу представить два способа сделать это:
Вариант 1:
Вы можете создать службу, которая сканирует текущее приложение на переднем плане и посмотреть, является ли это вашей деятельностью. Вот какой код вы можете использовать, я взял его из другого ответа:
Существует простой способ получить список запущенных задач из Служба ActivityManager. Вы можете запросить максимальное количество задач работает по телефону, и по умолчанию текущая активная задача вернулся первым.
После этого вы можете получить объект ComponentName, запросив topActivity из вашего списка.
Вот пример.
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();
Вам понадобится следующее разрешение на ваш манифест:
<uses-permission android:name="android.permission.GET_TASKS"/>
Ссылка на ответ: Android: Как я могу получить текущую активность переднего плана (из службы)?
Вы можете вызывать это каждую секунду или меньше, чтобы определить, активно ли ваше приложение. Обратите внимание, что это устарело и не рекомендуется использовать для такого рода вещей, согласно официальной документации:
getRunningTasks()
Примечание. Этот метод предназначен только для отладки и представления задачи интерфейсов управления. Это никогда не должно использоваться для основной логики в приложении, например, выбор между различными типами поведения о найденной здесь информации. Такое использование не поддерживается и будет вероятно, переломится в будущем. Например, если несколько приложений могут в то же время активно работать, допущения, сделанные в отношении смысл данных здесь для целей управления будет неверно.
Вариант 2:
Второй вариант - создать класс, который расширяет Application
с помощью флага, например isAppRunning
, который будет истинным или ложным, если ваше приложение находится на переднем плане или нет:
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();
}
}
Таким образом, каждый раз при запуске Activity значение isAppRunning
в MyAppContext
будет true
, когда вы выйдете из Activity
, оно будет false
, но если откроется другое действие (например, если вы нажали кнопку "Назад", чтобы вернуться к предыдущему действию), значение будет немедленно true
снова.
Когда вы закончите все свои действия, ни один из методов onResume()
не будет вызван, и все методы onPause()
будут вызваны так, что isAppRunning
будет false
, и вы знаете, что ваш Activity
больше не включен на переднем плане.
Итак, повторите, если 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 () { ... };
}
Вы должны изменить timerRate
в соответствии с точностью, которую вы хотите получить при отслеживании сеанса.