【问题标题】:Alarmmanager not cancel after clicking notification单击通知后,Alarmmanager 不会取消
【发布时间】:2018-01-31 18:17:14
【问题描述】:

我正在开发一个带有警报管理器和服务的应用程序,在某些情况下我无法取消通知。我正在使用片段。

我的应用每隔“x”分钟发送两个通知。我有一个按钮来启动服务,另一个按钮来停止它。当我启动服务时,会触发通知,当我按下停止按钮时,它会正常工作。但是当我启动服务并退出应用程序时,通知会正常触发,但是当我单击通知时,应用程序会打开,然后我按下停止按钮,但通知不会停止,通知会继续被触发。

我调用alarmanager.cancel(pendingintent) 的函数在同一个片段中..(MainFragment.class 是第一个片段)。

MainFragment.class

    intent = new Intent(getContext(), TimeAlarm.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    intent.setAction(Long.toString(System.currentTimeMillis()));
    pendingIntent = PendingIntent.getBroadcast(mContext, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() + 15000,
                15000,
                pendingIntent);

    intent2 = new Intent(getContext(), TimeAlarm2.class);
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
    intent2.setAction(Long.toString(System.currentTimeMillis()));
    pendingIntent2 = PendingIntent.getBroadcast(getContext(), 1,
            intent2, PendingIntent.FLAG_UPDATE_CURRENT);

    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime() + 15000,
                        15000,
                        pendingIntent2);

TimeAlarm.class 扩展了 BroadcastReceiver

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.icon)
                .setContentTitle("...")
                .setContentText("...");

 Intent resultIntent = new Intent(context, MainActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);

        mBuilder.setAutoCancel(true);

        mBuilder.build().flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT;

        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());

TimeAlarm2.class 扩展了 BroadcastReceiver

NotificationCompat.Builder mBuilder2 = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.icon2)
                .setContentTitle("..")
                .setContentText("..");

        Intent resultIntent = new Intent(context, MainActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =
                stackBuilder.getPendingIntent(1, PendingIntent.FLAG_UPDATE_CURRENT);

        mBuilder2.setContentIntent(resultPendingIntent);

        mBuilder2.setAutoCancel(true);

        mBuilder2.build().flags |= Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT;
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(1, mBuilder2.build());

谢谢和最好的问候!

【问题讨论】:

  • 这可能会帮助您解决此问题,但我不确定。参考:stackoverflow.com/questions/36347187/…
  • @Sabari 谢谢,我通过混合代码解决了它。但是现在,问题是当我手动终止应用程序时。通知会继续触发,当我再次打开应用程序并按下停止按钮时,警报管理器不会被取消。
  • 你能完全分享停止按钮点击事件吗?
  • @Sabari 在 cancelAlarm() 函数中我只有 am.cancel(pendingIntent); am.cancel(pendingIntent2);而且 pendingIntent 是全局的,并且在 onCreate 方法中定义..
  • 你的代码对我来说有点混乱。你是在调用这个“am.setRepeating”并在“start”点击事件中初始化“pendingIntent”吗?

标签: java android notifications alarmmanager


【解决方案1】:

从两个意图中删除这些行,然后重试。

intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
intent2.setAction(Long.toString(System.currentTimeMillis()));

它对我有用

【讨论】:

    【解决方案2】:

    试试这个,如果错误来告诉我会发生什么。

    为此,您需要在停止按钮上销毁服务,然后在单击开始按钮时再次启动服务。

    【讨论】:

      【解决方案3】:

      好的。我可以建议您在 AlarmManager 上调用 cancel(),并使用与您使用 setRepeating() 方法相同的 PendingIntent。

      在这里您可以取消两个等效的pendingIntent。

      am.cancel(pendingIntent);
      

      am.cancel(pendingIntent2);
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多