Android闹钟无法取消

时间:2015-06-13 18:10:16

标签: android android-intent alarmmanager android-pendingintent

我在主要活动中。有一个登录按钮bLogin。按下该按钮后,将显示注销按钮bLogout。两个按钮的onClick方法如下:

bLogin.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        llLogin.setVisibility(View.GONE);
        llLogout.setVisibility(View.VISIBLE);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 327,
            new Intent(getApplicationContext(), AlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval, pendingIntent);
    }
});

bLogout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        llLogout.setVisibility(View.GONE);
        llLogin.setVisibility(View.VISIBLE);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 327,
            new Intent(getApplicationContext(), AlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        manager.cancel(pendingIntent);

        boolean alarmUp = (PendingIntent.getBroadcast(getApplicationContext(), 327,
            new Intent(getApplicationContext(), AlarmReceiver.class), PendingIntent.FLAG_NO_CREATE) != null);
        if(!alarmUp){
            Toast.makeText(getBaseContext(), "up", Toast.LENGTH_SHORT).show();
        }
    }
});

从上面的代码中可以看出,当按下bLogin时,我设置闹钟,按下bLogout后,我取消闹钟。

alarmUp用于检查是否设置了警报。但问题是警报永远不会被取消,因为最后的Toast永远不会显示。此外,在未设置警报时应用程序应该完成的工作永远不会在按注销时完成。

我似乎无法弄清楚可能出现的问题。设置闹钟和取消闹钟时,PendingIntent都是相同的。

2 个答案:

答案 0 :(得分:2)

不知道您的代码有什么问题,但如果您想取消待处理的意图,可以使用

PendingIntent.getBroadcast(getActivity(), 327, pendingIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT).cancel();

取消待处理的意图。我认为取消你的AlarmManager会有同样的想法。虽然您可能需要更改检查警报设置方式的方式。

希望这有帮助。

答案 1 :(得分:2)

您不能取消PendingIntent。当你打电话

manager.cancel(pendingIntent) 
你正在取消闹钟。这并不取消PendingIntentPendingIntent仍然存在。所以,当你打电话

boolean alarmUp = (PendingIntent.getBroadcast(getApplicationContext(), 327,
        new Intent(getApplicationContext(), AlarmReceiver.class),
        PendingIntent.FLAG_NO_CREATE) != null);

PendingIntent仍然存在,因此PendingIntent.getBroadcast()将返回非空值。结果。 alarmUp始终为true

取消闹钟后,您需要取消PendingIntent,如下所示:

pendingIntent.cancel();