我们有一个“聊天”SDK,缺少更好的术语,旨在放入主机应用程序并允许与代理进行实时聊天会话。该过程的一部分是在发生对话时每隔几秒轮询服务器以获取新消息或信息。由于这至少部分地用作诊断辅助,因此非常希望该轮询和对话在后台继续。请注意,我们已定义了对话的开始和结束,因此这不是一个无限的过程。
直到最近,这个实现为直接启动的BoundService
(对话必须经过绑定才能生存)随着Android 8.0的更改,这不再有效。应用程序放在后台后,“短时间”终止后台服务。
我第一次尝试使用定期JobScheduler
,但不能超过15分钟进行轮询。
我们正在研究支持Android 8.0的选项,到目前为止,最简单的选择似乎是消除后台服务并使用CountDownTimer
实现轮询(主线程上或多或少显然,但无关紧要)因为工作实际上是在AsyncTask中处理的。这似乎工作正常,轮询一直持续到会话结束,一切都是copacetic。
我是否应该更改此选项以使用JobScheduler
短暂超时,并在完成后重新安排自己?
另一个选项可能是包含会话本身的前景Service
,但这需要更多的工作。
答案 0 :(得分:0)
如果您需要这么短的投票时间,我建议您使用以下
的ScheduledThreadPoolExecutor 根据阅读游览案例,这似乎是最合适的选项,因为您需要在单独的线程上进行定期间隔轮询。 ScheduledThreadpoolExecutor有一个非常简单的实现。请注意以下代码:
Executors.newScheduledThreadPool(10) //thread count
.scheduleAtFixedRate(() -> {
//Perform action; //Implement a runnable
},1000, 10, TimeUnit.MINUTES);
//1000 - The initial delay in milliseconds.
//10 - The number of minutes to keep polling.
所有这些都发生在您请求的单独线程上。 Executors
是一个基本的Java Framework Threading Primitive。唯一的缺点是一旦这个过程被杀死。不断的民意调查也会死亡。
对于更加以Android为中心的方法,尝试一个AlarmManager,它可以选择在过程中死亡甚至电话重启(只有你想要,你必须在清单中声明这个)
<强> AlarmManager 强>
此类提供对系统警报服务的访问。这些允许您安排应用程序在将来的某个时间运行。当警报响起时,系统会广播已为其注册的Intent,如果目标应用程序尚未运行,则会自动启动它。
示例实施
Calendar repeatTime = Calendar.getInstance();
repeatTime.set(Calendar.HOUR_OF_DAY,14);
repeatTime.set(Calendar.MINUTE,05);
AlarmManager mAlarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(mContext, <YOURBROADCASTRECEIVER>.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, YOUR_REQUEST_CODE,intent, PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.setInexactRepeating(AlarmManager.RTC,repeatTime.getTimeInMillis(),AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);