Моя цель
Я создаю приложение, используя скрипт PHP для отправки уведомлений через firebase в приложение для Android. Конечная цель - включить пакеты данных в уведомление, чтобы при его открытии приложение могло считывать тип данных и показывать вам правильную информацию или страницу при открытии приложения.
У меня есть уведомления, работающие до точки их получения и отображения на телефоне в верхней панели, в центре уведомлений и в виде всплывающего окна в самом приложении. Если вы нажмете на уведомление, оно откроет намерение Initialize.class
запустить приложение.
Я хочу проверить, работает ли приложение в фоновом режиме, работает на переднем плане или просто не работает вообще. Когда это на заднем плане или на переднем плане. мы отправим пакетные данные через , а не перезагрузим все приложение (задачи входа в систему выполняются с целью инициализации).
Если приложение не запущено, мы запустим задачу входа в систему, а затем обработаем событие в уведомлении. Это довольно стандартный подход к уведомлениям во многих приложениях, которым я хотел бы следовать.
Что сейчас происходит?
В данный момент уведомления отображаются так, как они должны использовать NotificationCompat
и NotificationManager
, я опубликую код в следующем разделе, но поведение при открытии приложения не согласовано. В настоящее время я просто перезагружаю приложение каждый раз, когда нажимается уведомление, в то время как я пытаюсь получить данные для правильной передачи, но я изменю это позже. На данный момент, когда уведомление нажимается , когда приложение находится на переднем плане , оно успешно передает функцию intent.putExtra
в Initialize.class
. Когда запускается Initialize.class
, я запускаю проверку с помощью intent.hasExtra(CHECK_FOR_IT)
и распечатываю журнал в консоли, сообщая, был ли он успешным или нет. Когда приложение находится на переднем плане, оно проходит и говорит, что оно установлено. ТЕМ НЕ МЕНИЕ! Если я щелкаю уведомление, когда приложение находится в фоновом режиме ИЛИ вообще не работает, то оно говорит, что никакие данные не были переданы через, и что это не удалось. Упс!
Старый код
Сначала мы получаем данные из нашего MyFirebaseMessagingService
(расширяющего FirebaseMessagingService
), используя следующий фрагмент кода
public void onMessageReceived(RemoteMessage remoteMessage) {
if (remoteMessage.getData().size() > 0) {
Log.e(TAG, "The notification had a payload attached to it.");
}
if (remoteMessage.getNotification() != null) {
String title = remoteMessage.getNotification().getTitle();
String body = remoteMessage.getNotification().getBody();
MyNotificationManager.getInstance(getApplicationContext()).displayNotification(title, body);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NotificationChannel mNotificationChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
mNotificationChannel.setDescription(CHANNEL_DESCRIPTION);
mNotificationChannel.enableLights(true);
mNotificationChannel.setLightColor(Color.RED);
mNotificationChannel.enableVibration(true);
mNotificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
Objects.requireNonNull(mNotificationManager).createNotificationChannel(mNotificationChannel);
}
}
}
Затем мы передаем его в наш пользовательский класс NotificationManager. Мы добавляем Intent и добавляем к нему дополнительную строку с пользовательской строкой, а не данные из уведомления YET , просто чтобы убедиться, что строка встречается и не является нулевой вообще:
// Set the context here
private MyNotificationManager(Context context) {
mCtx = context;
}
void displayNotification(String title, String body) {
long[] pattern = {0, 300, 0};
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(mCtx, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_stat_notification)
.setContentTitle(title)
.setColor(Color.parseColor("#991e37"))
.setAutoCancel(true)
.setSound(alarmSound)
.setLights(Color.BLUE, 500, 500)
.setVibrate(pattern)
.setContentText(body)
.setChannelId(CHANNEL_ID);
Intent intent = new Intent(mCtx, Initialize.class);
intent.putExtra("NOTIFICATION_PACKET", "THIS IS NOTIFICATION DATA");
intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
PendingIntent pendingIntent = PendingIntent.getActivity(mCtx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT );
mBuilder.setContentIntent(pendingIntent);
NotificationManager mNotificationManager = (NotificationManager) mCtx.getSystemService(Context.NOTIFICATION_SERVICE);
if (mNotificationManager != null) {
Notification notification = mBuilder.build();
notification.sound = alarmSound;
notification.flags = Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL;
mNotificationManager.notify(1, notification);
}
}
Наконец, на Initialize.class
в методе onCreate
мы используем следующий фрагмент кода, чтобы проверить, существует ли дополнительный и выполняем ли отладку консоли.
Intent intent = getIntent();
if (intent.hasExtra("NOTIFICATION_PACKET")) {
Log.e(TAG, "The app was started from a notification, we can process the packet now.");
Log.e(TAG, getIntent().getStringExtra("NOTIFICATION_PACKET"));
} else {
Log.e(TAG, "There is no extra intent being passed on the NOTIFICATION_PACKET channel.");
}
И это соответствующий код для отображения уведомлений. В настоящее время, как я уже говорил выше, нажатие на уведомление, пока ваше приложение работает, как и должно, но запуск приложения из уведомлений или перенос из фона не работает. Я что-то упускаю здесь? Спасибо тебе.