Notifications 使用GcmTaskService在特定时间发出通知
我需要在一天中的特定时间运行通知的帮助。我找过了,但什么也没找到 我正在使用GCMTaskService 我有一个PeriodicTask,目前每24小时运行一次任务。我希望它每天下午4点运行。你知道我可以这样做吗 以下是截至目前的定期任务:Notifications 使用GcmTaskService在特定时间发出通知,notifications,google-cloud-messaging,task,Notifications,Google Cloud Messaging,Task,我需要在一天中的特定时间运行通知的帮助。我找过了,但什么也没找到 我正在使用GCMTaskService 我有一个PeriodicTask,目前每24小时运行一次任务。我希望它每天下午4点运行。你知道我可以这样做吗 以下是截至目前的定期任务: long periodSecs = 86400L; long flexSecs = 15L; String tag = "periodic | " + taskID++ + ": " + periodSecs + "s, f:"
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;
}
}
之所以很难做到这一点,是因为API不是专门为它设计的。就服务器负载而言,每天在完全相同的时间访问服务器不是一个好主意 例如,如果您的应用程序每天有1000个ppl在服务器上签入1x,您的QPS将为1000/(24*60*60)=0.011 如果您希望每个人都在下午3点点击服务器,那么您的QPS将为1000。随着安装基数的增加,情况会变得更糟 如果你拥有自己的服务器,你将不得不提高额外的容量来应对这个巨大的峰值,如果你租用服务器,你将收取大量费用来提高实例的处理速度 如果你只是为了一个测试应用或是一个小用户群而这样做,这仍然不是一个好主意,因为你不知道你将来会有多少用户。 但是,您可以计算到您想要的挂钟时间之前的秒数,并使用它来安排任务 使用java日历可能是最简单的方法。释义:
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;
之所以很难做到这一点,是因为API不是专门为它设计的。就服务器负载而言,每天在完全相同的时间访问服务器不是一个好主意 例如,如果您的应用程序每天有1000个ppl在服务器上签入1x,您的QPS将为1000/(24*60*60)=0.011 如果您希望每个人都在下午3点点击服务器,那么您的QPS将为1000。随着安装基数的增加,情况会变得更糟 如果你拥有自己的服务器,你将不得不提高额外的容量来应对这个巨大的峰值,如果你租用服务器,你将收取大量费用来提高实例的处理速度 如果你只是为了一个测试应用或是一个小用户群而这样做,这仍然不是一个好主意,因为你不知道你将来会有多少用户。 但是,您可以计算到您想要的挂钟时间之前的秒数,并使用它来安排任务 使用java日历可能是最简单的方法。释义:
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;