警报持续循环并发出 7000 多个唤醒锁,即使在被取消后也是如此

Posted

技术标签:

【中文标题】警报持续循环并发出 7000 多个唤醒锁,即使在被取消后也是如此【英文标题】:Alarm Keep Looping And Making 7000+ Wakelocks, Even After Being Canceled 【发布时间】:2016-01-31 20:30:09 【问题描述】:

我正在对Alarm进行一些测试,我已经设置了一个基本的警报,带有SwitchPreference,当这个SwitchPreference被选中时,警报将打开并启动,当它取消选中时,它将取消警报。

我的问题是,启用后,它会产生多达 11K 的唤醒锁!我是怎么知道的?使用检测警报和唤醒锁的 Amplify 应用程序,取消后仍然相同,删除后唤醒锁返回 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;
        
    );

那么,它有什么问题?我比较了样品..它们之间没有什么奇怪的。 提前致谢!

【问题讨论】:

【参考方案1】:

您永远不会取消您调用的警报,它会永远保持工作状态 你可以做的是让 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;
    
);

【讨论】:

会测试它并返回给你。 警报不会再次自行重启,它只会发生一次。 Plus : 通过实例引用访问静态成员。

以上是关于警报持续循环并发出 7000 多个唤醒锁,即使在被取消后也是如此的主要内容,如果未能解决你的问题,请参考以下文章

从睡眠模式唤醒时不会播放音频(android)

每 10 秒获取一次 PARTIAL_WAKELOCK

检查表单中的多个 div,如果 div 没有指定的类,请发出警报并阻止提交

使多个线程循环输出0-99-0-99

是否需要为具有活动 LocationListener 的 Android 服务获取唤醒锁?

如何监视对 Azure 存储帐户防火墙规则所做的更改并发出警报