Хобрук: Ваш путь к мастерству в программировании

настроить уведомление BigTextStyle с помощью ParsePushBroadcastReceiver

Я пытаюсь переопределить метод getNotification() класса Parse ParsePushBroadcastReceiver, чтобы отобразить уведомление BigTextStyle с двумя кнопками действий внизу. Примерно так: http://developer.android.com/design/media/notifications_pattern_two_actions.png

Согласно руководству по push-уведомлениям Parse, это все, что мне нужно сделать:

Вот мой код:

public class NotificationReceiver extends ParsePushBroadcastReceiver {

private static final String LOG_TAG = NotificationReceiver.class.getSimpleName();

@Override
protected Notification getNotification(Context context, Intent intent) {
    Log.v(LOG_TAG, "getNotification called");
    Bundle extras = intent.getExtras();
    String jsonData = extras.getString("com.parse.Data");
    String url = "";
    String objectId = null;
    String title = "";
    String alertMsg = "";

    if (jsonData != null){
        try {
            JSONObject data = new JSONObject(jsonData);
            objectId = data.getString("objectId");
        }
        catch(JSONException e){
            Log.e(LOG_TAG, "Error parsing json data", e);
        }
    }
    else{
        Log.w(LOG_TAG, "cannot find notification data");
    }

    Log.v(LOG_TAG, "notification for item with id=" + objectId);

    BucketListItem item = BucketListDao.getInstance().findById(objectId);
    title = "Get ready!";
    alertMsg = item.getSummary() + "\n" + item.getLocation() + "\n" + item.getStartTime();

    Intent detailsIntent = new Intent("com.parse.push.intent.OPEN", Uri.parse(url));
    PendingIntent piDetails = PendingIntent.getService(context, 0, detailsIntent, 0);

    Intent snoozeIntent = new Intent(context, BucketListActivity.class);
    snoozeIntent.setAction("com.stubhublabs.dopamine.SNOOZE");
    PendingIntent piSnooze = PendingIntent.getService(context, 0, snoozeIntent, 0);

    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle(title)
                    .setContentText(alertMsg)
                    .setContentIntent(piDetails)
                    .setDefaults(Notification.DEFAULT_ALL) // requires VIBRATE permission
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(alertMsg))
                    .addAction (R.drawable.ic_stat_snooze,
                            context.getString(R.string.notification_snooze), piSnooze)
                    .addAction (R.drawable.ic_stat_details,
                            context.getString(R.string.notification_details), piDetails);

        return builder.build();
    }

    @Override
    protected void onPushOpen(Context context, Intent intent) {
        Log.v(LOG_TAG, "onPushOpen called");

        Intent i = new Intent(context, BucketListActivity.class);
        i.putExtras(intent.getExtras());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }

    @Override
    protected Class<? extends Activity> getActivity(Context context, Intent intent) {
        Log.v(LOG_TAG, "getActivity called");
        return super.getActivity(context, intent);
    }

    @Override
    protected void onPushReceive(Context context, Intent intent) {
        Log.v(LOG_TAG, "onPushReceive called");
        super.onPushReceive(context, intent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.v(LOG_TAG, "onReceive Called");
        super.onReceive(context, intent);
    }
}

Уведомление BigTextStyle действительно появляется. Но нажатие на уведомление или кнопки действий ничего не делает. И, как показывает журнал, onPushOpen никогда не вызывался:

10-08 15:03:28.776    4021-4021/ V/NotificationReceiver﹕ onReceive Called
10-08 15:03:28.776    4021-4021/ V/NotificationReceiver﹕ onPushReceive called
10-08 15:03:28.776    4021-4021/ V/NotificationReceiver﹕ getNotification called
10-08 15:03:28.776    4021-4021/ V/NotificationReceiver﹕ notification for item with id=yyw00Lh5Ce

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

Я не могу найти учебник или пример расширения ParsePushBroadcastReceiver для получения настраиваемого уведомления. Я что-то упустил?


Ответы:


1

Вы устанавливаете намерение контента:

Intent detailsIntent = new Intent("com.parse.push.intent.OPEN", Uri.parse(url));
PendingIntent piDetails = PendingIntent.getService(context, 0, detailsIntent, 0);

