在Android应用中进行轮询的正确方法

时间:2016-10-13 21:41:28

标签: android polling intentservice

我必须开发一个简单的应用程序,每隔5秒从服务器获取一个json。我知道这会耗尽电池,但由于我无法控制服务器,这是我目前唯一的解决方案,所以请留意我。 (它是一个演示应用程序,最终版本将完全不同)

我做了什么:

我创建了一个IntentService,并在他的onHandleIntent中执行http请求并异步管理响应。阅读文档时,IntentService比服务更受欢迎。最后,如其他主题所示,我使用AlarmManager类重新创建intentService。这就是方法:

private void repeat() {
    lastTrigger = System.currentTimeMillis();
    alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Intent serviceIntent = new Intent(this, StatusPollingService.class);
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, lastTrigger + UPDATE_INTERVAL, pendingIntent);
}

在我的第一个Activity中的onCreate中,我只是启动服务:

    serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
    startService(serviceIntent);

我的问题:

  1. 当我关闭我的应用程序(使用后退按钮)时,intentService继续执行请求并重新创建自己(如预期的那样),因此我必须手动将其杀死
  2. 我希望每当我的应用程序进入后台时停止进行轮询,并在进入前台时重新启动,以限制电池耗尽
  3. 我的其他问题:

    我实现了一个在应用程序进入后台/前台时触发侦听器的类。我在BaseActivity和IntentService中实现了接口。当应用程序进入后台时,布尔值变为false,我不执行 repeat()方法。当我进入前台时,在我的方法 onBecameForeground 中,我只需创建服务:

        serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
    @Override
    public void onBecameForeground() {
        startService(serviceIntent);
    }
    

    进入后台没有问题,但是在前台进行多个intentService的创建,每一个Activity都有一个intentService(我在日志中看到它)。

    我的问题:

    1. 这是完成这项工作的最佳方式吗?我怎么能解决这些问题?
    2. 如果这是最好(或不那么糟糕)的方式,我该如何创建IntentService的单个实例?
    3. 非常感谢你的帮助

1 个答案:

答案 0 :(得分:0)

如果你只需要它在前台,那我就不用担心了。只需使用Handler每5秒向意图服务发布一次意图。

据说应该只有一个意图服务实例,所以如果你发布多个意图进行处理,它们将排队并在你的意图服务中为每个意图调用handleIntent。但请注意,如果您的服务处理意图足够快,那么它可能会在您发布另一个意图之前完成(并销毁) - 因此您将看到正在创建的服务的多个实例。但是一次只会有一个实例。

编辑:要稍微扩展一下,当您(以及如果)在后台轮询服务器时,您将需要警报,因此请不要通过该代码;)处理程序将保留&#34 ;冻结"在后台,因为操作系统没有计算设备因Handler推迟执行而休眠的时间。