Как автоматически открыть приложение при получении push-уведомления? - PullRequest
0 голосов
/ 16 мая 2018

Я хочу автоматически открывать приложение при получении push-уведомления. Я пытался, но все равно не работает, как я ожидал. Этот код ниже работает, когда приложение активно или находится в режиме MainActivity, но не работает, когда приложение работает в фоновом режиме или просто показывает уведомление в трее. Я что-то пропустил?

public class MyFirebaseMessagingService extends FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    if (remoteMessage.getNotification() != null) {
        if (PreferencesUtil.getInstance(this).isLoggedIn()) {
            sendNotification(remoteMessage.getData().get("order_id"));
        }
    }

}


public void sendNotification(String messageBody) {
    NotificationManager notificationManager = null;
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    NotificationCompat.Builder notificationBuilder;

    notificationBuilder = new NotificationCompat.Builder(this)
            .setContentTitle("Notification")
            .setSmallIcon(R.mipmap.icon_notif)
            .setContentText(messageBody)
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setDefaults(Notification.DEFAULT_LIGHTS );
    //add sound
    try {
        Uri sound = Uri.parse("android.resource://" + this.getPackageName() + "/" + R.raw.siren);
        Ringtone ringtone = RingtoneManager.getRingtone(this, sound);
        ringtone.play();
        notificationBuilder.setSound(sound);
    } catch (Exception e) {
        e.printStackTrace();
    }
    //vibrate
    long[] v = {1000, 1000, 1000, 1000, 1000};
    notificationBuilder.setVibrate(v);
    notificationManager.notify(0, notificationBuilder.build());

    Intent i = new Intent(this, NotificationActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
}
}

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Это что-то, что нужно обработать из бэкэнда,

Вот пример полезной нагрузки, которую вы используете прямо сейчас, { "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification":{ "title":"Portugal vs. Denmark", "body":"great match!" } } }

, которая даст вам контроль только для манипулирования и выполнения некоторых действий.когда ваше приложение будет на переднем плане, в противном случае просто отправьте уведомление.

Подробно вы можете проверить здесь .

Теперь, чтобы всегда получить контроль над вашим уведомлением, вам нужна полезная нагрузкакак показано ниже,

{ "message":{ "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "data":{ "Nick" : "Mario", "body" : "great match!", "Room" : "PortugalVSDenmark" } } }

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

0 голосов
/ 16 мая 2018

Во-первых, понятие «приложение» в Android немного расширенное.

Приложение - технически процесс - может иметь несколько видов деятельности, услуг, поставщиков контента и / или слушателей вещания. Если хотя бы один из них запущен, приложение запущено и работает (процесс).

Итак, вам нужно определить, как вы хотите «запустить приложение».

Хорошо ... вот что вы можете попробовать:

  1. Создать намерение с action=MAIN и category=LAUNCHER
  2. Получить PackageManager из текущего контекста, используя context.getPackageManager
  3. packageManager.queryIntentActivity(<intent>, 0), где намерение имеет category=LAUNCHER, action=MAIN или packageManager.resolveActivity(<intent>, 0), чтобы получить первое действие с main / launcher
  4. Получите ActivityInfo вас интересует
  5. Из ActivityInfo получите packageName и имя
  6. Наконец, создайте другое намерение с помощью category=LAUNCHER, action=MAIN, componentName = new ComponentName(packageName, name) и setFlags (Intent.FLAG_ACTIVITY_NEW_TASK)
  7. Наконец, context.startActivity(newIntent)
0 голосов
/ 16 мая 2018
int requestID = (int) System.currentTimeMillis();
Intent notificationIntent = new Intent(getApplicationContext(), NotificationActivity.class);

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

PendingIntent contentIntent = PendingIntent.getActivity(this, requestID,notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

И добавить PendingIntent, как это

notificationBuilder = new NotificationCompat.Builder(this)
            .setContentTitle("Notification")
            .setSmallIcon(R.mipmap.icon_notif)
            .setContentText(messageBody)
            .setContentIntent(contentIntent);
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setDefaults(Notification.DEFAULT_LIGHTS );
...