web-dev-qa-db-ja.com

通知が却下されたかどうかを検出するにはどうすればよいですか?

Androidで、ユーザーが通知を左にスワイプして削除したことを検出する方法はありますか?アラームマネージャーを使用して繰り返しアラートを設定していますが、繰り返しアラートを停止する必要があります通知はユーザーによってキャンセルされます。私のコードは次のとおりです。

繰り返しアラートの設定:

_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)を呼び出す必要があることはわかっています。しかし、私はこのコードをどこに置くべきかわかりません。ユーザーが通知をタップまたは却下した場合にのみ、繰り返しアラートをキャンセルする必要があります。ご協力いただきありがとうございます!

24
NewGradDev

私は信じている - Notification.deleteIntent はあなたが探しているものです。ドキュメントによると:

[すべてクリア]ボタンを使用するか、個別にスワイプして通知をユーザーが明示的に却下したときに実行する意図。それらのいくつかは同時に送信されるため、これはおそらくアクティビティを開始するべきではありません。

19
André Oriani

そこにいるすべての将来の人々に-あなたは通知削除インテントを聞くために放送受信機を登録することができます。

新しいブロードキャストレシーバーを作成します:

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に気づいたでしょう。これは、通知の一意の文字列識別子です。通常、次の{namespace} {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
    );
}

登録された放送受信機は、通知が却下されたときにインテントを受信する必要があります。

1
masterwok

ブロードキャストレシーバーを作成して構成する必要がないため、却下を処理できるアクティビティがある場合は、アクティビティの保留中のインテントを使用することもできます。これは、実装が簡単な場合があります。

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エクストラを探すことができます。

0
Jim E-H