我需要帮助在一天中的特定时段运行通知。我搜查了但什么也没找到。
我正在使用GCMTaskService 我有一个PeriodicTask,目前每24小时运行一次任务。我希望它每天下午4点运行。任何想法,我能做到吗?
以下是截至目前的定期任务:
long periodSecs = 86400L;
long flexSecs = 15L;
String tag = "periodic | " + taskID++ + ": " + periodSecs + "s, f:" + flexSecs; // a unique task identifier
periodic = new PeriodicTask.Builder()
.setService(MyTasksService.class)
.setPeriod(periodSecs)
.setFlex(flexSecs)
.setTag(tag)
.setPersisted(true)
.setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
.setRequiresCharging(false)
.build();
GcmNetworkManager.getInstance(this).schedule(periodic);
这是我的GCMTaskService类:
public class MyTasksService extends GcmTaskService {
public MyTasksService() {
super();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.i("myTaskService", "onBind");
return super.onBind(intent);
}
@Override
public void onInitializeTasks() {
super.onInitializeTasks();
Log.i("myTaskService", "onInitializeTasks");
}
@Override
public int onRunTask(TaskParams taskParams) {
Log.i("myTaskService", "onRunTask");
SendPushNotification.dailyNewsPush();
SendPushNotification.dailyLecturasPush();
return 0;
}
}
答案 0 :(得分:0)
这很难做到的原因是因为API故意不是为它而设计的。在服务器负载方面,每天在同一时间点击服务器并不是一个好主意。
例如如果您的应用程序有1000个人,每天1次检查服务器,那么您的QPS将为1000 /(24 * 60 * 60)= 0.011。
如果您希望每个人都在下午3点点击服务器,那么您的QPS将为1000.随着您的安装基数的增长,这会变得更糟。
如果您托管自己的服务器,则必须增加额外的容量来处理这个巨大的峰值,如果你租用服务器,你将需要付出很多费用来启动实例处理。
如果您只是为了测试应用程序或用户群较小的东西而这样做,那么它仍然不是一个好主意,因为您不知道将来会有多少用户。 但是,您可以随时计算所需的挂起时间的秒数,并使用它来安排任务。
使用java Calendar可能是最简单的方法。意译:
Calendar currentCal = Calendar.getInstance();
Calendar 3amCal = Calendar.getInstance();
3amCal.set(Calendar.HOUR_OF_DAY, 3);
if (3amCal.before(currentCal)) {
// it's past 3 am, roll forward
3amCal.add(Calendar.DATE, 1);
}
final long 3amTomorrow = 3amCal.getTime();
final long current = currentCal.getTime();
final long millisUntil3amTomorrow = 3amTomorrow - currentTime;