在说什么之前,请先阅读整个问题。
以下是我创建通知的代码: -
public void showNotification(String Name, String Rate, int Image_Source, int PandP, int Repeat) {
remoteview = new RemoteViews(getPackageName(), R.layout.notification_layout);
context = this;
pi = PendingIntent.getActivity(context, 0, new Intent(this, SongsListActivity.class), 0);
P_and_P_I = new Intent("P_and_P_Clicked");
R_I = new Intent("R_Clicked");
N_I = new Intent("N_Clicked");
P_I = new Intent("P_Clicked");
P_and_P_PI = PendingIntent.getBroadcast(context, 1, P_and_P_I, 0);
R_PI = PendingIntent.getBroadcast(context, 2, R_I, 0);
N_PI = PendingIntent.getBroadcast(context, 3, N_I, 0);
P_PI = PendingIntent.getBroadcast(context, 4, P_I, 0);
notification = new NotificationCompat.Builder(this)
.setContent(remoteview)
.setPriority(2)
.setOngoing(true)
.setTicker(NameD.getText())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(NameD.getText())
.setContentText(RateD.getText())
.setContentIntent(pi)
.setAutoCancel(false)
.setCustomBigContentView(remoteview)
.build();
remoteview.setOnClickPendingIntent(R.id.P_and_P_N, P_and_P_PI);
remoteview.setOnClickPendingIntent(R.id.Repeat_N, R_PI);
remoteview.setOnClickPendingIntent(R.id.Next_N, N_PI);
remoteview.setOnClickPendingIntent(R.id.Previous_N, P_PI);
remoteview.setImageViewResource(R.id.Repeat_N, Repeat);
remoteview.setImageViewResource(R.id.P_and_P_N, PandP);
remoteview.setTextViewText(R.id.Name_N, Name);
remoteview.setTextViewText(R.id.Rate_N, Rate);
remoteview.setImageViewResource(R.id.Image_N, Image_Source);
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(111111, notification);
}
我尝试通过调用此方法取消通知: -
@Override
protected void onDestroy() {
super.onDestroy();
notificationManager.cancelAll();
if(mediaplayer != null)
{
mediaplayer.release();
mediaplayer = null;
mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
}
}
我在代码中多次使用此showNotification。 我确信正在调用onDestroy。
在开始时,当showNotification仅被调用一次,然后如果应用程序被销毁,通知被取消,但是当showNotification被多次调用,甚至两次,然后在销毁时该应用程序,它不会被取消。
所有变量在所有方法的整个程序中都是公开的。
是的,他们只显示了一个通知,每次调用showNotification时都会更新。
即使多次调用该方法,我该怎么办才能取消通知?
提前致谢。
答案 0 :(得分:1)
我不知道为什么会发生这种情况,但您是否尝试过以下方法进行问题排查?
尝试将cancelAll()
移至onPause()
并查看其是否有效。
尝试在onDestory()
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
尝试使用通知ID取消cancel(111111)
只是一个建议,您应该检查onDestory()中的notificationManager是否为null。如果通知从未显示,它将抛出一个空指针,之后的任何代码都将永远不会运行。
<强>更新强>
如果您的应用是APU 18或更高版本,您可以在尝试再次发布之前检查是否有任何有效通知:
答案 1 :(得分:0)
我有同样的症状。我的问题原来是我在传感器事件上调用了showNotification
。这些事件触发了cancelAll
与onDestroy
结尾之间的新通知。
我的解决方案是创建一个类范围的布尔stahp
,并仅显示!stahp
的通知。在致电stahp
true
设为cancelAll