如何检测是否通知已经被开除?(How to detect if a notification has

2019-08-01 01:49发布

是否有任何Android的方式,当用户刷通知到左侧,并删除它来检测? 我使用的是alarmmanager设置重复的警报和我需要重复警报停止时通报用户取消。 这里是我的代码:

设置重复警报:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), repeatFrequency, displayIntent);

我的通知码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Get the notification ID.
    int notifID = getIntent().getExtras().getInt("Reminder_Primary_Key");

    //Get the name of the reminder.
    String reminderName = getIntent().getExtras().getString("Reminder_Name");

    //PendingIntent stores the Activity that should be launched when the user taps the notification.
    Intent i = new Intent(this, ViewLocalRemindersDetail.class);
    i.putExtra("NotifID", notifID);
    i.putExtra("notification_tap", true);

    //Add FLAG_ACTIVITY_NEW_TASK to stop the intent from being launched when the notification is triggered.
    PendingIntent displayIntent = PendingIntent.getActivity(this, notifID, i, Intent.FLAG_ACTIVITY_NEW_TASK);

    NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Notification notif = new Notification(R.drawable.flag_red_large, reminderName, System.currentTimeMillis());

    CharSequence from = "Here's your reminder:";

    CharSequence message = reminderName;        
    notif.setLatestEventInfo(this, from, message, displayIntent);

    //Pause for 100ms, vibrate for 250ms, pause for 100ms, and vibrate for 500ms.
    notif.defaults |= Notification.DEFAULT_SOUND;
    notif.vibrate = new long[] { 100, 250, 100, 500 };
    nm.notify(notifID, notif);

    //Destroy the activity/notification.
    finish();

}

我知道我需要调用alarmManager.cancel(displayIntent)以取消我重复报警。 不过,我不明白的地方把这个代码。 我需要取消重复警报,只有当用户已拍了拍通知或驳回。 谢谢你的帮助!

Answer 1:

我相信Notification.deleteIntent是你在找什么。 该医生说:

这样做的目的,执行时通报由用户明确驳回,要么用“全部清除”按钮或滑开独立。 这大概不应该发起一个活动,因为其中几个将在同一时间被发送。



Answer 2:

所有这些未来的人在那里 - 你可以注册一个广播接收器监听通知删除inents。

创建一个新的广播接收器:

public class NotificationBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (action == null || !action.equals(Config.NotificationDeleteAction)) {
            return;
        }

        // Do some sweet stuff
        int x = 1;
    }
}

注册您的应用程序类中的广播接收器:

“如果你的应用程序的目标API级别26或更高,则不能使用清单申报的大部分隐含广播(不专门针对您的应用程序广播)接收器。”

Android文档。

  registerReceiver(
        new NotificationBroadcastReceiver(),
        new IntentFilter(Config.NotificationDeleteAction)
  );

你可能注意到静态变量Config.NotificationDeleteAction。 这是您的通知的唯一字符串标识。 它通常遵循以下{命名空间} {} actionName约定:

you.application.namespace.NOTIFICATION_DELETE

设置您的通知建设者删除意图:

notificationBuilder
       ...
        .setDeleteIntent(createDeleteIntent())
       ...

其中,createDeleteIntent是下面的方法:

private PendingIntent createDeleteIntent() {
    Intent intent = new Intent();
    intent.setAction(Config.NotificationDeleteAction);

    return PendingIntent.getBroadcast(
            context,
            0,
            intent,
            PendingIntent.FLAG_ONE_SHOT
    );
}

当您的通知解雇你注册的广播接收器应该接收的意图。



Answer 3:

你也可以使用一个活动的PendingIntent,这可能是更简单的实现,如果你有一个可以处理解雇,因为你没有创建和配置的广播接收器的活动。

public static final String DELETE_TAG = "DELETE_TAG";

private PendingIntent createDeleteIntent(Context context) {
    Intent intent = new Intent(context, MyActivity.class);
    intent.putExtra(DELETE_TAG, true);

    return PendingIntent.getActivity(
            context,
            0,
            intent,
            PendingIntent.FLAG_ONE_SHOT
    );
}

MyActivity会收到意图在其的onCreate(),而在这个例子中,可以查找DELETE_TAG额外承认它。



文章来源: How to detect if a notification has been dismissed?