нажатие на уведомление не открывает новую активность, когда открыта ее целевая активность

У меня есть две активности MainActivity и ReceivedMessageActivity. и фоновый сервис для получения из него контекста и передачи в SMSReceiver, который расширяет BroadcastReceiver для получения sms. и когда получено смс, SMSReceiver создает уведомление. Я хочу, чтобы, когда я щелкнул уведомление, если приложение не запущено, было открыто ReceivedMessageActivity, а когда приложение запущено и если ReceivedMessageActivity открыто, не создавайте новое действие намеренно и просто выдвигайте его на передний план ReceivedMessageActivity. Я установил для параметра launchMode в манифесте значение singleTop, для MainActivity работает, но для ReceivedMessageActivity не работает! Я установил флаг намерения уведомления на FLAG_ACTIVITY_BROUGHT_TO_FRONT|Intent.FLAG_ACTIVITY_SINGLE_TOP и FLAG_ACTIVITY_CLEAR_TOP, но это не работает. Я установил манифест launchMode для ReceivedMessageActivity в singleInstance, чтобы он работал, но когда я запускаю ReceivedMessageActivity вручную, анимация по умолчанию не работает (анимация справа налево). это мой код для уведомления:

public void addNotifiction(String title, String message) {
    NotificationCompat.Builder builder = new     
    NotificationCompat.Builder(context);
    builder.setContentTitle(title);
    builder.setContentText(message);
    builder.setStyle(new 
    NotificationCompat.BigTextStyle().bigText(message));
    builder.setAutoCancel(true);
    builder.setDefaults(Notification.DEFAULT_ALL);
    builder.setSmallIcon(R.drawable.edit_icon);
    builder.setCategory(NotificationCompat.CATEGORY_MESSAGE);
    builder.setPriority(NotificationCompat.PRIORITY_MAX);

    Intent notifactionIntent = new Intent(context,     
    ReceivedMessagesActivity.class);
    notifactionIntent 
  .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
    TaskStackBuilder taskStackBuilder=TaskStackBuilder.create(context);
    taskStackBuilder.addNextIntentWithParentStack(notifictionIntent);
    PendingIntent contentPendingIntent= taskStackBuilder.getPendingIntent (0,PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentPendingIntent);
    NotificationManager manager = (NotificationManager) context.getSystemService (Context.NOTIFICATION_SERVICE);

    manager.notify(NOTIFICATION_ID++, builder.build());

}

и мой контекст - это контекст класса MyService:

Context context=MyService.context

EDIT: я обнаружил, что когда я использую android:parentActivityName=".MainActivity" в манифесте для ReceiveMessageActivity, это происходит, и когда я нажимаю в уведомлении, а ReceiveMessageActivity открывается, мое приложение создает новое ReceiveMessageActivity, почему?


person mostafa3dmax    schedule 12.03.2018    source источник
comment
попробуйте использовать implcit intent с ожидающим намерением, когда приложение находится в фоновом режиме!   -  person Santanu Sur    schedule 12.03.2018
comment
как нам понять намерение?   -  person mostafa3dmax    schedule 12.03.2018
comment
намерение инициализировано с помощью intent-filter, данного активности PS idk, что такое TaskStackBuilder   -  person Santanu Sur    schedule 12.03.2018


Ответы (1)


Надеюсь, вам поможет Basic Skeleton of Notification maker из одного из моих приложений:

Context context = getApplicationContext();
String title = context.getString(R.string.title);
String subtitle = context.getString(R.string.subtitle);

Notification.Builder notificationBuilder = null;
//        Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

Intent intent = new Intent(getBaseContext(), ReceivedMessageActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |Intent.FLAG_ACTIVITY_SINGLE_TOP);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

    notificationBuilder = new Notification.Builder(
            context,
            CHANNEL_ID)
    ) //
            .setContentTitle(title)
            .setContentText(subtitle)
            .setSmallIcon(R.drawable.icon)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
            .setContentIntent(
                    PendingIntent.getActivity(
                            getBaseContext(),
                            0,
                            intent,
                            0
                    )
            )
            .setAutoCancel(true);

} else {
    notificationBuilder = new Notification.Builder(context) //
            .setContentTitle(title)
            .setContentText(subtitle)
            .setSmallIcon(R.drawable.icon)
            .setColor(ContextCompat.getColor(context, R.color.colorPrimary))
            .setContentIntent(
                    PendingIntent.getActivity(
                            getBaseContext(),
                            0,
                            intent,
                            0
                    )
            )
            .setAutoCancel(true);
}
startForeground(NOTIFICATION_ID, notificationBuilder.build());// only in case you are in service

Следующий код не тестировался

person Zulqurnain Jutt    schedule 12.03.2018
comment
это не мой ответ, я хочу, если действие открыто, когда я нажимаю на уведомление, не создавайте новое такое же действие - person mostafa3dmax; 12.03.2018
comment
этот код выполняет ту же задачу, что и я, я уже использую этот код - person Zulqurnain Jutt; 12.03.2018
comment
прочитайте мой отредактированный пост. у вас есть идея об этом? а что такое startForeground? startForeground у меня не работает - person mostafa3dmax; 12.03.2018