0

已经回答了,有同样问题的朋友请参考本帖底部


我的应用程序上有这个部分,它安排了一个警报,一切正常,它正确地安排了警报,但是有一个不稳定的行为,有时,当安排的警报被触发时,它不是触发一次,而是触发了几次,我知道因为每次警报触发时,我都会在 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 声明你的接收者

4

0 回答 0