Я занимаюсь разработкой библиотеки Android, которая использует FCM для получения уведомлений в фоновом режиме.После нажатия на уведомление пользователь должен быть перенаправлен на последнее открытое действие, а не на запуск.Для этого я использую флаг FLAG_ACTIVITY_NEW_TASK
, и приложение работает, как и ожидалось, в двух случаях: 1. если я создаю приложение напрямую через USB в Android Studio и 2. если я загружаю и устанавливаю .apk приложения,убить приложение, а затем перезапустить его.
Однако, если я устанавливаю приложение как .apk, я получаю следующее поведение:
1. Приложение открывается при операции запуска A.
2. Я перехожу к действию B и помещаю приложение в фоновый режим
3. Я получаю уведомление и нажимаю на него.Приложение открывается в действии A вместо действия B. Как и ожидалось.
Я не понимаю разницы между установкой приложения в виде apk и установкой его через usb.Есть ли какая-то разница в деятельности, которая заставляет FLAG_ACTIVITY_NEW_TASK
рассматривать ее как отдельную деятельность?Вот мой код:
Intent packageIntent = applicationContext.getPackageManager().getLaunchIntentForPackage(packageName);
String mainClassName = packageIntent.getComponent().getClassName();
Intent intent = new Intent(applicationContext, NotificationTapService.class);
(обратите внимание, что причина, по которой я устанавливаю промежуточное намерение, которое запускает службу для повторного открытия последнего действия, заключается в том, что служба также вызывает некоторые не связанные функции аналитики)
PendingIntent pendingIntent = PendingIntent.getService(applicationContext, requestCode, intent, PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(applicationContext, applicationContext.getString(R.string.channel_id))
.setSmallIcon(notificationResourceId)
.setContentTitle(messageTitle)
.setContentText(messageBody)
.setStyle(new NotificationCompat.BigTextStyle()
.bigText(messageBody))
.setSound(defaultSoundUri)
.setVibrate(new long[] {1000, 1000, 1000, 1000, 1000})
.setLights(Color.BLUE, 3000, 3000)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_MAX);
NotificationManager notificationManager = (NotificationManager) applicationContext.getSystemService(applicationContext.NOTIFICATION_SERVICE);
notificationManager.notify(messageId, notificationBuilder.build());
(настройка намерения повторно открыть действие в верхней части заднего стека) (из NotificationTapService)
Intent activityIntent = new Intent(applicationContext, Class.forName(intent.getExtras().getString(CLASS_NAME)));
activityIntent.setAction(Intent.ACTION_MAIN);
activityIntent.addCategory(Intent.CATEGORY_LAUNCHER);
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(activityIntent);