У меня какая-то сложная ситуация в моем приложении. Я реализовал механизм, который связывается с удаленным сервером каждые 60 секунд, чтобы проверить, доступны ли новые данные. Если это так, новые данные отображаются в приложении. Все идет нормально.
Я реализовал механизм следующим образом:
- Он запускается в методе
onCreate()
моей MainActivity. - Процедура опроса останавливается в методе
onDestroy()
моей MainActivity.
Это гарантирует, что опрос всегда активен, пока приложение работает. Кроме того, если я запускаю другое действие из основного действия, я также хочу, чтобы опрос выполнялся.
Моя проблема:
Когда я выхожу из своего приложения с помощью кнопки «Назад», все работает нормально, и опрос прекращается. Но когда я выхожу из своего приложения с помощью кнопки «Домой», процедура опроса остается активной, поскольку onDestroy()
моей основной активности не вызывается, но я хочу, чтобы она остановилась.
Если я изменю свой код и остановлю процедуру опроса в методе onPause()
моей MainActivity, у меня возникнет проблема, заключающаяся в том, что опрос также останавливается, когда я запускаю новую активность.
Что я хочу:
Я хочу, чтобы опрос выполнялся до тех пор, пока мое приложение (не моя MainActivity) находится на переднем плане/видимо для пользователя. Как только пользователь выходит из приложения, нажав кнопку «Домой» из любого места в приложении или нажав кнопку «Назад» из MainActivity, я хочу, чтобы опрос прекратился.
ДОПОЛНИТЕЛЬНО:
Я также не хочу перезапускать и останавливать службу каждый раз, когда я переключаю действия. Поскольку пользователь моего приложения будет переключать действия очень часто, это будет просто много накладных расходов. Кроме того, я хочу, чтобы цикл «обновления» составлял ровно 60 секунд. Я не могу гарантировать это, когда я всегда перезапускаю службу и снова останавливаю ее. Его нужно запустить один раз, когда приложение запускается, и остановить, когда приложение больше не находится на переднем плане.
Как этого добиться?
Есть какой-нибудь простой способ проверить, когда приложение находится на переднем плане, а когда оно скрыто/закрыто?
Это мой механизм опроса синглтона:
private Timer t;
private static Updater instance;
protected Updater() {
// Exists only to defeat instantiation.
}
public static Updater getInstance() {
if(instance == null) {
instance = new Updater();
}
return instance;
}
public void startPollingRoutine(int interval, int delay) {
t = new Timer();
// Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
update(); // some asynctask that does the updating
}
}, delay, interval);
}
public static void stopPollingRoutine() {
t.cancel();
}
В коде:
Updater.getInstance().startPollingRoutine(60000, 0);
Updater.getInstance().stopPollingRoutine();