更新后无法取消通知
Can't cancel a notification after updating it
我正在开发倒计时应用程序,目前正在尝试在倒计时 运行ning 期间退出应用程序时显示通知。相应地,我希望当用户 return 访问应用程序时通知消失。
到目前为止,我已经设法让它适用于带有静态文本的简单通知,请执行以下操作:在 MainActivity.java 中,在 onStop() 中,我创建了一个意图并使用 startService(意图)。对称地,在 onStart() 我 运行 stopService(intent) 这样当你 return 到应用程序时,服务就会被取消。这就像一个魅力,通知在必要时出现和消失。
下一步是尝试让通知显示不同的文本(它将显示“剩余 X 分钟”)。根据那里的信息,要更新现有通知,您必须创建一个新通知,为其提供与现有通知相同的 ID,然后调用 NotificationManager 的 .notify。当我这样做时,通知确实得到了正确更新(文本按预期更改),但是:现在,returning 到主 activity 不会取消通知。图标停留在那里,不会被打断。
我已经尝试解决这个问题好几个小时了。我也尝试过一些技巧,比如通过共享首选项发送信号来告诉服务停止,但出于某种原因,它似乎也完全忽略了命令 stopself()。
有没有人建议可能是什么原因?任何帮助将不胜感激。这是相关代码:
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();
}
}
可以通过多种方式处理,您还没有停止定时器
注意:- 在 Kotlin 中发布代码
1)
override fun onDestroy() {
counter.cancel()
}
- 在你的 activity
override fun onResume() {
super.onResume()
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancelAll()
}
首先像这样创建一个定时器
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);
我正在开发倒计时应用程序,目前正在尝试在倒计时 运行ning 期间退出应用程序时显示通知。相应地,我希望当用户 return 访问应用程序时通知消失。
到目前为止,我已经设法让它适用于带有静态文本的简单通知,请执行以下操作:在 MainActivity.java 中,在 onStop() 中,我创建了一个意图并使用 startService(意图)。对称地,在 onStart() 我 运行 stopService(intent) 这样当你 return 到应用程序时,服务就会被取消。这就像一个魅力,通知在必要时出现和消失。
下一步是尝试让通知显示不同的文本(它将显示“剩余 X 分钟”)。根据那里的信息,要更新现有通知,您必须创建一个新通知,为其提供与现有通知相同的 ID,然后调用 NotificationManager 的 .notify。当我这样做时,通知确实得到了正确更新(文本按预期更改),但是:现在,returning 到主 activity 不会取消通知。图标停留在那里,不会被打断。
我已经尝试解决这个问题好几个小时了。我也尝试过一些技巧,比如通过共享首选项发送信号来告诉服务停止,但出于某种原因,它似乎也完全忽略了命令 stopself()。
有没有人建议可能是什么原因?任何帮助将不胜感激。这是相关代码:
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();
}
}
可以通过多种方式处理,您还没有停止定时器
注意:- 在 Kotlin 中发布代码
1)
override fun onDestroy() {
counter.cancel()
}
- 在你的 activity
override fun onResume() { super.onResume() val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.cancelAll() }
首先像这样创建一个定时器
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);