我的应用程序有一种棘手的情况。我实现了一种机制,每 60 秒联系远程服务器以检查是否有新数据可用。如果是这样,新数据将显示在应用程序中。到现在为止还挺好。
我通过以下方式实现了该机制:
- 它从
onCreate()
我的 MainActivity 的方法开始。 - 轮询例程在我的 MainActivity
onDestroy()
方法中停止。
这确保只要应用程序正在运行,轮询始终处于活动状态。此外,如果我从 MainActivity 启动另一个 Activity,我还希望轮询运行。
我的问题:
当我通过Back-Button退出我的应用程序时,一切正常并且轮询停止。但是当我通过主页按钮退出我的应用程序时,轮询例程仍然存在,因为onDestroy()
我的 MainActivity 没有被调用,但我希望它停止。
如果我更改代码并在onPause()
MainActivity 的方法中停止轮询例程,我会遇到启动新 Activity 时轮询也会停止的问题。
我想要的是:
只要我的应用程序(不是我的 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();