已经回答了,有同样问题的朋友请参考本帖底部
我的应用程序上有这个部分,它安排了一个警报,一切正常,它正确地安排了警报,但是有一个不稳定的行为,有时,当安排的警报被触发时,它不是触发一次,而是触发了几次,我知道因为每次警报触发时,我都会在 logcat 上显示“ALARM FIRED”,我的 logcat 上有几个 ALARM FIRED,有时多达 10 个,我感到困惑的是我只安排了一次警报,并且它触发了很多次。这是代码:
这是为了安排我的警报这是在以静态方式访问的Helper类上
public final static String ACTION = "com.medical.organizer.utilities.NotifyReciever";
private static NotifyReciever RECIEVER = new NotifyReciever();
public static void scheduleAlarm(Context context,String message,int rCode, long triggerTime)
{
RECIEVER = new NotifyReciever();
NotifyAlarm.TRIGGER_TIME = triggerTime;
NotifyAlarm.CONTEXT = context;
IntentFilter inFil = new IntentFilter(ACTION);
NotifyAlarm.CONTEXT.registerReceiver(RECIEVER, inFil);
Intent intent = new Intent(ACTION);
intent.putExtra("message", message);
NotifyAlarm.INTENT = intent;
NotifyAlarm.startAlarm(rCode);
}
public static void cancelAlarm(Context context, int requestCode)
{
RECIEVER = new NotifyReciever();
NotifyAlarm.CONTEXT = context;
IntentFilter inFil = new IntentFilter(ACTION);
NotifyAlarm.CONTEXT.registerReceiver(RECIEVER, inFil);
Intent intent = new Intent(ACTION);
NotifyAlarm.INTENT = intent;
//context.unregisterReceiver(RECIEVER);
NotifyAlarm.stopAlarm(requestCode);
}
这是为了警报本身
public class NotifyAlarm {
public static Context CONTEXT;
public static Intent INTENT;
public static long TRIGGER_TIME;
public static void startAlarm(int requestCode)
{
AlarmManager am = (AlarmManager) CONTEXT.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(CONTEXT, requestCode, INTENT, 0);
am.set(AlarmManager.RTC_WAKEUP, TRIGGER_TIME, pendingIntent);
Log.d("AlarmCheck", "Alarm Started for the First Time, set() was called");
}
public static void stopAlarm(int requestCode)
{
AlarmManager am = (AlarmManager) CONTEXT.getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(CONTEXT, requestCode, INTENT, 0);
am.cancel(pendingIntent);
Log.d("ALARMSTOP","========ALARM WAS STOPPED AT THIS POINT==========");
}
}
这是给我的报警接收器(广播接收器)的
public class NotifyReciever extends BroadcastReceiver {
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
Log.d("AlarmCheck","ALARM FIRED!");
AlertDialog.Builder build = new AlertDialog.Builder(context);
String message = intent.getStringExtra("message");
build.setMessage(message);
build.setCancelable(false);
build.setPositiveButton("Snooze", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//Rechedules the alarm after 25 secs time of interval is for
//testing purposes only
NotifyReciever.this.context.unregisterReceiver(NotifyReciever.this);
Helper.scheduleAlarm(NotifyReciever.this.context, s,
s.getRequestCode(),System.currentTimeMillis()+Helper.TWENTY_FIVE_SEC);
}
});
build.setNegativeButton("Dismiss", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//CANCELS THE ALARM
Helper.cancelAlarm(NotifyReciever.this.context, s.getRequestCode());
}
});
AlertDialog alert = build.create();
alert.show();
}
}
请注意,接收者不是通过 XML 声明的,而是以编程方式注册的,以便支持对话框。
考虑这种情况,这是我注意到行为总是发生的地方,比如说,我添加了一个时间表并安排了闹钟 @ 5:00am(当前时间是 4:59),所以起初它完全正常,然后我决定将该警报重新安排到 5:01(当前时间 5:00)然后发生这种情况,警报被触发了几次。alear 对话框多次出现,必须快速单击它们以取消对话框,有时我的应用程序由于显示的对话框过多而崩溃。
任何人都知道如何解决这个问题,请分享,任何人都知道如何正确安排和发出警报,请分享,以及安排和发出多个警报以及取消它们将不胜感激。解释和一些例子会更好。
编辑
图例:侧面的彩色点表示它在特定时间触发,这就是登录 logcat 的内容,例如在 4:00 触发的警报显示带有几个蓝点的警报
编辑这是答案
所以这就是我发现的,我的是你只需要注册你的接收器一次,所以为了避免intentFilter的多次返回,它使用你的动作匹配所有意图,在我的例子中,我已经一遍又一遍地注册了我的接收器再次,因此已经有许多具有相同 ACTION 的意图实例,因此返回多个接收器,是的,在指定时间发出多个警报,而不是只触发一个接收器,所以是的,如果您决定不这样做,您的接收器可能在全球级别时只注册一次用 XML 声明你的接收者