Android 警报持续循环并发出7000+;唤醒锁定,即使在被取消之后

Android 警报持续循环并发出7000+;唤醒锁定,即使在被取消之后,android,alarm,android-alarms,Android,Alarm,Android Alarms,我正在做一些警报测试,我已经设置了一个基本警报,带有SwitchPreference,当选中此SwitchPreference时,警报将打开并启动,当取消选中时,它将取消警报 我的问题是,启用时,它最多可组成11K个唤醒锁!我怎么知道的?使用检测报警和唤醒锁的放大应用程序,在被取消后仍然相同,删除后唤醒锁返回1K 我不知道为什么,但我觉得它在循环?还是我做错了什么 这是报警代码: public void SetAlarm(Context context) { AlarmManag

我正在做一些警报测试,我已经设置了一个基本警报,带有SwitchPreference,当选中此SwitchPreference时,警报将打开并启动,当取消选中时,它将取消警报

我的问题是,启用时,它最多可组成11K个唤醒锁!我怎么知道的?使用检测报警和唤醒锁的放大应用程序,在被取消后仍然相同,删除后唤醒锁返回1K

我不知道为什么,但我觉得它在循环?还是我做错了什么

这是报警代码:

    public void SetAlarm(Context context)
{
    AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000 * 60 * 2, pi);
}

public void CancelAlarm(Context context)
{
    Intent intent = new Intent(context, Alarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}
这就是我启用/禁用它的方式:

        SwitchTest.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
        @SuppressLint("CommitPrefEdits")
        @Override
        public boolean onPreferenceChange(Preference preference,
                                          Object newvalue) {
            boolean Switched = ((SwitchPreference) preference)
                    .isChecked();

            if (Switched) {
                Alarm alarm2 = new Alarm();
                alarm2.SetAlarm(getActivity());
            } else {
                Alarm alarm = new Alarm();
                alarm.CancelAlarm(getActivity());
            }
            return true;
        }
    });
那么,这有什么不对呢?我已经和样品做了比较。。他们之间没什么奇怪的。
提前谢谢

您从未取消您调用的警报,它将永远工作 您可以做的是使setAlaram()方法返回挂起的意图,并在需要时取消它

 public PendingIntent SetAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000 * 60 * 2, pi);

return pi;
}
以及您启用/禁用它的位置更改为

 SwitchTest.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @SuppressLint("CommitPrefEdits")
    @Override
    public boolean onPreferenceChange(Preference preference,
                                      Object newvalue) {
        boolean Switched = ((SwitchPreference) preference)
                .isChecked();
          Alarm alarm = new Alarm();
        if (Switched) {
            alarm.SetAlarm(getActivity());
        } else {
             alarm.SetAlarm(getActivity()).cancel();
        }
        return true;
    }
});

您永远不会取消您调用的警报,它将永远工作 您可以做的是使setAlaram()方法返回挂起的意图,并在需要时取消它

 public PendingIntent SetAlarm(Context context)
{
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000 * 60 * 2, pi);

return pi;
}
以及您启用/禁用它的位置更改为

 SwitchTest.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    @SuppressLint("CommitPrefEdits")
    @Override
    public boolean onPreferenceChange(Preference preference,
                                      Object newvalue) {
        boolean Switched = ((SwitchPreference) preference)
                .isChecked();
          Alarm alarm = new Alarm();
        if (Switched) {
            alarm.SetAlarm(getActivity());
        } else {
             alarm.SetAlarm(getActivity()).cancel();
        }
        return true;
    }
});

将对其进行测试并返回给您。报警不会再次重新启动,只会发生一次。另外:静态成员通过实例引用访问。将对其进行测试并返回给您。报警不会再次重新启动,只会发生一次。另外:静态成员通过实例引用访问。