Проблемы с настройкой флагов Intent, PendingIntent при реализации уведомлений - PullRequest
0 голосов
/ 26 июня 2019

Я работаю над внедрением push-уведомлений в базу кода SDK, которая реализует функцию обмена сообщениями между инфраструктурой нашей компании и приложением, в которое интегрирован SDK.Вся функциональность заключена в серию фрагментов, которые обмениваются родительской активностью, выполняемой клиентом.

Используя приложение testbench, в которое я интегрирую SDK, я могугенерировать фактические push-уведомления для пользовательского интерфейса, когда это необходимо, но я не могу использовать метод OnNewIntent при вызове уведомления.

Используя класс шаблонных уведомлений, предоставляемый Android Studio для создания уведомлений, я немного изменил способ создания Intent и PendingIntent, лежащих в основе уведомления.

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

    public static<T> void initNotifications(Class<T> activityClass,Context context){
            clientIntent = new Intent(context,activityClass);
            clientIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            clientIntent.putExtra("someData","This is some extras");
            clientContext = context;
        }

clientIntent и clientContext являются статическими членами в классе уведомлений.Каждый раз, когда вызывается метод notify, я создаю новый PendingIntent:

private static PendingIntent createPendingIntent(Context c, int requestCode){
    PendingIntent pendingIntent = 
 PendingIntent.getBroadcast(c,requestCode,clientIntent,PendingIntent.FLAG_UPDATE_CURRENT);
            return pendingIntent;
}

Класс, который вызывается при каждом создании уведомления (в комплект не входит набор шаблонного кода для создания каналов и т. Д.):

public class NotificationHelper {
    private static final String NOTIFICATION_TAG = "NewMessage";
    private static NotificationChannel notifChannel = null;
    private static int requestCode = 100;
    private static Intent clientIntent = null;
    private static Context clientContext = null;

    public static void notify(final Context context, final String notificationTitle, final String notificationMessage) {

        if (clientIntent == null){
            throw new RuntimeException("Notifications haven't been enabled. Call NotificationHelper.initNotifications to initialize them");
        }

        if (context == null){
            RuntimeException t = new RuntimeException("Null context when trying to post notification");
            t.printStackTrace();
            t.getCause();
            throw t;
        }

        requestCode+=1;

        PendingIntent newPendingIntent = createPendingIntent(clientContext,requestCode);
        final NotificationCompat.Builder builder = new NotificationCompat.Builder(context,channelId)

                // Set appropriate defaults for the notification light, sound,
                // and vibration.
                .setDefaults(Notification.DEFAULT_ALL)

                // Set required fields, including the small icon, the
                // notification title, and text.
                .setSmallIcon(R.drawable.ic_stat_new_message)
//                .setContentTitle(context.getResources().getString(R.string.action_reply))
                .setContentTitle(title)
                .setContentText(text)

                // All fields below this line are optional.

                // Use a default priority (recognized on devices running Android
                // 4.1 or later)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)

                // Provide a large icon, shown with the notification in the
                // notification drawer on devices running Android 3.0 or later.
                .setLargeIcon(picture)

                // Set ticker text (preview) information for this notification.
                .setTicker(ticker)

                // Show a number. This is useful when stacking notifications of
                // a single type.
//                .setNumber(number)

                .setContentIntent(newPendingIntent)

                // Show expanded text content on devices running Android 4.1 or


                // Automatically dismiss the notification when it is touched.
                .setAutoCancel(true);

        notify(clientContext, builder.build());
    }
}

Проверяя код, я обнаружил, что могу генерировать уведомление в пользовательском интерфейсе, однако при нажатии на него я не обращаюсь к методу OnNewIntent, который я создал в действии, которое должно бытьвозобновлено.Мои вопросы:

  • Правильно ли установлены флаги, которые я установил в инициализациях Intent и PendingIntent, относительно моей цели замены уведомлений по мере их поступления?

  • Могу ли я иметь отдельный статический экземпляр Intent, который повторно используется для каждого уведомления?

  • Уместно ли использовать два разных экземпляра контекста?Я сохранил тот, который был передан из initNotifications, потому что я думал, что все сущности уведомлений должны использовать один и тот же экземпляр контекста при создании.

РЕДАКТИРОВАТЬ: мой вопрос отличается от его предполагаемого duplicate , поскольку в описываемой им ситуации они могут напрямую передавать класс, к которому PendingIntent будет возвращаться при выборе уведомления.В моем случае я не могу этого сделать и пытаюсь найти решения для передачи ссылки другими способами (т. Е. Создание статически объявленного намерения, созданного до того, как уведомления будут отправлены).Однако я заметил, что в моем Манифесте отсутствует соответствующее объявление launchMode, поэтому оно было полезно в этом отношении.

...