как определить при старте приложения что получена нотификация?

Рейтинг: 3Ответов: 3Опубликовано: 17.04.2015

У меня есть нотификации (уведомления) которые приходят от GCM. Даже если моя программа закрыта, я кликаю на нотификашку и открываю прогу. В ней чищу кое-какие данные в бд, и показываю кое-что на экране.

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

Как мне определить при запуске программы, выводились уведомления или нет, если да, то каким образом?

Ответы

▲ 3

Всё намного проще, чем пишут другие. Когда вы создаёте Notification, вы передаёте ему Intent, который содержит информацию о том, какую Activity запустить при клике на Notification.

Intent notificationIntent = new Intent(context, HomeActivity.class); // по клику на уведомлении откроется `HomeActivity`

Так вот, достаточно просто добавить в этот Intent какие-нибудь данные о том, что это запуск из Notification, например так:

notificationIntent.putExtra("isStartedFromNotification", true);

Чтобы проверить это значение, делаем так:
В onCreate() у HomeActivity добавляем

if (getIntent().getBooleanExtra("isStartedFromNotification", false)) {
    //делаем, что надо в случае открытия из Notification
} else {
    //делаем, что надо в случае открытия НЕ из Notification
}
▲ 1

Мне кажется вот эта ссылка может помочь.

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

Также даются ссылки на Set up a GCM Client App on Android и Google Cloud Messaging

▲ 1

Обычно, приложение получает уведомление через BroadcastReceiver. Можно из этого ресивера инициировать запись некой настройки.

void onReceive(Context context, Intent intent) {
    context.getSharedPreferences("gcm", Context.MODE_PRIVATE)
      .edit()
      .putBoolean("notification_pending", true)
      .apply();
    // Показать уведомление и тд.
}

Когда пользователь открывает программу "обычным способом", нужно проверить, есть ли запись о том что уведомление ждет

void onCreate(Bundle savedState) {
    SharedPreferences prefs = getSharedPreferences("gcm", Context.MODE_PRIVATE);
    boolean needToDoStuff = prefs.getBoolean("notification_pending", false);
    if (needToDoStuff) {
        prefs.edit().remove("notification_pending").apply();
        // TODO: Выполнить "необходимые действия"
    }
}

При этом когда пользователь открывает программу через уведомление, то этот код так же будет выполнен. Удачи!