AlarmManager没有按预定时间触发?

时间:2018-06-08 12:23:04

标签: android android-broadcastreceiver

我在我的android应用程序中实现了alarManager。此重复计划报警时间为5秒。但是一分钟后不再重复5秒钟。

AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

intent.putExtra(Constants.Extra.SERVICE_TYPE, Constants.Extra.SERVICE_TRIGGER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 123456789, intent, 0);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5000, pendingIntent);

接收器类

@Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if(extras != null){
            String type = extras.getString(Constants.Extra.SERVICE_TYPE);

            if(type != null && type.equalsIgnoreCase(Constants.Extra.SERVICE_TRIGGER)){

                //Triger  

            }
        }
    }

manifest.xml文件

<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<!-- Receivers -->
<receiver android:name=".receiver.ServiceTrigger">
    <intent-filter>
        <action android:name="com.project.ServiceTrigger" />
    </intent-filter>
</receiver>

3 个答案:

答案 0 :(得分:1)

它对我有用

使用此

 alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),
            pendingIntent);

而不是

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5000, pendingIntent);

让我知道它是否适合你

答案 1 :(得分:1)

从Android 5.1(API版本22)开始,重复警报的最短时间为1分钟。如果您需要在一分钟内完成工作,只需直接设置闹钟,然后从该闹钟的处理程序中设置下一个闹钟等。如果您需要在5秒钟内完成工作(例如),请将其发布到处理程序而不是使用AlarmManager。

这里有好的文件:

https://en.proft.me/2017/05/7/scheduling-operations-alarmmanager-android/

答案 2 :(得分:1)

AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
int ALARM_TYPE = AlarmManager.RTC_WAKEUP;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    am.setExactAndAllowWhileIdle(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    am.setExact(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);
else
    am.set(ALARM_TYPE, calendar.getTimeInMillis(), pendingIntent);