如何在一天中的特定时间定期启动我的服务

时间:2016-02-28 02:35:40

标签: android

我创建了一项服务,可以在一天中的特定时间和每天(例如上午6点)检查一些在线数据,而不是使用后台运行服务和广播接收器,我决定使用AlarmMananger和下面的代码:

Intent myIntent =  new Intent(MainActivity.this, MyAlarmService.class);
pendingIntent = PendingIntent.getService(MainActivity.this, 0, myIntent, 0);
AlarmManager alarmManager =  (AlarmManager)getSystemService(ALARM_SERVICE);

  Calendar calendar = Calendar.getInstance();
  calendar.setTimeInMillis(System.currentTimeMillis());
 calendar.set(Calendar.HOUR_OF_DAY, 6);
   calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
   alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

我的问题是:

1-当用户决定取消激活我的服务时,如何从AlarmManager取消注册?

2-这条线的用途是什么

calendar.setTimeInMillis(System.currentTimeMillis());

3-如果我使用相同的参数和数据调用上述相同的函数会发生什么情况,AlarmMananger会覆盖我的请求,或者它会注册一个新的请求,当时间到来(早上6点)它会调用我的服务两次?

4-是否可以检查AlarmMananger是否已成功注册我的意图?

修改1:

下面的代码没有触发我的广播接收器,为什么?

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 6); // For 6 AM
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, mybroadcastreceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);

的AndroidManifest.xml

    <receiver
        android:name=".mybroadcastreceiver"
        android:enabled="true"
        android:exported="true"></receiver>

2 个答案:

答案 0 :(得分:0)

您可以使用if else函数进行注册并从Al​​armManager取消注册。 例如,checkBox isSelectted()与否。

calendar.setTimeInMillis(System.currentTimeMillis的());

此行将以毫秒格式返回系统时间。这种格式是这样的&#34; 2547889955511&#34;

是的,如果您可以完美地设置AlarmManager,您的待定意图可以两次调用您的服务。

是的,您必须完美设置然后才能检查AlarmMananger是否成功注册了您的意图。

答案 1 :(得分:0)

提出所有问题: -

  1. 当用户决定取消激活我的服务时,如何从AlarmManager取消注册?

    答案: - 要取消您创建的AlarmService,您需要取消它。

    this.getAlarmManager().cancel(pendingIntent);

  2. 其中this是您调用AlarmService的服务(或Activity / Context)。

    1. 这条线的用途是什么 calendar.setTimeInMillis(System.currentTimeMillis());
    2. 如果你知道方法Date.setTime(),它会生成Date对象,并在参数中提供毫秒数。 Calender.setTimeInMillis()对Calender对象执行相同操作。 System.currentTimeMillis()用于提供当前时间与UTC时间1970年1月1日午夜之间的差异(以毫秒为单位)。 (我猜你知道整个Timestamp的概念)

      第3。如果我使用相同的参数和数据调用上面的相同函数会发生什么情况,AlarmMananger会覆盖我的请求还是会注册一个新的请求,当时间到来(早上6点)它会调用我的服务两次?

      正如documentation所说,如果已经为同一个IntentSender安排了警报,那么之前的警报将首先被取消。

      <强> 4。是否可以检查AlarmMananger是否已成功注册我的意图?

      我认为这是可能的,但是没有这样的方法直接检查它,你需要做黑客攻击。我想你会发现this回答合适。

      我希望这可以帮助你:)