Notifications 使用GcmTaskService在特定时间发出通知

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:"

我需要在一天中的特定时间运行通知的帮助。我找过了,但什么也没找到

我正在使用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;
   }
}

之所以很难做到这一点,是因为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;