При использовании следующего кода:

public class MainActivity extends AppCompatActivity {
    private final static AtomicInteger notificationId = new AtomicInteger(0);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
        mBuilder.setSmallIcon(R.drawable.notif )
            .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
            .setContentTitle("Request Received")
            .setContentText("new Notif")
            .setAutoCancel(true)
            .setDefaults(DEFAULT_LIGHTS);
        mBuilder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_NO_CREATE));
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(notificationId.incrementAndGet(), mBuilder.build());
    }
}

Следующее поведение пользователя создает противоречивый подход к уведомлениям:

  1. Пользователь открывает приложение, появляется новое уведомление.
  2. Пользователь закрывает приложение.
  3. Пользователь нажимает на уведомление.
  4. Новое уведомление создано и приложение открыто.
  5. Пользователь щелкает уведомление (когда приложение открыто, если приложение закрыто, уведомление ведет себя как положено).
  6. Ничего не произошло. Видно следующее лог-сообщение: 02-28 14: 09: 15.966 840-2273 /? I / ActivityManager: START u0 {cmp = app.myapplication / .MainActivity} из uid 10093 из pid -1 на дисплее 0 02-28 14: 09: 15.966 840-2273 /? W / ActivityManager: startActivity вызывается из неактивного контекста; форсировать Intent.FLAG_ACTIVITY_NEW_TASK для: Intent {cmp = app.myapplication / .MainActivity}, что не имеет смысла, так как действие в настоящее время открыто.

Есть ли что-то в моем коде, что вызывает такое поведение? Ожидается ли такое поведение?

Кроме того, я хотел бы отметить, что следующий вариант использования дает ожидаемое поведение уведомления:

  1. Пользователь открывает приложение, появляется новое уведомление.
  2. Пользователь нажимает на уведомление.
  3. Создается новое уведомление и открывается MainActivity. -> перейти к шагу 2.

Это поведение очевидно на Android 5 и 6, но не было протестировано на Android 7.

0
Edward Jezisek 28 Фев 2017 в 19:21

2 ответа

Лучший ответ

Казалось, что проблема возникает из-за: «При использовании этого флага, если задача уже запущена для действия, которое вы сейчас запускаете, то новое действие не будет запущено; вместо этого текущая задача будет просто перенесена на передний план. экран с состоянием, в котором он был последним. " С уважением к "FLAG_ACTIVITY_NEW_TASK". Это привело к тому, что «текущая задача» была выведена на экран, когда она уже была активна.

0
Edward Jezisek 6 Мар 2017 в 20:01

переместить код ниже в метод onResume ()

 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
        mBuilder.setSmallIcon(R.drawable.notif )
            .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
            .setContentTitle("Request Received")
            .setContentText("new Notif")
            .setAutoCancel(true)
            .setDefaults(DEFAULT_LIGHTS);
        mBuilder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_NO_CREATE));
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(notificationId.incrementAndGet(), mBuilder.build());
0
Pratik Dhingani 28 Фев 2017 в 16:52