Мое приложение неоднократно загружает данные с сервера. Среди этих данных есть сообщения.
Всякий раз, когда загружаются новые сообщения, 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.
Может ли кто-нибудь дать мне подсказку, как действовать дальше? Может быть, использование намерений не является правильным решением здесь?
Вы можете использовать намерения, просто добавьте некоторые логические дополнения в намерение и просто проверьте значение в основном действии, если это дополнительное значение истинно, а затем вызовите свой метод.
Еще немного покопавшись в намерениях и уведомлениях, я наконец нашел решение.
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, в противном случае намерение, которое изначально запустило мое действие, вызывается получить намерение ().
Вы правы, но, в конце концов, не имеет значения, добавляю ли я логическое значение или строку в качестве дополнения. Пока я не могу получить дополнительную информацию в случае, если активность уже отображается, я не могу реагировать ни на одну из дополнительных функций.