如何每15分钟运行一次android功能,特别是每天15分钟的标记?

如何每15分钟运行一次android功能,特别是每天15分钟的标记?

问题描述:

这可能是一个重复的问题,但我仍然面临着这个问题,希望有一个解决方案。提前致谢。如何每15分钟运行一次android功能,特别是每天15分钟的标记?

如何设置闹钟管理器运行,以便每隔15分钟的时间间隔(例如每天8:00,8:15,8:30,8:45,9:00)专门执行该功能不管应用程序启动的时间如何。

举一个例子,假设我在7:47开始了我的应用程序主要活动,并且我希望闹钟在8:00开始,随后是8:15,8:30等。 。我应该怎么做?我真的很感激,如果任何提出了建议..

+0

我认为你需要设置两个报警管理器而不是一个。 – pooyan

+0

在Android 6.0及更高版本上这是不切实际的。打盹模式将阻止对时间的精确控制,除非用户将您的应用添加到电池优化白名单。我强烈建议你设计你的应用程序,以避免需要做任何后台工作,更不用说这种精确度。 – CommonsWare

+0

@CommonsWare,感谢您的评论,理解这对于Android平台的更高版本来说是不切实际的,但是我目前正在使用运行在Android 2.3上的专有设备,其中设备将依赖于电源模式,因此该应用将在顶级24×7因此需要有这么繁琐的工作,你对这种情况有什么建议吗? – XXX

你应该设置两路报警管理r.通过计算剩余时间到适当的时间(例如上午8:00),设置第一个触发时间。之后你应该在第一个闹钟管理器内创建另一个闹钟管理器,每15分钟触发一次。

的计算时间设定第一警报管理器使用波纹管代码:

Calendar c = Calendar.getInstance(); 
int m = calendar.get(Calendar.MINUTE); 
long start = System.currentTimeMillis(); 
int remain=0; 
if (m<15) 
{ 
remain = 15-m; 
} 
else if (m<30) 
{ 
remain = 30-m; 
} 
else if (m<45) 
{ 
remain = 45-m; 
} 
else 
{ 
remain = 60-m; 
} 
remain=start + remain*60*1000// convert it to milisecond and plus it to current time; 

编辑

之后,你可以使用代码波纹管设置第一报警经理:

AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, FirstReceiver.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    am.set(AlarmManager.RTC_WAKEUP,remain, pi); 

所以现在在你的FirstReceiver类中做类似下面的事情:

public class FirstReceiver extends BroadcastReceiver 
{ 
//do what ever you want + code bellow to setup second alarm manager 
Intent intent = new Intent(this, SecAlarm.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager am= (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime(), 
       15*60*60,pendingIntent); 
} 
+0

感谢您的建议,这听起来像一个可能的解决方案,你有这样的例子吗? – XXX

+0

我没有实现它,但如果你希望它更清晰,我可以带一些伪代码。 – pooyan

+0

@XXX我编辑我的答案,显示如何计算第一个闹钟时间。 – pooyan

最好设置一个闹钟要与一个天间隔

public void setAlarm(Context context) { 
    AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent i = new Intent(context, Alarm.class); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, yourTimeInMilisecond, 24 * 60 * 60 * 1000, pi); // Millisec * Second * Minute 
} 

这里yourTimeInMillisecond每次都是要设置闹钟,就像如果时间你要为明天上午9时报警,那么,这将是:

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 9); 
calendar.set(Calendar.MINUTE, 0);  
calendar.add(Calendar.DAY_OF_YEAR, 1); 
long yourTimeInMilisecond = calendar.getTimeInMillis(); 

希望它会为你工作:)

+0

感谢您的建议,但是,没有特定的时间来设置闹钟,我想在我的活动开始时执行该功能...所以如果我的活动在7:47开始,它仍然不是15分钟的标记然而,我只希望在8:00锐利时执行该函数。 – XXX

+0

@Neo使用'DateUtils.DAY_IN_MILLIS'将会更清洁,而不是自己计算以毫秒为单位的时间。 –

PendingIntent pendingIntent = PendingIntent.getBroadcast(
    this.getApplicationContext(), 234324243, intent, 0); 

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() 
    + (time limits), pendingIntent); 
+0

一些解释会很好。 –

+0

没有任何解释代码的功能,或者提出这种方法的任何理由,这个答案是没有用的。接下来会发生的是,该人员将复制并粘贴代码并遇到问题,因为您没有提供任何解释。但这是你的第一个答案,所以请看[让你的答案很棒的一些技巧](http://stackoverflow.com/help/how-to-answer)。 – ishmaelMakitla