首页 > 解决方案 > 警报 setExact() 停止执行

问题描述

目前我在 Android 上的 alarmManager 有问题。

当我启动我的应用程序时,我调用方法“startReminderAlarm”。现在警报在即将到来的一小时和一分钟触发。警报触发 AppReceiver。AppReceiver 在接下来的一小时和一分钟内再次启动警报,然后在“doInBackground”方法中执行一些代码。

使用这种模式,AppReceiver 应该在每小时(第 1 分钟)准确地调用。但它似乎只适用于几个间隔。我昨天启动了警报,今天用adb shell dumpsys alarm检查了它。输出中没有提到警报?

我有以下情况:

  1. 我无法在模拟器中重现此问题
  2. 当我将警报更改为每分钟触发一次时,它似乎起作用了。

我的问题是:

  1. 我的代码有问题吗?
  2. 是否有一个日志文件,我可以在其中看到后台执行期间可能发生的异常?

我的代码:

// Class AlarmStarter
public static void startReminderAlarm(Context context){
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.add(Calendar.HOUR, 1);
    calendar.set(Calendar.MINUTE, 1);
    calendar.set(Calendar.SECOND, 0);
    Log.i(TAG,"Start reminder alarm on " +sdf.format(new Date(calendar.getTimeInMillis())));

    AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent reminderIntent = new Intent(context, AppReceiver.class);
    PendingIntent reminderPendingIntent = PendingIntent.getBroadcast(context, 0, reminderIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    alarmMgr.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), reminderPendingIntent);
}

// Class AppReceiver
public class AppReceiver extends BroadcastReceiver {

    private static final String TAG = "AppReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        AlarmStarter.startReminderAlarm(context);
        new notifyAsyncTask().execute(context);
    }

    private static class notifyAsyncTask extends AsyncTask<Context, Void, Void> {

        private String CHANNEL_ID = "1a2b3c4d";

        private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        @Override
        protected Void doInBackground(Context... params) {
            // DO SOME CODE
        }
    }
}

标签: javaandroidalarmmanager

解决方案


检查您的设备(或模拟器)版本的setExec()方法。如果版本高于22,则应使用setExactAndAllowWhileIdle()方法。


推荐阅读