Это намерение, которое вызывается при нажатии на ваше уведомление. Однако ParsePushBroadcastReceiver это BroadcastReceiver. Если вы хотите повторно использовать инфраструктуру, предоставляемую Parse, вам нужно использовать PendingIntent.getBroadcast(), а не PendingIntent.getService().

Конечно, вы можете просто использовать PendingIntent.getActivity() и использовать намерение, которое вы создали в onPushOpen(), и полностью обойти эту косвенность.

08.10.2014
  • getActivity() сделал свое дело! (getService почему-то не работал) Большое спасибо! 09.10.2014
  • хм... нажатие кнопки действия не удаляет уведомление из строки состояния. Теперь мне нужно выяснить, как получить идентификатор уведомления, чтобы отменить его. Не похоже, что ParsePushBroadcastReceiver предоставляет это.. :( 09.10.2014
  • Если вы имеете в виду, что нажатие на уведомление не очищает его, вы можете использовать setAutoCancel(). Если вы имеете в виду действия, то вы можете передать любые дополнения, которые хотите, к своему намерению (например, идентификатор) - просто убедитесь, что вы используете PendingIntent.FLAG_UPDATE_CURRENT вместо 0 в качестве последнего параметра для PendingIntent.getActivity()/PendingIntent.getService() или ваши дополнения не будут обновляться . 09.10.2014
  • Спасибо за ваш ответ. Я имел в виду случай действий. Проблема для меня заключалась в следующем: 1. Я использую Parse SDK для уведомления, поэтому у меня нет доступа к идентификатору возвращенного уведомления (по крайней мере, я не нашел способ получить к нему доступ) 2. Одно из моих действий на нажатие кнопки — это запуск браузера (вместо открытия моего приложения), поэтому у меня нет места для ввода кода для отмены/удаления уведомления из строки состояния. 11.10.2014
  • Я исчерпал лимит символов, поэтому мне нужно разбить его на два. продолжение комментария выше. Чтобы решить 1, я использовал NotificationManager.cancelAll(). Насколько я понимаю, он будет слепо отменять все уведомления, отправленные моим приложением, и меня это устраивает. Чтобы решить 2, мне пришлось создать прокси-активность и заставить кнопку действия запускать прокси-активность, которая ничего не делает, кроме 1. отменяет уведомление, 2 открывает браузер, 3 немедленно завершает работу. 11.10.2014
  • Новые материалы

    Пять вещей, о которых вы должны ДЕЙСТВИТЕЛЬНО побеспокоиться в связи с ИИ
    Несмотря на то, что циркулирует много неточной информации об ИИ, важно исправить частые заблуждения. Многие могут быть обеспокоены тем, что их в конечном итоге заменят роботом, или..

    Тестирование ответов на вопросы на основе BERT по статьям о коронавирусе
    Введение В настоящее время большая часть мира затронута пандемией COVID-19 . Для многих из нас это означало домашний карантин, социальное дистанцирование, перебои в рабочей среде. Я..

    Библиотеки PyTorch и Python для машинного обучения: приложения в здравоохранении с обнимающим лицом…
    В сфере машинного обучения Python выделяется благодаря своей универсальности и набору предлагаемых библиотек. Развитие машинного обучения в здравоохранении можно частично объяснить простотой и..

    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!
    «Что за…» очень хорошо представляет мое выражение лица после того, как я увидел это!

    5 вещей, которые я сделал, чтобы стать профессиональным разработчиком JavaScript
    Чтобы стать профессиональным JS-разработчиком: 1. Практикуйтесь в рутине, 2. Работайте над проектами, 3. Придерживайтесь одного языка, 4. Наблюдайте за чужим кодом, 5. Будьте последовательны..

    От теории к практике: пошаговое руководство по реализации наивного Байеса
    Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь..

    #093 | Моделирование вспышки эпидемии с помощью JavaScript — Часть 3
    TLDR: Я сделал симуляцию вспышки эпидемии, в которую можно поиграть здесь . Мой холст, моя сцена Мой HTML — это всего лишь один div с классом stage, и вот как я настроил на нем свой объект..