使用GcmTaskService在特定时刻发出通知

时间:2015-08-01 05:52:13

标签: notifications google-cloud-messaging task

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

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

1 个答案:

答案 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;