我已经阅读了有关 Android、AlarmManager 和取消的所有问题。
我目前通过以下方式使用Activity
启动接收器:
long msInterval = 1;
Intent intent = new Intent(this, Updater.class);
intent.setAction("theAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12, intent, 0);
Updater.origin = pendingIntent;
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (msInterval), msInterval, pendingIntent);
这会在调用此代码一毫秒后启动接收器Updater
,请求代码为 12(任意选择,使用 0 会产生相同的错误行为)。它还将 Updater 的来源设置为当前调度的 PendingIntent,稍后用于取消警报。
更新程序如下所示:
public class Updater extends BroadcastReceiver {
public static int flaggedClose = 0;
public static PendingIntent origin;
@Override
public void onReceive(Context context, Intent intent) {
// Do some work
Log.w("running", "run");
if (Updater.flaggedClose != 0) {
if(flaggedClose == 1) {
Toast.makeText(context, "Finished!", Toast.LENGTH_SHORT).show();
}
flaggedClose++; // Only show Toast once
Log.w("running", "close");
origin.cancel();
AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarms.cancel(origin);
}
}
}
它目前所做的只是记录消息“运行”,它完成了约 1000 次/秒。当onStop()
调用 Activity 时,Updater.flaggedClose
设置为1
. 我可以在 Logcat 中看到这一点,因为它开始打印日志警告“关闭”。但是,警报仍然存在,因此所有其他记录的消息都是“运行”,而其他所有消息都是“关闭”。在最好的情况下,警报会在几秒钟后关闭。最坏的情况我需要重新启动手机。在 AlarmManager 的描述中,它特别指出 close 关闭“任何类型的警报,其 Intent 与此匹配(由 filterEquals(Intent) 定义),将被取消”。为什么还会触发警报?