Android:AlarmManager每天午夜一次

时间:2016-12-21 21:47:29

标签: android alarmmanager repeatingalarm

我试图在每天结束时重复一次任务(23.59)这样做我想使用alarmmanager.setRepeating()。 在我的测试中,我想出了一些代码,我认为它会每秒重复一次任务,它可以工作,但不是每隔一秒就会重复一次任务,我不知道为什么,因此我不确定我会不会能够让它每天都有效。这是我的代码:

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);

我认为千片是在几毫秒之内?因此它应该是1s?

以下是我在日志中收到的消息:

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

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);

1 个答案:

答案 0 :(得分:2)

  

我认为千片是在几毫秒之内?因此它应该是1s?

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