Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

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

#android


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

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

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


Ответы

Ответ 1



Всё намного проще, чем пишут другие. Когда вы создаёте 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 }

Ответ 2



Обычно, приложение получает уведомление через 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: Выполнить "необходимые действия" } } При этом когда пользователь открывает программу через уведомление, то этот код так же будет выполнен. Удачи!

Ответ 3



Мне кажется вот эта ссылка может помочь. Там пишется о том, что нужно зарегистрировать правильно GcmIntentServiце, который будет получать сообщение, даже если ваше приложение выключено. Также даются ссылки на Set up a GCM Client App on Android и Google Cloud Messaging

Ответ 4



Вобщем всем спасибо за ответы. Ближе всех был @pepyakin Так как я юзаю БД у себя в проекте я сделал так. когда получаю нотификацию, то в своем сервисе делаю просто public void broadcast(String messageType, final Bundle message) { if (!ScanActivity.ACTIVITY_STATUS) { new NotificationStorage() .setTicker("Receipt") .setTitle("Receipt") .setBundle(message) .setMessage(message.getString("receipt_id")).generateNotification(this); ReceiptQueue receiptQueue = new ReceiptQueue(); receiptQueue.setReceptId(message.getString("receipt_id")); ReceiptQueueDao.save(receiptQueue); } if (ScanActivity.ACTIVITY_STATUS) { Observer.getInstance().send(MessageType.RECEIPT_SHOW, message); } } тоесть тут моя проверка небольшая (открыто ли уже активити или нет). если открыто - я шлю обсервером нужное мне. если закрыто, то сохраняю данные нужные мне в БД. Дале два пути: 1. юзер тыкает на нотификацию 2. Юзер открывает через лаунчер В любом случае открывается активити, в котором я достаю данные из БД и если там чтото есть, делаю то что мне нужно. После этого очищаю табличку с этим данными. ВСЕ!)))

Ответ 5



Вообще штатными средствами для всех версий Android'а это сделать невозможно, остаются только хаки. Проблема в том, что к сервису управления нотификациями нет доступа штатными средствами. Есть хак, через AccessibilityService, описан здесь, но проблема с ним, в том, что юзер должен сначала включить в телефоне этот сервис - то есть гарантии что это будет работать нет. Второй вариант использование NotificationListener, но с ним проблема, что работает только для версии Android >= 4.3 Дальше остаются нудные варианты, если вы сами размещаете нотификацию, то можно в момент размещения нотификации где-то что-то сохранять, правда при этом совершенно неясно как убивать сохраненный флаг, когда юзер сам убьет нотификацию. А если не сами размещаете нотификацию, то тогда только хардкор типа вешать сервис, который просматривает список активных задач смотреть сервис нотификации, выискивать среди них свою нотификацию и все такое прочее.

Комментариев нет:

Отправить комментарий