Метод запуска в действии при нажатии на уведомление - PullRequest
0 голосов
/ 05 июля 2019

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

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

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 Bundle возвращается как null .
Когда приложение находится на переднем плане, ничего не происходит вообще.

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

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

После еще нескольких копаний в «Интентах и ​​уведомлениях» я наконец-то нашел решение.

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();
            }
        }
    }
}

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

0 голосов
/ 05 июля 2019

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

...