gpt4 book ai didi

android - Android 无法取消重复闹钟

转载 作者:行者123 更新时间:2023-11-30 02:17:11 25 4
gpt4 key购买 nike

我已经阅读了所有关于 Android、AlarmManager 和取消的问题。

我目前使用 Activity 通过以下方式启动接收器:

long msInterval = 1;
Intent intent = new Intent(this, Updater.class);
intent.setAction("theAction");

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 12, intent, 0);
Updater.origin = pendingIntent;

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (msInterval), msInterval, pendingIntent);

这会在调用此代码后一毫秒启动接收器 Updater,请求代码为 12(任意选择,使用 0 会产生相同的错误行为)。它还将 Updater 的来源设置为当前计划的 PendingIntent,稍后用于取消警报。

更新器看起来像这样:

public class Updater extends BroadcastReceiver {

public static int flaggedClose = 0;
public static PendingIntent origin;

@Override
public void onReceive(Context context, Intent intent) {
// Do some work
Log.w("running", "run");

if (Updater.flaggedClose != 0) {
if(flaggedClose == 1) {
Toast.makeText(context, "Finished!", Toast.LENGTH_SHORT).show();
}
flaggedClose++; // Only show Toast once
Log.w("running", "close");

origin.cancel();
AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarms.cancel(origin);
}
}
}

目前它所做的只是记录消息“运行”,它完成了约 1000 次/秒。当调用 Activity 的 onStop() 时,Updater.flaggedClose 设置为 1。我可以在 Logcat 中看到这一点,因为它开始打印日志警告“关闭”。然而,警报仍然存在,因此所有其他记录的消息都“运行”并且其他所有消息都“关闭”。在最好的情况下,警报会在几秒钟后关闭。最坏的情况是我需要重启手机。在 AlarmManager 的描述中,它明确指出 close 关闭“任何类型的任何警报,其 Intent 与此警报匹配(由 filterEquals(Intent) 定义)将被取消”。为什么还有警报被触发?

最佳答案

正如 ci_ 在评论中提到的,有可能“在取消发生之前已经触发了那 100 个“额外”警报”。对于遇到同样问题的任何其他人,这里有一个解决方案。我测试了 AlarmManager,如果延迟至少 200 毫秒,它似乎效果最好。要降低延迟,请使用 Handler。使用处理程序的问题示例:

public class MainActivity extends Activity {

private boolean pressed = false;
private boolean done = false;
private Handler worker;
private Runnable method;
long msInterval = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

worker = new Handler();
method = getMethod();

Button toggle = (Button)(findViewById(R.id.toggle));
toggle.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if(!pressed) {
worker.post(method);
pressed = true;
} else {
done = true;
}
}
});
}

@Override
protected void onDestroy() {
super.onDestroy();
done = true;
}

private Runnable getMethod() {
return new Runnable() {
public void run() {
Log.w("running", "run");
if (done) {
Toast.makeText(getApplicationContext(), "Finished!", Toast.LENGTH_SHORT).show();
Log.w("running", "close");
} else {
worker.postDelayed(method, msInterval);
}
}
};
}
}

在第一次按下按钮时,处理程序启动 runnable,并且在每次调用时 runnable 调用自身。在第二次按下按钮时,条件 done 设置为 true,因此 runnable 在一轮(清理)后完成。

关于android - Android 无法取消重复闹钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com