Нужно отклонить уведомление при нажатии, когда приложение находится на переднем плане - Android - PullRequest
0 голосов
/ 20 июня 2019

Я тестирую push-уведомление с моим приложением.

когда приложение на переднем плане:

Step 1. Received the notification (in system tray). 
     2. now, I'm in some other screen than the home screen.
     3. Actual Problem: On tap on the notification, it is going to the home screen.
     4. Expected: If the app is in the foreground, just I need to cancel on tap of the notification. (No need to swipe.)

когда приложение в фоновом режиме / убито: (работает хорошо)

Step 1. Received the notification (in the system tray)
     2. On tap, open the home screen of the app.

Пробовал с установкой флагов режима запуска в намерении. Не помогло. Ниже мой код. Пожалуйста, предложите решение, ребята.

    Intent resultIntent = new Intent(this, MainActivity.class);
    //resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    // resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK);

    PendingIntent resultPendingIntent =
            PendingIntent.getActivity(
                    this,
                    0,
                    resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );


    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this);

    mBuilder.setContentIntent(resultPendingIntent);
    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle(title);
    mBuilder.setContentText(body);
    mBuilder.setAutoCancel(true);
    mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(body));
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        mBuilder.setChannelId(TestUtils.creatChanel(this).getId());
    }

    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(642, mBuilder.build());

Ответы [ 4 ]

1 голос
/ 20 июня 2019

Вы можете создать пользовательское уведомление с кнопкой закрытия, чтобы закрыть уведомление, используя RemoteViews

// создать уведомление с RemoteViews:

RemoteViews remoteViews= new RemoteViews(getApplicationContext().getPackageName(), R.layout.your_custom_notification);
Intent closeIntent = new Intent(context, CloseNotificationService.class);
hangUpIntent.setAction("close");

PendingIntent pendingCloseIntent = PendingIntent.getBroadcast(this, 0, closeNotification, PendingIntent.FLAG_UPDATE_CURRENT);

remoteViews.setOnClickPendingIntent(R.id.cancel_notification, pendingCloseIntent);

// create notification here..
Notification customNotification = new NotificationCompat.Builder(context, CHANNEL_ID)
    .setSmallIcon(R.drawable.notification_icon)
    .setStyle(new NotificationCompat.DecoratedCustomViewStyle())
    .setCustomContentView(remoteViews)
    .build();

При нажатии кнопки закрытия оно будет перенаправлено на класс обслуживания:

public class CloseNotificationService extends IntentService {

        /**
         * Creates an IntentService.  Invoked by your subclass's constructor.
         */
        public CloseNotificationService() {
            super("notificationIntentService");
        }

        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            switch (intent.getAction()) {

                case "close":
                    Handler hangUpHandler = new Handler(Looper.getMainLooper());
                    hangUpHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            NotificationManager notifManager = 
                                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
                            notifManager.cancel(notificationId); // get notification id from intent.
                        }
                    });
                    break;
            }
        }
    }

Для получения дополнительной информации о RemoteViews вы можете обратиться на официальный веб-сайт разработчика Google https://developer.android.com/training/notify-user/custom-notification

0 голосов
/ 21 июня 2019

Вместо этого:

Intent resultIntent = new Intent(this, MainActivity.class);

сделайте это:

Intent resultIntent = getPackageManager().getLaunchIntentForPackage("your.package.name");

и вставьте это в свой Notification.Это запустит приложение, если оно еще не запущено, в противном случае оно просто выведет задачу приложения на передний план в том состоянии, в котором оно было, когда пользователь последний раз использовал его.Если пользователь уже находится в приложении (то есть: на другом экране), это ничего не изменит, когда пользователь нажмет кнопку Notification.

. Это должно быть именно то, что вы ищете.

0 голосов
/ 20 июня 2019

Не уверен насчет уведомления об отклонении при нажатии, но поскольку ваша проблема связана с неправильной навигацией.

Мы можем проверить, находится ли приложение на переднем плане или нет, и запретить открывать новые действия с помощью щелчка уведомлений, если приложение на переднем плане..

//If app is in foreground setting pending intent to null
PendingIntent pendingIntent;
        Intent notificationIntent = new Intent(getApplicationContext(), Main2Activity.class);

        if(isAppInForeground()){
            Log.e("--^","inForeground");
            pendingIntent = null;
        }else{
            Log.e("--^","inBackground");
            notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        }

Добавить эту функцию (ИСТОЧНИК: ссылка )

private boolean isAppInForeground() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> services = activityManager.getRunningAppProcesses();
        boolean isActivityFound = false;

        if (services.get(0).processName
                .equalsIgnoreCase(getPackageName()) && services.get(0).importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            isActivityFound = true;
        }

        return isActivityFound;
    }

В этом случае, если уведомление пришло, когда приложение находится на переднем плане, оно ничего не будет делать, еслищелкнул.Таким образом, у пользователя есть только один вариант, чтобы провести его, чтобы удалить.

0 голосов
/ 20 июня 2019

В своей деятельности по запуску вы пробовали использовать метод менеджера уведомлений класса cancelAll () ??Таким образом, если уведомление о запуске уже есть, оно будет автоматически отменено

...