我必须开发一个简单的应用程序,每隔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);
我的问题:
我的其他问题:
我实现了一个在应用程序进入后台/前台时触发侦听器的类。我在BaseActivity和IntentService中实现了接口。当应用程序进入后台时,布尔值变为false,我不执行 repeat()方法。当我进入前台时,在我的方法 onBecameForeground 中,我只需创建服务:
serviceIntent = new Intent(BaseActivity.this, StatusPollingService.class);
@Override
public void onBecameForeground() {
startService(serviceIntent);
}
进入后台没有问题,但是在前台进行多个intentService的创建,每一个Activity都有一个intentService(我在日志中看到它)。
我的问题:
非常感谢你的帮助
答案 0 :(得分:0)
如果你只需要它在前台,那我就不用担心了。只需使用Handler每5秒向意图服务发布一次意图。
据说应该只有一个意图服务实例,所以如果你发布多个意图进行处理,它们将排队并在你的意图服务中为每个意图调用handleIntent。但请注意,如果您的服务处理意图足够快,那么它可能会在您发布另一个意图之前完成(并销毁) - 因此您将看到正在创建的服务的多个实例。但是一次只会有一个实例。
编辑:要稍微扩展一下,当您(以及如果)在后台轮询服务器时,您将需要警报,因此请不要通过该代码;)处理程序将保留&#34 ;冻结"在后台,因为操作系统没有计算设备因Handler推迟执行而休眠的时间。