【问题标题】:Android alarm not cancellingAndroid警报未取消
【发布时间】:2015-06-13 18:10:15
【问题描述】:

我在主要活动中。有一个登录按钮bLogin。当按下它时,会显示一个 Logout 按钮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 永远不会显示。此外,在未设置闹钟时应用程序应完成的工作永远不会在按下 Logout 时完成。

我似乎无法弄清楚可能出了什么问题。 PendingIntents 在设置闹钟和取消闹钟时都是相同的。

【问题讨论】:

  • 我希望你看看这个stackoverflow.com/questions/14485368/…会更好
  • 我已经看到了。我没有看到我在那篇文章中错过了什么。你介意指出来吗?谢谢!
  • 您取消警报的代码看起来没问题。请注意,检查是否设置了警报的方法是不稳定的,如果您在 PendingIntent 上调用 cancel() 除了取消警报,它实际上只会返回 false。
  • @DanielNugent 那么,你知道做我想做的更好的方法吗?
  • @DanielNugent 我正在取消pendingIntent。那么取消闹钟是什么意思呢?谢谢!

标签: android android-intent alarmmanager android-pendingintent


【解决方案1】:

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

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

取消挂起的意图。我认为这与取消您的 AlarmManager 相同。虽然您可能需要更改检查闹钟设置方式的方式。

希望这会有所帮助。

【讨论】:

    【解决方案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();
    

    【讨论】:

    • 太棒了!!!与经理相比,取消未决意图是完美的解决方案。投了赞成票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多