0

我的应用程序有一种棘手的情况。我实现了一种机制,每 60 秒联系远程服务器以检查是否有新数据可用。如果是这样,新数据将显示在应用程序中。到现在为止还挺好。

我通过以下方式实现了该机制:

  • 它从onCreate()我的 MainActivity 的方法开始。
  • 轮询例程在我的 MainActivityonDestroy()方法中停止。

这确保只要应用程序正在运行,轮询始终处于活动状态。此外,如果我从 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();
4

4 回答 4

4

我认为处理它的最佳方法是创建一些 BaseActivity ,所有活动都将扩展。并在 onResume/onPause 中执行此操作。或者您可以尝试使用服务。

于 2013-09-26T19:30:48.043 回答
1

您需要创建一个服务并在您的主类中触发它,除非您在销毁时明确停止它意味着 onBackpressed()/onDetroy() 并让它在 onPause() 方法中运行,否则该服务将被触发

于 2013-09-26T19:38:16.743 回答
1

使用单例,并让它有一个计数器变量。当您发送启动新活动的意图时增加它,并在 onPause 中减少它。你可以判断轮询是否必须停止;当单例中的计数器为零时。

于 2013-09-26T19:41:32.220 回答
0

感谢大家的帮助和时间。 我终于自己找到了一个满足我所有要求的解决方案。

我按照本教程使其工作:http ://www.mjbshaw.com/2012/12/determining-if-your-android-application.html

基本思想是扩展 Application 类并保持参考在某个时间有多少 Activity “活着”。

于 2013-09-26T23:57:22.403 回答