Я работаю над внедрением 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, поэтому оно было полезно в этом отношении.