Android: как избежать, чтобы нажатие на Уведомление вызывало onCreate()

В моем приложении я уведомляю пользователя уведомлениями, если происходит что-то особенное:

public void triggerNotification(String msg) {
        notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Intent contentIntent = new Intent(this, ABC.class);
        Notification notification = new Notification(R.drawable.icon, msg, System.currentTimeMillis());
        notification.setLatestEventInfo(this, "ABC", msg, PendingIntent.getActivity(this.getBaseContext(), 0, contentIntent, PendingIntent.FLAG_CANCEL_CURRENT));
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        notificationManager.notify(notificationCounter, notification);
        notificationCounter++;
}

Если пользователь нажимает на уведомление, вызывается метод onCreate(). Но я хочу, чтобы в моем приложении вызывался определенный метод, или, если приложение не на переднем плане, чтобы он возвращался на передний план.

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

3 ответа

Решение

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

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

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

Рекомендация использовать FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_SINGLE_TOP только частично решает проблему. Для действия в манифесте Android также должны быть применены эти настройки, чтобы запуск действия с домашнего экрана выполнялся аналогично. Без этих свойств можно запустить несколько экземпляров действия.

<activity android:name="foo"
          android:clearTaskOnLaunch="true"
          android:launchMode="singleTop"
          android:label="@string/app_name">

Я обнаружил, что если вы используете Intent contentIntent = new Intent(this, ABC.class); это звонки onCreate(); независимо от установленных флагов.

использование Intent contentIntent = getIntent(); Пропустить onCreate(); и это движется к onStart();

Другие вопросы по тегам