我必须开发一个简单的应用程序,每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);
我问题:- 当我关闭我的应用程序(使用后退按钮),intentService继续做请求并重新创建自己(如预期的),所以我必须手动杀死它
- 我想停止做轮询每次我的应用程序进入后台和重启时进入前台,以限制电池消耗
我的其他问题:
我实现了一个类,当应用程序进入后台/前台时触发一个监听器。我在我的BaseActivity和IntentService中实现了这个接口。当应用程序进入后台时,布尔值变为false,并且我不执行repeat()方法。当我进入前台时,在我的方法onBecameForeground中我简单地创建了服务:
serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
@Override
public void onBecameForeground() {
startService(serviceIntent);
}
在后台没有问题,但在前台多个intentService被创建,一个intentService每一个活动我有在那一刻(我看到它在日志)。
我的问题:
- 这是做这项工作的最好方法吗?我该如何解决这些问题? 如果这是最好的(或不太坏的)方式,我如何创建IntentService的单个实例?
非常感谢您的帮助
如果您只需要在前景中使用它,那么我就不会为警报费心了。只需使用Handler每5秒向你的意图服务发送一次意图。
假设应该只有一个意图服务实例,所以如果你发布多个意图进行处理,它们将被排队,并且handleIntent将在你的意图服务中为每个意图调用。但是请注意,如果你的服务处理意图的速度足够快,那么它可能会在你发布另一个意图之前完成(并销毁)——所以你会看到该服务的多个实例正在被创建。但是一次只能有一个实例。
编辑:扩展一点,当(如果)您将在后台轮询服务器时,您将需要警报,所以不要通过该代码;)处理程序将在后台保持"冻结",因为操作系统不计算设备休眠处理程序延迟执行的时间。