java - 警报 setExact() 停止执行
问题描述
目前我在 Android 上的 alarmManager 有问题。
当我启动我的应用程序时,我调用方法“startReminderAlarm”。现在警报在即将到来的一小时和一分钟触发。警报触发 AppReceiver。AppReceiver 在接下来的一小时和一分钟内再次启动警报,然后在“doInBackground”方法中执行一些代码。
使用这种模式,AppReceiver 应该在每小时(第 1 分钟)准确地调用。但它似乎只适用于几个间隔。我昨天启动了警报,今天用adb shell dumpsys alarm检查了它。输出中没有提到警报?
我有以下情况:
- 我无法在模拟器中重现此问题
- 当我将警报更改为每分钟触发一次时,它似乎起作用了。
我的问题是:
- 我的代码有问题吗?
- 是否有一个日志文件,我可以在其中看到后台执行期间可能发生的异常?
我的代码:
// 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
}
}
}
解决方案
检查您的设备(或模拟器)版本的setExec()
方法。如果版本高于22,则应使用setExactAndAllowWhileIdle()
方法。
推荐阅读
- c++ - 在 QT 中使用 dll 文件
- python - 将 string.split() 作为参数传递给另一个函数时不起作用
- typescript - 在创建堆栈导航器之前如何导航到屏幕?
- sql - 使用计数选择最小值和最大值
- python - 在 Python 中实现表面模糊
- c - 有没有办法通过使用索引来迭代/递归二叉树?
- javascript - 如何在 Javascript HTML 文件中显示图像?
- java - 能够从 PDF 中删除页眉、页脚但同时删除页码 ex: 1/1 在此能够删除 1 但仍然 / 出现在文件的末尾
- python - 根据另一列更改列的值
- c# - asp.net framework 4.7配置日志级别,不工作