警报持续循环并发出 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 多个唤醒锁,即使在被取消后也是如此的主要内容,如果未能解决你的问题,请参考以下文章
检查表单中的多个 div,如果 div 没有指定的类,请发出警报并阻止提交