2016-12-21 61 views
-1

我想在每天(23.59)结束时重复一个任务,我想使用alarmmanager.setRepeating()。 在我的测试中,我想出了一些代码,我认为它会每秒重复一个任务,但它的工作原理是,而不是每隔一秒重复执行一次任务,我不知道为什么,因此我不确定我将能够使其工作每一天。这里是我的代码:Android:AlarmManager每天午夜重复任务一次

public class RecurringTasks extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // add calculation logic here 
     Toast.makeText(context, "happening !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example 
    } 

    public void setRecurringTasks(Context context) 
    { 
     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, RecurringTasks.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pi); 
    } 

    public void cancelRecurringTasks(Context context) 
    { 
     Intent intent = new Intent(context, RecurringTasks.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 
} 

这是造成问题,我觉得行:

am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pi); 

我以为是毫秒1000?它应该是1秒?

这是我在日志中获取的信息:

D/DEBUG: im repeating 
E/EGL_emulation: tid 3322: eglSurfaceAttrib(1165): error 0x3009 (EGL_BAD_MATCH) 
W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0x9773e540, error=EGL_BAD_MATCH 
E/Surface: getSlotFromBufferLocked: unknown buffer: 0xb2c768a0 

SOLUTION

的Android不会让你重复一个任务在不到在一分钟这是为什么我的只是重复每分钟。要管理,使其每天重复在23.59.59我用下面的代码:

Calendar calendar = Calendar.getInstance(); 

     calendar.set(Calendar.HOUR_OF_DAY, 23); // For 1 PM or 2 PM 
     calendar.set(Calendar.MINUTE, 59); 
     calendar.set(Calendar.SECOND, 59); 

     AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i = new Intent(context, RecurringTasks.class); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
     am.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 
+0

您的意思是在23.59? –

+0

oups是啊,这就是我的意思 –

回答

2

我认为,1000年以毫秒为单位?它应该是1秒?

它是。不过,在Android 5.1及更高版本上,you cannot schedule a repeating task that frequently。如果你尝试,它会被四舍五入到一分钟。

+0

好的谢谢你,我应该在间隔时间使用,使其每天都发生?例如23.59? –

+0

offtop: @CommonsWare,如果不是你,你应该回答这样的问题:D –

+0

@Rémi:一天24小时。因此,请将您的间隔设置为24小时。 ['INTERVAL_DAY'](https://developer.android.com/reference/android/app/AlarmManager.html#INTERVAL_DAY)恰好是24小时内的毫秒数。为了让这项工作可能发生在特定的时间,使用'Calendar'对象设置为正确的开始日期/时间,而不是'System.currentTimeMillis()'。然后,意识到如果设备恰好处于打盹模式,那么您将无法在Android 6.0+上获得控制权。 – CommonsWare