通知未被取消

时间:2016-09-20 11:09:18

标签: android android-notifications

在说什么之前,请先阅读整个问题。

以下是我创建通知的代码: -

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时都会更新。

即使多次调用该方法,我该怎么办才能取消通知?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我不知道为什么会发生这种情况,但您是否尝试过以下方法进行问题排查?

尝试将cancelAll()移至onPause()并查看其是否有效。

尝试在onDestory()

中再次获取对通知管理器的引用
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

尝试使用通知ID取消cancel(111111)

只是一个建议,您应该检查onDestory()中的notificationManager是否为null。如果通知从未显示,它将抛出一个空指针,之后的任何代码都将永远不会运行。

<强>更新

如果您的应用是APU 18或更高版本,您可以在尝试再次发布之前检查是否有任何有效通知:

getActiveNotifications()

答案 1 :(得分:0)

我有同样的症状。我的问题原来是我在传感器事件上调用了showNotification。这些事件触发了cancelAllonDestroy结尾之间的新通知。

我的解决方案是创建一个类范围的布尔stahp,并仅显示!stahp的通知。在致电stahp

之前,我将true设为cancelAll