web-dev-qa-db-ja.com

スワイプしてイベントを却下する

Android通知を使用して、サービスが終了したら(成功または失敗)ユーザーに警告します。プロセスが完了したら、ローカルファイルを削除します。

私の問題は、障害が発生した場合-ユーザーに「再試行」オプションを許可したいということです。そして、彼が再試行せずに通知を却下することを選択した場合、プロセスの目的で保存されたローカルファイル(イメージ...)を削除します。

通知のスワイプして却下するイベントをキャッチする方法はありますか?

79
Dror Fichman

DeleteIntent:DeleteIntentは、通知に関連付けることができるPendingIntentオブジェクトであり、通知が削除されると起動されます。

  • ユーザー固有のアクション
  • ユーザーすべての通知を削除します。

保留中のインテントをブロードキャストレシーバーに設定してから、必要なアクションを実行できます。

  Intent intent = new Intent(this, MyBroadcastReceiver.class);
  PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0);
  Builder builder = new Notification.Builder(this):
 ..... code for your notification
  builder.setDeleteIntent(pendingIntent);

MyBroadcastReceiver

public class MyBroadcastReceiver extends BroadcastReceiver {
      @Override
      public void onReceive(Context context, Intent intent) {
             .... code to handle cancel
         }

  }
137
Mr.Me

完全にフラッシュされた答え(答えをくれたミスター・ミーに感謝します):

1)破棄するスワイプイベントを処理するレシーバーを作成します。

public class NotificationDismissedReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
      int notificationId = intent.getExtras().getInt("com.my.app.notificationId");
      /* Your code to handle the event here */
  }
}

2)マニフェストにエントリを追加します。

<receiver
    Android:name="com.my.app.receiver.NotificationDismissedReceiver"
    Android:exported="false" >
</receiver>

3)保留中のインテントの一意のID(ここでは通知IDが使用されます)を使用して保留中のインテントを作成します。

private PendingIntent createOnDismissedIntent(Context context, int notificationId) {
    Intent intent = new Intent(context, NotificationDismissedReceiver.class);
    intent.putExtra("com.my.app.notificationId", notificationId);

    PendingIntent pendingIntent =
           PendingIntent.getBroadcast(context.getApplicationContext(), 
                                      notificationId, intent, 0);
    return pendingIntent;
}

4)通知を作成します。

Notification notification = new NotificationCompat.Builder(context)
              .setContentTitle("My App")
              .setContentText("hello world")
              .setWhen(notificationTime)
              .setDeleteIntent(createOnDismissedIntent(context, notificationId))
              .build();

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, notification);
79
Chris Knight

別のアイデア:

通常、通知を作成する場合は、そのうちの1つ、2つ、または3つのアクションも必要です。私は「NotifyManager」を作成しました。これは必要なすべての通知を作成し、すべてのIntent呼び出しも受信します。だから私はすべてのアクションを管理することができ、また一箇所で却下イベントをキャッチすることもできます。

public class NotifyPerformService extends IntentService {

@Inject NotificationManager notificationManager;

public NotifyPerformService() {
    super("NotifyService");
    ...//some Dagger stuff
}

@Override
public void onHandleIntent(Intent intent) {
    notificationManager.performNotifyCall(intent);
}

deleteIntentを作成するには、これを使用します(NotificationManager内):

private PendingIntent createOnDismissedIntent(Context context) {
    Intent          intent          = new Intent(context, NotifyPerformMailService.class).setAction("ACTION_NOTIFY_DELETED");
    PendingIntent   pendingIntent   = PendingIntent.getService(context, SOME_NOTIFY_DELETED_ID, intent, 0);

    return pendingIntent;
}

そして、私は次のように削除通知を設定するために使用します(NotificationManagerで):

private NotificationCompat.Builder setNotificationStandardValues(Context context, long when){
    String                          subText = "some string";
    NotificationCompat.Builder      builder = new NotificationCompat.Builder(context.getApplicationContext());


    builder
            .setLights(ContextUtils.getResourceColor(R.color.primary) , 1800, 3500) //Set the argb value that you would like the LED on the device to blink, as well as the rate
            .setAutoCancel(true)                                                    //Setting this flag will make it so the notification is automatically canceled when the user clicks it in the panel.
            .setWhen(when)                                                          //Set the time that the event occurred. Notifications in the panel are sorted by this time.
            .setVibrate(new long[]{1000, 1000})                                     //Set the vibration pattern to use.

            .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
            .setSmallIcon(R.drawable.ic_white_24dp)
            .setGroup(NOTIFY_GROUP)
            .setContentInfo(subText)
            .setDeleteIntent(createOnDismissedIntent(context))
    ;

    return builder;
}

最後に、同じNotificationManagerにperform関数があります。

public void performNotifyCall(Intent intent) {
    String  action  = intent.getAction();
    boolean success = false;

    if(action.equals(ACTION_DELETE)) {
        success = delete(...);
    }

    if(action.equals(ACTION_SHOW)) {
        success = showDetails(...);
    }

    if(action.equals("ACTION_NOTIFY_DELETED")) {
        success = true;
    }


    if(success == false){
        return;
    }

    //some cleaning stuff
}
0
HowardS