正确的方式做轮询在安卓应用程序



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

我做了:

我创建了一个IntentService,并在他的onHandleIntent我做http请求和异步管理响应。阅读文档,IntentService比Service更受欢迎。最后,正如在其他主题中看到的那样,我使用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);
}

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

    serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
    startService(serviceIntent);
我问题:

  1. 当我关闭我的应用程序(使用后退按钮),intentService继续做请求并重新创建自己(如预期的),所以我必须手动杀死它
  2. 我想停止做轮询每次我的应用程序进入后台和重启时进入前台,以限制电池消耗

我的其他问题:

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

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

在后台没有问题,但在前台多个intentService被创建,一个intentService每一个活动我有在那一刻(我看到它在日志)。

我的问题:

  1. 这是做这项工作的最好方法吗?我该如何解决这些问题?
  2. 如果这是最好的(或不太坏的)方式,我如何创建IntentService的单个实例?

非常感谢您的帮助

如果您只需要在前景中使用它,那么我就不会为警报费心了。只需使用Handler每5秒向你的意图服务发送一次意图。

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

编辑:扩展一点,当(如果)您将在后台轮询服务器时,您将需要警报,所以不要通过该代码;)处理程序将在后台保持"冻结",因为操作系统不计算设备休眠处理程序延迟执行的时间。

相关内容

  • 没有找到相关文章

最新更新