Android - открывать приложение из уведомлений, когда в приложении загружаются дополнительные функции, а из фона - нет - PullRequest
0 голосов
/ 05 апреля 2019

Моя цель


Я создаю приложение, используя скрипт 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.");
}

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

...