Java 如何在我的服务中高效地安排任务?

Java 如何在我的服务中高效地安排任务?,java,android,alarmmanager,battery,network-connection,Java,Android,Alarmmanager,Battery,Network Connection,我有一个收集数据的服务,该服务每小时都需要将这些数据发送到我的服务器。我知道他们有很多解决方案可用于安排任务,但在我的情况下,在电池消耗和资源利用方面,什么是最有效的 此外,我的服务也可以停止,当我的服务停止时,它不能再发送任何数据(因此alarmmanager seam不是最好的方法,因为据我所知,它将重新启动我的服务)通过AlaramManager进行计划非常好,因为您也可以取消计划的任务 它可能看起来像这样 AlarmManager alarm = (AlarmManager) getS

我有一个收集数据的服务,该服务每小时都需要将这些数据发送到我的服务器。我知道他们有很多解决方案可用于安排任务,但在我的情况下,在电池消耗和资源利用方面,什么是最有效的


此外,我的服务也可以停止,当我的服务停止时,它不能再发送任何数据(因此alarmmanager seam不是最好的方法,因为据我所知,它将重新启动我的服务)

通过
AlaramManager
进行计划非常好,因为您也可以取消计划的任务

它可能看起来像这样

 AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
 Intent intent = new Intent(getApplicationContext(), YourService.class);
 alarm.set(
    AlarmManager.RTC_WAKEUP,
    System.currentTimeMillis() + DateUtils.HOUR_IN_MILLIS,
    PendingIntent.getService(getApplicationContext(), 11, intent, PendingIntent.FLAG_UPDATE_CURRENT)
 );
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), YourService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 11, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
取消它可以这样做

 AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
 Intent intent = new Intent(getApplicationContext(), YourService.class);
 alarm.set(
    AlarmManager.RTC_WAKEUP,
    System.currentTimeMillis() + DateUtils.HOUR_IN_MILLIS,
    PendingIntent.getService(getApplicationContext(), 11, intent, PendingIntent.FLAG_UPDATE_CURRENT)
 );
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent myIntent = new Intent(getApplicationContext(), YourService.class);
PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 11, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);

11
pendingent
的标识符,您可以在其中访问它

仅使用报警管理器是不够的

您应该在网络连接已处于使用状态时发送数据,因为将WiFi或3G/4G无线电从“空闲/未使用”切换到“数据发送/接收”非常耗电。如果设备已经在发送/接收数据,则您没有额外的能源成本来激活收音机

您可以注册一个广播接收器,通知您的应用程序当前的网络状态

有关更多详细信息,请参阅

你的转会策略将包括以下几种:

  • 报警管理器
  • 设备当前是否正在充电(因此电池目前并不重要)
  • 收音机当前处于活动状态吗

如果您的服务像alarm manager一样停止,则您执行的任何类型的“任务”都需要明确停止,但您应该仔细检查JobScheduler@loki是的,请在此阅读有关Firebase的更多信息JobDispatcher@MuratK. 我是否需要始终先执行alarmManager。然后再执行alarm。设置以确保其未挂起报警?@loki是的,我也是这样处理的。但当我读到它时,它说:对于保证在应用程序生命周期内发生的计时操作,相反,考虑使用句柄类与定时器和线程相结合。这种方法让Android更好地控制系统资源我完全同意你的看法,但如何做到这一切呢?有什么样的例子吗?看,我读了文件,但没有解释我应该做什么:(只是说你说什么(我已经知道了,这个问题的目的),我需要知道的是如何实现它:(如何使用alarmmanager通过网络高效地发送数据。例如,如果alam启动时没有网络连接,最好等待网络连接,但如何执行所有这些例如,只需简单地思考我是否需要通过RTC或RTC_唤醒设置警报(网络连接是否需要rct_wakup?)