取消其他活动的通知 - Android

时间:2016-10-20 21:38:35

标签: android notifications android-pendingintent

单击按钮时,我会在状态栏中创建通知。

通过单击,此通知会创建一个活动。

在此活动的布局中,有一个按钮。

单击此按钮时,必须取消创建按钮所在活动的通知。

问题来了,因为我可以创建多个通知,为它们提供不同的ID。

但是当我打开状态栏时,我会看到通知,我选择一个,活动已创建,我点击按钮取消活动。

所发生的情况是取消的通知始终是最后创建的,而不是我选择的通知。

这是主要活动的代码,其中创建了通知:

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.ButtonBarLayout;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class NotifMenuActiv extends AppCompatActivity {

private Button but_notif, but_cancel;
private NotificationManager mNotificationManager;
private Notification.Builder mBuilder;
private EditText id;
private Intent resultIntent;
private PendingIntent pIntent;
private int req_code = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notif_menu);
    mNotificationManager = (NotificationManager)getSystemService(Context
            .NOTIFICATION_SERVICE);
    mBuilder = new Notification.Builder(this);
    mBuilder.setSmallIcon(R.drawable.joda);
    resultIntent = new Intent(this, NotifActiv.class);
    id = (EditText)findViewById(R.id.id);
    but_notif = (Button)findViewById(R.id.but_notif);
    but_notif.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                resultIntent.putExtra("id", Integer.valueOf(id.getText().
                        toString()));
                pIntent = PendingIntent.getActivity(getApplicationContext(),
                        req_code++, resultIntent, PendingIntent
                                .FLAG_UPDATE_CURRENT);
                mBuilder.setContentIntent(pIntent);
                mBuilder.setContentTitle(id.getText().toString());
                mNotificationManager.notify(Integer.valueOf(id.getText().
                        toString()),mBuilder.build());
                mBuilder.setContentText(Integer.valueOf(mNotificationManager
                        .getActiveNotifications().length).toString());
                mNotificationManager.notify(Integer.valueOf(id.getText().
                        toString()),mBuilder.build());

            }
        }
    });
    but_cancel = (Button)findViewById(R.id.but_cancel1);
    but_cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mNotificationManager.cancel(Integer.valueOf(id.getText().
                    toString()));
        }
    });
}
}

这是我点击通知时创建的活动中的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notif);
    Intent intent = getIntent();
    id = intent.getIntExtra("id",id);
    mNotificationManager = (NotificationManager)getSystemService(Context
            .NOTIFICATION_SERVICE);
    but_exit = (Button)findViewById(R.id.but_exit);
    but_exit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            finish();
        }
    });

// This is the button that must cancel the notification that created 
// the activity
    but_cancel = (Button)findViewById(R.id.but_cancel2);

    but_cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mNotificationManager.cancel(id);
        }
    });
}

非常感谢。

1 个答案:

答案 0 :(得分:1)

解决!!!解决方案是为每个PedingIntent提供不同的requestCode。

而不是:

PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(),0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

这样做:

PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(),req_code++, resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);