当前位置: 首页 > 知识库问答 >
问题:

更新通知后无法取消通知

慕学海
2023-03-14

我正在开发一个倒计时应用程序,目前正在尝试在倒计时运行时退出应用程序时显示通知。相应地,我希望在用户返回应用程序时通知消失。

到目前为止,我已经设法使它适用于带有静态文本的简单通知,执行以下操作:在MainActivity.java中,在onStop()中,我创建一个意图并使用start Service(意图)启动服务。对称地,在onStart()中,我运行stop Service(意图),以便当您返回应用程序时,服务被取消。这就像一个魅力,通知在必须时出现和消失。

下一步是尝试让通知显示一个不同的文本(它将显示“剩余X分钟”)。根据那里的信息,要更新现有通知,你必须创建一个新通知,给它与现有通知相同的ID,然后调用。通知通知经理。当我这样做时,通知确实得到了正确的更新(文本按预期更改),但是:现在,返回到主活动并不会取消通知。图标保持在上面,不会被打断。

我已经尝试了几个小时来解决这个问题。我还尝试了通过共享偏好发送信号来告诉服务停止等黑客攻击,但出于某种原因,它似乎也完全忽略了命令stop self()。

有人对原因有什么建议吗?任何帮助都将不胜感激。以下是相关代码:

MainActivity.java:

    @Override
protected void onStart() {
    super.onStart();

    Intent serviceIntent = new Intent(getBaseContext(), CounterService.class);
    stopService(serviceIntent);

}

protected void onStop() {
    super.onStop();
    Intent serviceIntent = new Intent(getBaseContext(), CounterService.class);
    startService(serviceIntent);

}

CounterService.java

public class CounterService extends Service {
Notification notification;
NotificationManager notificator;
Intent intentNoti;
CountDownTimer counter;
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

intentNoti = new Intent(this, MainActivity.class);
final PendingIntent pending = PendingIntent.getActivity(this, 0, intentNoti, 0);

final Bitmap icon = BitmapFactory.decodeResource(getResources(),
            R.drawable.common_full_open_on_phone);

//Countdown
counter = new CountDownTimer (30000, 1000) {

        public void onTick(long millisUntilFinished) {
           String time = String.valueOf(System.currentTimeMillis());

            notification = new Notification.Builder(CounterService.this)
                    .setContentTitle("Name")
                    .setContentText(time)
                    .setSmallIcon(R.drawable.icon_start)
                    .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                    .setContentIntent(pending)
                    .setOngoing(true).build();

            notificator = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificator.notify(1001, notification);


        }

        public void onFinish() {
        }

    }.start();
    return START_STICKY;
  }
 @Override
    public void onDestroy() {
        super.onDestroy();
        counter.cancel();
    }
}

共有2个答案

艾茂学
2023-03-14

首先创建一个这样的计时器

private Timer timer;
    private TimerTask timerTask;
    public void startTimer() {
        timer = new Timer();
        timerTask = new TimerTask() {
            public void run() {
                // Add your code
            }
        };
        timer.schedule(timerTask, 1000, 1000); //
    }

你还需要停止你的计时器。所以

 public void stoptimertask() {
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }

分别在OnStartCommand()和onDestroy()中调用StartTimer和StopTimer。在onDestroy()中添加这些行

Intent broadcastIntent = new Intent();
        broadcastIntent.setAction("restartservice");
        broadcastIntent.setClass(this, Restarter.class);
        this.sendBroadcast(broadcastIntent);
赫连永怡
2023-03-14

它可以用多种方式处理,你没有停止你的计时器

注:Kotlin中的过账代码

1)

override fun onDestroy() {
   counter.cancel()
}
override fun onResume() {
    super.onResume()
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
     notificationManager.cancelAll()
}
 类似资料:
  • 简介 除了 发送邮件 Laravel 还支持通过多种频道发送通知,包括邮件、短信 (通过 Nexmo), 以及 Slack。通知还能存到数据库,这样就能在网页界面上显示了。 通常情况下,通知应该是简短、有信息量的消息来通知用户你的应用发生了什么。举例来说,如果你在编写一个在线交易应用,你应该会通过邮件和短信频道来给用户发送一条 「账单已付」 的通知。 创建通知 Laravel 中一条通知就是一个类

  • 对用户发送通知时,如果配置了推送证书,将会产生推送,推送消息为通知内容,extras字段内容为通知的频道标识,如: { "extras":{"channel":"news:comment"} } 未读通知数量检查 通知列表 读取通知 标记通知阅读 标记所有通知已读 数据解析 未读通知数量检查 HEAD /user/notifications 本接口可用于消息分组显示的客户端,可以提前得到未

  • 通知API简介 设置通知URL 获取通知URL

  • 使用更新的Firebase cloud messaging和swizzling方法,当我的应用程序前景化时,我能够成功地在我的应用程序委托中的方法中接收有效负载。但是,我没有收到任何类型的有效负载,并且当我的应用程序处于后台时,不会被调用,尽管api响应消息已成功发送(见下文) 以下是我发送给FCM api的请求,以触发推送通知 有FCM的回复 这是我的appDelegate代码 我在我的应用程序

  • 问题内容: 如何禁用/取消已设置的通知? 这是我的日程安排功能。 问题答案: 要取消所有待处理的通知,可以使用以下方法: 要取消特定通知,

  • 有没有办法限制Firebase推送通知注册?不寻找主题。假设我有一个登录函数。我希望登录用户订阅推送通知。然后令牌可以被发送到服务器并存储。 在用户注销的同时,还应注销用户。 那么,目前是否有可用的机制?我查阅了Firebase API文档,但没有找到任何相关内容。 只是想知道我是否错过了什么。