2012-01-11 47 views
0

我开始寻找在每个小时的时间正好重复的开始IntentService(下午1:00,下午2:00,下午3:00,等等) 。正是在小时开始启动服务,重复每隔一小时之后

说完看了看文件,我相信使用AlarmManager做,这是最好的做法。

我有一个BootReceiver将开始第一个实例,并在下面的应用我onHandleIntent任务已经重复(例如振动下)之后的下一个闹钟设置。我的问题是我无法设置闹钟在接下来的一个小时的顶上去了,我怎么会去吗?

为了测试我有报警器响了每3分钟在下面的代码

public class TimingAndControl extends IntentService 
{ public TimingAndControl() 
{ 
super(TimingAndControl.class.getSimpleName()); 
} 

@Override 
protected void onHandleIntent(Intent intent) 
{ 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK |  PowerManager.ACQUIRE_CAUSES_WAKEUP, "VibrateTag"); 
    wakeLock.acquire(); 

    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

    v.vibrate(300); 

    NextAlarm(); 
} 

private void NextAlarm() 
{ 
Intent intent = new Intent(this, this.getClass()); 
PendingIntent pendingIntent = 
    PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

// The update frequency should often be user configurable. This is not. 

long currentTimeMillis = System.currentTimeMillis(); 
long nextUpdateTimeMillis = currentTimeMillis + 3 * (60 * 1000); 
Time nextUpdateTime = new Time(); 
nextUpdateTime.set(nextUpdateTimeMillis); 

if (nextUpdateTime.hour < 6 || nextUpdateTime.hour >= 18) 
{ 
    nextUpdateTime.hour = 8; 
    nextUpdateTime.minute = 0; 
    nextUpdateTime.second = 0; 
    nextUpdateTimeMillis = nextUpdateTime.toMillis(false) + DateUtils.DAY_IN_MILLIS; 
} 
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent); 
} 
@Override 
public void onCreate(){ 
    Toast.makeText(this, "service starting", (10 * 1000)).show(); 
    super.onCreate(); 

} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "service stopping", (10 * 1000)).show(); 
    super.onDestroy(); 
} 



} 

回答

0

我的问题是,我无法设置闹钟在下一个小时的顶部关闭,我该怎么办呢?

当计算下一个小时的顶部,然后将其用作上AlarmManager的第二个参数setRepeating()

+0

服务需要在每个小时的顶部完全触发,我是否能够通过这样做来保持我需要的准确性。此外,我怎么会去计算时间时的下一个顶部是的,我会是最好的送行发言权12:00 PM设置一个报警,并从那里重复报警?抱歉,我发现AlarmManager很难与 – user1001160 2012-01-11 13:08:47

+0

@ user1001160握手:“我能否通过这样做来保持我需要的准确性” - 如果您使用“RTC_WAKEUP”或“ELAPSED_REALTIME_WAKEUP”,它会相当准确'。话虽这么说,Android是不是一个RTOS和时钟漂移等。“此外,我将如何去计算何时小时的下一个顶部是” - 使用'java.util.Calendar',因为这是普通的Java,没什么Android独有。 “我会最好在下午12点设置下一个闹钟,并从那里重复闹钟?” - 我肯定会在这个场景中使用'setRepeating()'。 – CommonsWare 2012-01-11 13:40:12

+0

太好了,我想我已经想通了。感谢您的帮助! – user1001160 2012-01-11 16:30:32

0

你试过RTC_WAKEUP,RTC标志将触发报警装置从休眠状态唤醒之后。

0

你可以找到一个小时的UTC毫秒时间,这样的代码(未测试)

public static final long utcMillisNextHour() { 
    Time t = new Time(); 
    t.setToNow(); 
    t.hour++; 
    t.minute = 0; 
    t.second = 0; 
    return t.normalize(true); 
} 

然后你可以使用setReapting之一..()AlarmManager随着时间类型的方法接受UTC时间和INTERVAL_HOUR时间间隔。如果您发送的意图是固定的,不会因多次调用而造成伤害,因为每个setRepeating()都会删除前一个。

相关问题