2015-03-05 4 views
0

Я могу создавать уведомления. В настоящее время, когда пользователь получает запрос друга, он говорит «Новый запрос друга от someUsername». Однако, если пользователь получает несколько запросов друг другу, я хочу обновить текст, чтобы сказать «Новые запросы друзей».Android обновляет уведомление и обнаруживает, когда он больше не существует

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

Моя идея состояла в том, чтобы создать HashMap, сопоставляя все идентификаторы, используемые в NotificationManager's notify(int id, Builder builder) объектам Builder.

При нажатии на уведомление уведомление исчезает (из-за моего использования setAutoCancel(true)), однако я не знаю, как это обнаружить, поэтому я могу удалить объект Builder из HashMap.

Причина, по которой я хочу удалить объект Builder, заключается в том, что когда метод HashMap возвращает null, я буду знать, что будет отображаться «Новый запрос друга от» вместо «Новые запросы друзей».

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

Замечание: Я планирую делать то же самое для сообщений и, возможно, других видов уведомлений.

В случае это необходимо, это моя функция, которая создает уведомления (идентификатор будет жёстко сейчас):

private void triggerNotification(String content, Context context) { 

    Log.i("Thread", "notification triggered"); 

    NotificationCompat.Builder builder = 
      new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.ic_launcher) 
      .setContentTitle("Anime Chatter") 
      .setContentText(content); 

    builder.setAutoCancel(true); 

    Intent i = new Intent(context, Friends.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, i, 0); 
    builder.setContentIntent(contentIntent); 

    NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 

    mNotificationManager.notify(1010, builder.build()); 
} 
+0

Вам не нужен такой же строитель объект, только тот же идентификатор, он заменит уведомление. – jvrodrigues

+0

@jvrodrigues Правильно, он будет «заменять» его, если я использую тот же ID. Но тогда как я знаю, чтобы установить текст в «Новый запрос друга от имени пользователя» и «Новые запросы друзей»? Мне нужен способ узнать, существует ли уведомление с идентификатором или нет. – Kacy

+0

Сохраняя состояние уведомления где-нибудь. –

ответ

1

Самый надежный способ пойти на это, чтобы создать специальную таблицу, чтобы иметь дело с уведомления.

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

Для более простого подхода просто добавить кода в вашей деятельности, когда касающийся намерения, отслеживающего последнее уведомление, которое было нажато постоянным образом (SharedPrefs?), чтобы любой диспетчер диспетчеризации уведомлений знал, должно ли быть видимо несколько уведомлений (например, если пользователь отклоняет уведомление не нажимая на него, есть еще несколько запросов о другом, о которых он не знает). Этот контроллер также должен отслеживать последнее отправленное уведомление (SharedPrefs снова). Таким образом, когда диспетчер отправляет уведомление, он может сравнить последнее отправленное и последнее нажатие и посмотреть, есть ли только один или несколько.

Кажется довольно прямолинейным для меня. Может помочь вам с кодом при необходимости.

+0

Как узнать идентификатор последнего нажатого уведомления? Я просто понял, что я могу добавить идентификатор уведомления в качестве дополнительного для намерения, но я думаю, что этот подход не является самым большим, поскольку каждое действие, на которое я перехожу от нажатия на уведомление, должно иметь дело с вызовом некоторой функции в моем классе уведомлений для удаления Builder из hashmap. Это вы имели в виду? – Kacy

+0

Вам больше не понадобится хэшмап. Просто добавьте уникальное дополнение в намерение, например имя друга или идентификатор друга (вы можете добавить дополнительное поле к вашему методу triggerNotification с любым уникальным идентификатором, который вы хотите) и сохранить этот идентификатор onNewIntent - таким образом вы знаете, если он был нажат или нет. Также важно хранить последний отправленный при каждом уведомлении, поэтому вы можете сравнить последнее отправленное и последнее нажатие. – jvrodrigues

+0

На данный момент у вас есть выдержка. Подождите немного, чтобы увидеть, есть ли лучший способ сделать это. – Kacy

1

Что вы ищете - Notification.Builder # setDeleteIntent (PendingIntent).

Ожидаемое намерение, которое вы установили здесь (вы должны обернуть трансляцию), будет запущено, когда уведомление будет отменено пользователем. Вы можете отвечать на широковещательную рассылку и обновлять постоянное хранилище (db, shared prefs и т. Д.), Где вы отслеживаете активные уведомления, чтобы определить, что вы должны показывать, когда приходит следующий.

Смежные вопросы