Метод триггера в действии при нажатии на уведомление

Мое приложение неоднократно загружает данные с сервера. Среди этих данных есть сообщения.
Всякий раз, когда загружаются новые сообщения, MainActivity вызывается в методе обратного вызова интерфейса onMessagesReceived (int numOfMessages).
Приложение имеет только одно действие, и каждый экран реализован как фрагмент. Переключение фрагментов управляется выделенным классом Навигатор.

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

public class MainActivity extends AppCompatActivity implements MessageListener {
    private static final int MESSAGE_NOTIFICATION_ID = 101010;
    private static final String EXTRA_SHOW_MESSAGES = "SHOW_MESSAGES";

    private Navigator mNavigator;

    @Override
    onMessagesReceived(int numOfMessages) {
        Intent intent = new Intent(this, MainActivity.class);
        testIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        testIntent.putExtra(EXTRA_SHOW_MESSAGES, true);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "testChannel")
                .setSmallIcon(R.drawable.ic_message_notification)
                .setContentTitle("New messages!")
                .setContentText("You got " + numOfMessages + " new messages")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(MESSAGE_NOTIFICATION_ID, builder.build());
    }

    @Override
    protected void onResume() {
        super.onResume();

        Bundle extras = getIntent().getExtras();
        if (extras != null && extras.containsKey(EXTRA_SHOW_MESSAGES)) {
            if (extras.getBoolean(EXTRA_SHOW_MESSAGES)) {
                mNavigator.openMessageList();
            }
        }
    }
}

На данный момент отображается MainActivity, когда приложение находится в фоновом режиме, но в onResume пакет возвращается как нулевой.
Когда приложение находится на переднем плане, вообще ничего не происходит.

Я хочу добиться щелчка по уведомлению:
- Когда пользователь находится внутри приложения, фрагмент MessageList должен быть открыт
- Когда пользователь не находится внутри приложения, его следует запустить до открытия фрагмента MessageList.

Может ли кто-нибудь дать мне подсказку, как действовать дальше? Может быть, использование намерений не является правильным решением здесь?

0
0
291
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы правы, но, в конце концов, не имеет значения, добавляю ли я логическое значение или строку в качестве дополнения. Пока я не могу получить дополнительную информацию в случае, если активность уже отображается, я не могу реагировать ни на одну из дополнительных функций.

EarlGrey 08.07.2019 09:40
Ответ принят как подходящий

Еще немного покопавшись в намерениях и уведомлениях, я наконец нашел решение.

public class MainActivity extends AppCompatActivity implements MessageListener {
    private static final int MESSAGE_NOTIFICATION_ID = 101010;
    private static final String EXTRA_SHOW_MESSAGES = "SHOW_MESSAGES";

    private Navigator mNavigator;

    @Override
    onMessagesReceived(int numOfMessages) {
        Intent intent = new Intent(this, MainActivity.class);
        testIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        testIntent.putExtra(EXTRA_SHOW_MESSAGES, true);

        PendingIntent pendingIntent = PendingIntent.getActivity(
            this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "testChannel")
                .setSmallIcon(R.drawable.ic_message_notification)
                .setContentTitle("New messages!")
                .setContentText("You got " + numOfMessages + " new messages")
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
        notificationManager.notify(MESSAGE_NOTIFICATION_ID, builder.build());
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        this.setIntent(intetnt)

        Bundle extras = intent.getExtras();
        if (extras != null && extras.containsKey(EXTRA_SHOW_MESSAGES)) {
            if (extras.getBoolean(EXTRA_SHOW_MESSAGES)) {
                mNavigator.openMessageList();
            }
        }
    }
}

Я переместил свой код, читая новый Intent, в onNewIntent. Этот метод вызывается, когда действие получает новое намерение и до onResume. Это срабатывает независимо от того, находится ли действие на переднем плане или нет. Я также установил это новое намерение как намерение действия с setIntent, в противном случае намерение, которое изначально запустило мое действие, вызывается получить намерение ().

Другие вопросы по теме