2016-02-28 47 views
0

我创建了一项服务,可以在一天中的特定时间和每天(例如上午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-会发生什么,如果我用同样PARAMS和数据称为上面相同的功能,将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> 

回答

0

来到你所有的问题: -

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

    答:要取消您创建的AlarmService,您需要像这样取消它。

    this.getAlarmManager().cancel(pendingIntent);

其中this是服务从你叫AlarmService地方(或活动/上下文)。

  • 什么用这条线的 calendar.setTimeInMillis(System.currentTimeMillis());
  • 那么如果你知道的方法Date.setTime(),其产生在设置有毫秒Date对象的论据。 Calender.setTimeInMillis()对于日历对象也是如此。 System.currentTimeMillis()用于提供当前时间与UTC,1970年1月1日午夜之间以毫秒为单位的差值。 (我猜你知道整个时间戳概念)

    3.如果我用相同的参数和数据调用上面的相同函数,AlarmMananger会覆盖我的请求或将注册一个新的请求,时间到了(上午6点),它会打电话给我的服务两次?

    正如documentation所示,如果已经为同一个IntentSender安排了一个闹钟,则先前的闹钟将首先被取消。

    4.如果AlarmMananger已成功注册我的意图,可以检查AlarmMananger吗?

    我认为这是可能的,但没有这种方法直接检查它,你需要做的破解。我想你会发现this答案合适。

    我希望这可以帮助您:)

    0

    可以使用的if else功能寄存器,并从AlarmManager注销。 例如checkBox isSelectted()或不。

    calendar.setTimeInMillis(System.currentTimeMillis());

    此行将以毫秒为单位返回系统时间。这种格式是这样的“2547889955511”

    是的,如果你可以完美设置AlarmManager你的未决意图可以调用你的服务两次。

    是的,你必须设置完美,那么它可以检查AlarmMananger它是否成功地注册了你的意图。

    +0

    感谢所有这些问题的答案,但这里有一个问题,我说上面,我在下午6点AlertMananager想每天要打电话给我的接收器的编辑,但是,这并不甚至发生一次,代码中出了什么问题?知道我添加了SET_ALARM权限,并且我的接收者没有被调用相同的结果。 – Jack

    +0

    您是否将输入数据保存在任何数据存储中?如果没有,然后保存。保存与通话AlarmManager的保存时间和系统时间比较后 –

    相关问题